loupfeedCrash & error tracking

The bugs nobody bothered to report.

For every user who writes to you, plenty just close the tab. loupfeed catches unhandled errors on their own, groups them by signature, resolves the stack back to your source, and attaches the session that led there — so the silent failures show up next to the reported ones, in the same inbox.

Web and React Native · V8, Hermes and JavaScriptCore stacks parsed · replay attached per occurrence.

Stacks

Your frames, not the framework's.

Errors are normalized into structured exceptions the moment they are caught. loupfeed parses both major stack dialects, marks which frames are yours, and anchors everything on the first one that is — so an issue is titled by your code, not by whatever library happened to be on the stack.

  • V8 and Hermes (at fn (file:line:col)) and JavaScriptCore or Safari (fn@file:line:col)
  • Frames inside node_modules and native or internal frames are marked out of app
  • React Native dev frames served from the Metro bundle are correctly treated as your code
  • The top in-app frame becomes the issue's culprit line — what you see under the title

Symbolication is a server-side join against the manifest and source maps for that release, so a minified production stack still lands on a real line in your repo.

// what the browser hands you TypeError: blob is not a function at downloadCsv (https://app/assets/index-4f2a.js:1:88213) at onExport (https://app/assets/index-4f2a.js:1:71902) // what lands in your inbox culprit src/pages/Checkout.tsx:54 ← in_app frame src/hooks/useExport.ts:22 ← in_app frame react-dom/index.js:1149 ← vendor
Grouping

One issue, however many times it happens.

A crash group is every event sharing a fingerprint — the error type plus the top in-app frame. Grouping is derived from the flat event list rather than stored as its own record, so it behaves identically whether you are on in-memory, SQLite or DynamoDB.

Unhandled
TypeError: blob is not a function
src/pages/Checkout.tsx:54
149 users
Handled
NetworkError: request timed out
src/api/client.ts:88
23164 users
Unhandled
RangeError: invalid array length
src/cart/totals.ts:17
32 users
  • Occurrence count and distinct impacted users, per group
  • A group is marked unhandled if any occurrence crashed the app — the worst case wins
  • First seen and last seen, with the release each was on
  • The same statuses as feedback: open, resolved, wontfix
  • Group ids are hashed to stay URL-safe, since fingerprints contain file paths
Context

Everything the report would have had.

An automatic crash carries the same envelope a human report does. That is the point of putting them in one platform — you are not switching tools to find out what happened.

The session replay

The rolling buffer is frozen and uploaded on the crash, so you watch the thing happen instead of reconstructing it.

The breadcrumb trail

Navigations, clicks and whatever you recorded yourself, in order, ending on the error.

Who it happened to

The identified user and your own context keys — plan, account, tenant, whatever you set.

// you already set this for feedback — crashes inherit it setUser({ id: 'u_42', email: 'mara@acme.com', plan: 'pro' }); setContext('account', { id: 'acme', seats: 50 }); setTag('checkout_variant', 'b'); addBreadcrumb({ category: 'ui.click', message: 'Export CSV' });

There is nothing extra to wire up. Unhandled errors and promise rejections are captured once you call init, and every scope value you already set for feedback rides along on the crash.

setUsersetContextsetTagaddBreadcrumbbeforeSend
With your own AI

Hand the whole issue to your agent.

Crashes are exposed over MCP the same way feedback is. Your agent lists the open groups, pulls one with its resolved frames, breadcrumbs and replay, fixes the code, and marks it resolved — without you copying a stack trace into a chat window.

list_crashesget_crashget_replayresolve_sourceset_feedback_status
# claude, with @loupfeed/mcp connected list_crashes → 3 open · top: TypeError ×14, 9 users get_crash → Checkout.tsx:54 · Safari 17 only get_replay → clicked Export ×3, no request fired …agent patches the Safari blob path… set_feedback_status → resolved
The rest of the platform

Crash tracking is one of four.

Stop finding out from a screenshot.

Free to self-host, forever. Same SDK you already installed for feedback — crashes just start arriving.