diff --git a/app/javascript/sentry.js b/app/javascript/sentry.js
new file mode 100644
index 00000000..0b5060dd
--- /dev/null
+++ b/app/javascript/sentry.js
@@ -0,0 +1,16 @@
+import * as Sentry from '@sentry/browser'
+
+const sentryDsn = document.querySelector('meta[name="sentry-dsn"]')?.getAttribute('content')
+
+if (sentryDsn) {
+ Sentry.init({
+ dsn: sentryDsn,
+ beforeSend (event) {
+ if (event.request.url.match(/\/[ds]\/\w+$/)) {
+ event.request.url = event.request.url.slice(0, -6)
+ }
+
+ return event
+ }
+ })
+}
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
index 9f7f527b..247b300b 100644
--- a/app/views/layouts/application.html.erb
+++ b/app/views/layouts/application.html.erb
@@ -5,7 +5,12 @@
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
- <%= javascript_pack_tag 'application', defer: true %>
+ <% if ENV['SENTRY_DSN'] %>
+
+ <%= javascript_pack_tag 'sentry', 'application', defer: true %>
+ <% else %>
+ <%= javascript_pack_tag 'application', defer: true %>
+ <% end %>
<%= stylesheet_pack_tag 'application', media: 'all' %>
<%= render 'shared/posthog' if ENV['POSTHOG_TOKEN'] %>
<%= render 'shared/plausible' if !signed_in? && ENV['PLAUSIBLE_DOMAIN'] %>
diff --git a/app/views/layouts/form.html.erb b/app/views/layouts/form.html.erb
index fa632377..a6d8a82b 100644
--- a/app/views/layouts/form.html.erb
+++ b/app/views/layouts/form.html.erb
@@ -5,7 +5,12 @@
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
- <%= javascript_pack_tag 'form', defer: true %>
+ <% if ENV['SENTRY_DSN'] %>
+
+ <%= javascript_pack_tag 'sentry', 'form', defer: true %>
+ <% else %>
+ <%= javascript_pack_tag 'form', defer: true %>
+ <% end %>
<%= stylesheet_pack_tag 'form', media: 'all' %>
<%= render 'shared/posthog' if ENV['POSTHOG_TOKEN'] %>
diff --git a/app/views/layouts/plain.html.erb b/app/views/layouts/plain.html.erb
index 937518ca..04fddc4f 100644
--- a/app/views/layouts/plain.html.erb
+++ b/app/views/layouts/plain.html.erb
@@ -5,7 +5,12 @@
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
- <%= javascript_pack_tag 'application', defer: true %>
+ <% if ENV['SENTRY_DSN'] %>
+
+ <%= javascript_pack_tag 'sentry', 'application', defer: true %>
+ <% else %>
+ <%= javascript_pack_tag 'application', defer: true %>
+ <% end %>
<%= stylesheet_pack_tag 'application', media: 'all' %>
<%= render 'shared/posthog' if ENV['POSTHOG_TOKEN'] %>
diff --git a/config/webpack/webpack.config.js b/config/webpack/webpack.config.js
index 6d97e17d..be0fe87a 100644
--- a/config/webpack/webpack.config.js
+++ b/config/webpack/webpack.config.js
@@ -12,6 +12,9 @@ const configs = generateWebpackConfig({
optimization: {
runtimeChunk: false,
splitChunks: {
+ chunks (chunk) {
+ return chunk.name !== 'sentry'
+ },
cacheGroups: {
default: false,
applicationVendors: {
diff --git a/package.json b/package.json
index 9dd56f64..9cb979ed 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,7 @@
"@github/catalyst": "^2.0.0-beta",
"@hotwired/turbo": "https://github.com/docusealco/turbo#main",
"@hotwired/turbo-rails": "^7.3.0",
+ "@sentry/browser": "^8.3.0",
"@tabler/icons-vue": "^2.47.0",
"autocompleter": "^9.1.0",
"autoprefixer": "^10.4.14",
diff --git a/yarn.lock b/yarn.lock
index 13f4d159..cd269942 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1125,6 +1125,77 @@
resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-7.0.4.tgz#70a3ca56809f7aaabb80af2f9c01ae51e1a8ed41"
integrity sha512-tz4oM+Zn9CYsvtyicsa/AwzKZKL+ITHWkhiu7x+xF77clh2b4Rm+s6xnOgY/sGDWoFWZmtKsE95hxBPkgQQNnQ==
+"@sentry-internal/browser-utils@8.3.0":
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/@sentry-internal/browser-utils/-/browser-utils-8.3.0.tgz#1c3e38541c9144ccf3adc25656a8658b6ecbb371"
+ integrity sha512-wsd62oBaUckCa8JcPkNvtoFm+Jb1neb0ydZ15fCjLG++BcLVfrhUak7a3CzNrtUbzP/yk+b5rtIv5lWpaScrbw==
+ dependencies:
+ "@sentry/core" "8.3.0"
+ "@sentry/types" "8.3.0"
+ "@sentry/utils" "8.3.0"
+
+"@sentry-internal/feedback@8.3.0":
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-8.3.0.tgz#38867fc6c562f54df0c592ff8ef52795ecb72ed6"
+ integrity sha512-sY9t0fEZ2VuQDptiHVi7K01FG+P5FaPAXzGqq8q/+JH5nZ1A8eJSYzPf0Ck0KlfDE0MFUTV/7CDaLYblox0e0A==
+ dependencies:
+ "@sentry/core" "8.3.0"
+ "@sentry/types" "8.3.0"
+ "@sentry/utils" "8.3.0"
+
+"@sentry-internal/replay-canvas@8.3.0":
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-8.3.0.tgz#982d443be685dd3da8dfd17bc0a215a479da8ae0"
+ integrity sha512-ZCbh2iVmFKi4q7BgXBpAGIPzKibIn8EYnjUvjH7SmAp2XEMO4qknxpfxJ8E+r7j7buKFZubCQp13ZX2mIOMnVg==
+ dependencies:
+ "@sentry-internal/replay" "8.3.0"
+ "@sentry/core" "8.3.0"
+ "@sentry/types" "8.3.0"
+ "@sentry/utils" "8.3.0"
+
+"@sentry-internal/replay@8.3.0":
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/@sentry-internal/replay/-/replay-8.3.0.tgz#fd1f6bea3fce1a20d85369ffa19f34dd31954428"
+ integrity sha512-PD/cTGB0vSMXbi0PlY1f/fGZhCnHIrBKPzMQR4l009lPYGKpp42ei0ZZXHANtIvKjXsQcKbJS2BP//HSVPJ34Q==
+ dependencies:
+ "@sentry-internal/browser-utils" "8.3.0"
+ "@sentry/core" "8.3.0"
+ "@sentry/types" "8.3.0"
+ "@sentry/utils" "8.3.0"
+
+"@sentry/browser@^8.3.0":
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-8.3.0.tgz#fd047fb4ddcabd0eb23e64b5597bad7d721d3378"
+ integrity sha512-086BOWKqfhkOjvix4jt/58Kmwxm5plJLzjx/PsLbLjyqQiKYWE0KIjIBwbQiCpWcIHyiAf6tyQLcSOwcwgCOpQ==
+ dependencies:
+ "@sentry-internal/browser-utils" "8.3.0"
+ "@sentry-internal/feedback" "8.3.0"
+ "@sentry-internal/replay" "8.3.0"
+ "@sentry-internal/replay-canvas" "8.3.0"
+ "@sentry/core" "8.3.0"
+ "@sentry/types" "8.3.0"
+ "@sentry/utils" "8.3.0"
+
+"@sentry/core@8.3.0":
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-8.3.0.tgz#beb91aeceb6be2a623773d7cabd6f8396c3f5926"
+ integrity sha512-X7r0WujE7DILtgA5zt4hmHMBTF3xbjJB7Dgrw1Hv5C7WG5qkNqhDPpnRX7WswtHcLSgVPY2GRTQ5Iid7i33zEQ==
+ dependencies:
+ "@sentry/types" "8.3.0"
+ "@sentry/utils" "8.3.0"
+
+"@sentry/types@8.3.0":
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-8.3.0.tgz#c5df6d5702a7e2483cf87e82df0cd82297c9c3d7"
+ integrity sha512-DbwRTdx5xn8c2EhElD1UneDbcfqz220INPJYiATGJ9pR+cV5kGohyxI6lJxebPdPhPLEFQqYdLXGA6Cjm/uC6A==
+
+"@sentry/utils@8.3.0":
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-8.3.0.tgz#c06f3a3ff40d8f8d1d8901a50d676c748575e66d"
+ integrity sha512-WFaUZy0OWsF6Mrjenxj4N8zGzA6+pdH2lCV60/IB+V5PvGPgl40MUyjN6aLA/E9BRpqwLNQRMroZjln+J/3aiA==
+ dependencies:
+ "@sentry/types" "8.3.0"
+
"@sinclair/typebox@^0.25.16":
version "0.25.24"
resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718"