Skip to content

Commit 8f92bdc

Browse files
committed
feat(web): integrate GlitchTip error monitoring
Add @sentry/browser SDK for production error tracking via GlitchTip. Errors are only sent in production builds, with development mode logging to console. Common false positives (browser extensions, network errors) are filtered out.
1 parent f2c64e1 commit 8f92bdc

3 files changed

Lines changed: 159 additions & 28 deletions

File tree

apps/web/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"@remotion/media-utils": "^4.0.390",
1414
"@remotion/player": "^4.0.390",
1515
"@remotion/preload": "^4.0.390",
16+
"@sentry/browser": "^10.33.0",
1617
"@tanstack/react-query": "^5.84.0",
1718
"@tauri-apps/api": "^2.9.1",
1819
"@tauri-apps/plugin-fs": "^2",
@@ -88,6 +89,7 @@
8889
}
8990
},
9091
"scripts": {
92+
"dev": "vite",
9193
"start": "vite",
9294
"start:debug": "cross-env NODE_OPTIONS=\"--inspect --max-old-space-size=4096\" vite",
9395
"build": "cross-env NODE_OPTIONS=--max-old-space-size=2048 vite build",

apps/web/src/index.tsx

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,49 @@
11
import React from 'react';
22
import { createRoot } from 'react-dom/client';
3+
import * as Sentry from '@sentry/browser';
34
import './assets/styles/index.css';
4-
import './i18n';
5-
// Initialize shared API client before App mounts (side-effect import)
6-
import './components/utils/apiClient';
75
import App from './App';
6+
import { registerServiceWorker } from './utils/registerServiceWorker';
7+
8+
// Initialize GlitchTip error monitoring
9+
Sentry.init({
10+
dsn: 'https://3bfeac13e8e14018a06d8f7f770f46ca@app.glitchtip.com/19466',
11+
environment: import.meta.env.MODE,
12+
enabled: import.meta.env.PROD,
13+
beforeSend(event) {
14+
// Don't send events in development
15+
if (import.meta.env.DEV) {
16+
console.error('[GlitchTip] Error captured (dev mode):', event);
17+
return null;
18+
}
19+
return event;
20+
},
21+
ignoreErrors: [
22+
// Browser extension errors
23+
'ResizeObserver loop limit exceeded',
24+
'ResizeObserver loop completed with undelivered notifications',
25+
// Network errors that don't indicate code issues
26+
'NetworkError',
27+
'Failed to fetch',
28+
// Script loading errors (often from browser extensions)
29+
/Loading chunk [\d]+ failed/,
30+
],
31+
});
832

933
const root = createRoot(document.getElementById('root'));
1034
root.render(
1135
// <React.StrictMode>
1236
<App />
1337
// </React.StrictMode>
1438
);
39+
40+
// Register Service Worker for illustration caching (production only)
41+
if ('serviceWorker' in navigator && import.meta.env.PROD) {
42+
registerServiceWorker().then(registration => {
43+
if (registration) {
44+
console.log('[App] Illustration cache service worker registered');
45+
}
46+
}).catch(err => {
47+
console.error('[App] Service Worker registration failed:', err);
48+
});
49+
}

0 commit comments

Comments
 (0)