A Chrome/Edge extension that provides intelligent incident triage directly on Sentry issue pages. Runs 100% locally in the browser — no backend, no external APIs, no cloud inference.
Stack Sift — Chrome Web Store — add the extension from the store (Chrome and other Chromium browsers that support the Web Store).
- Automatic classification of errors into 8 categories: timeout, database, auth, runtime, validation, integration, infra, unknown
- In-browser ML — trains and runs a neural network (TensorFlow.js MLP) entirely in the browser
- Adaptive learning — learns from your corrections via text-similarity kNN + retrainable MLP
- Actionable recommendations — pattern-matched suggestions specific to each error type
- Priority scoring based on error category, environment, and route sensitivity
- Open in editor — jump from Sentry to the exact source file in VS Code or Cursor
- Smart stack frame analysis — skips error handlers and boilerplate, shows all navigable in-app frames
- 64-feature extraction — error type, Node.js error codes, stack structure, architectural patterns, route/HTTP, breadcrumbs, infra context, text metrics
When you open a Sentry issue page, Stack Sift:
- Extracts error data from the DOM (title, stack trace, breadcrumbs, environment, tags)
- Builds 64 features from the extracted data
- Classifies the incident using a multi-layer pipeline:
- Heuristic classifier (regex/keyword patterns)
- TensorFlow.js MLP (trained in-browser with synthetic + user feedback data)
- Adaptive kNN classifier (learns from user corrections via cosine text similarity)
- Merge logic that combines all signals with confidence weighting
- Generates insights — summary, recommendations, priority, stack frames
- Renders a sidebar injected into the Sentry page
Stack Sift gets smarter as you use it:
- Exact match memory — corrections for identical errors are remembered with 100% confidence
- Text similarity — corrections influence similar errors via kNN with cosine similarity
- Retrain button — click to retrain the MLP with your accumulated feedback (takes ~2 seconds)
- All data stays local — feedback in
chrome.storage.local, model in IndexedDB
The classification model is a 3-layer MLP (64 → 32 → 16 → 8) that:
- Ships with 2400 synthetic training examples embedded in the bundle
- Can be trained/retrained entirely in the browser via TensorFlow.js
- Weights user feedback 3x more than synthetic data during retraining
- Persists the trained model in IndexedDB across sessions
npm install
npm run devLoad the extension in Chrome/Edge:
- Go to
chrome://extensions - Enable Developer mode
- Click Load unpacked
- Select the
build/chrome-mv3-devfolder
npm run buildnpm test
npm run test:watch| Technology | Purpose |
|---|---|
| Plasmo | Browser extension framework |
| React | Sidebar UI |
| TypeScript (strict) | Type safety across the project |
| TensorFlow.js | In-browser ML training and inference |
| Vitest + jsdom | Testing with DOM mocking |
src/
features/
dom/ # DOM extraction from Sentry pages
classification/ # Rule-based heuristic classifier
insights/ # Summary, recommendations, priority, useful frames
ml/
buildFeatures/ # 64-feature extraction from ParsedIncident
runInference/ # TF.js inference + mock fallback
tfModel/ # MLP architecture, training, prediction
retrain/ # In-browser retraining orchestration
modelLoader/ # Model loading from IndexedDB
data/ # Synthetic training data, feature keys
feedback/
storage/ # Feedback CRUD in chrome.storage.local
adaptiveClassifier/ # kNN classifier with text similarity
textSimilarity/ # Tokenization, TF vectors, cosine similarity
editor/ # Open-in-editor: frame parsing, path mapping, URIs
sentry/ # Orchestration + Sentry page detection
shared/
types/ # Shared TypeScript interfaces
components/
sidebar/ # Sidebar UI components
contents/ # Plasmo content script entry + CSS
Sentry DOM ──► Extractor ──► ParsedIncident
│
┌──────────────┼──────────────┐
▼ ▼ ▼
Heuristic TF.js MLP Adaptive kNN
Classifier (in-browser) (user feedback)
│ │ │
└──────┬───────┘───────────────┘
▼
Merge Classification
│
┌────────────┼────────────┐
▼ ▼ ▼
Summary Recommendations Priority
│ │ │
└────────────┼────────────┘
▼
Sidebar UI
┌─────┴─────┐
▼ ▼
Retrain btn Open in editor
| Category | Signals |
|---|---|
| timeout | etimedout, socket hang up, deadline exceeded, connect timeout |
| database | queryfailederror, prisma, duplicate key, deadlock, typeorm |
| auth | unauthorized, jwt expired, token invalid, forbidden, 403 |
| runtime | cannot read properties of undefined, typeerror, referenceerror |
| validation | zod, schema, invalid payload, class-validator, 400 |
| integration | econnrefused, fetch failed, 502, 503, bad gateway |
| infra | out of memory, enospc, sigkill, oom, enomem |
| unknown | No matching signals |
| Group | Count | Examples |
|---|---|---|
| Keyword booleans | 11 | hasTimeoutTerms, hasDatabaseTerms, isProduction |
| Error type | 6 | isTypeError, isRangeError, isCustomError |
| Node.js error codes | 8 | hasECONNREFUSED, hasENOENT, hasHTTPStatus5xx |
| Stack trace structural | 11 | stackDepth, appFrameRatio, hasORMInStack |
| Architectural patterns | 7 | hasControllerPattern, hasServicePattern |
| Route / HTTP | 6 | isGET, isPOST, isAPIRoute, routeSegmentCount |
| Breadcrumbs | 5 | breadcrumbCount, hasDBQueryBreadcrumbs |
| Context / infra | 6 | isDocker, isLambda, hasCloudProvider |
| Text metrics | 4 | titleWordCount, hasStackTrace, errorMessageLength |
Contributions are welcome! Feel free to open an issue or submit a pull request.
- Fork the repository
- Create your branch (
git checkout -b feature/my-feature) - Make your changes
- Run the tests (
npm test) - Commit (
git commit -m "Add my feature") - Push (
git push origin feature/my-feature) - Open a Pull Request
If you're unsure about something, open an issue first to discuss it.