Catch the error.Review the fix.
The SDK sends the error and its source. Claude writes the patch. You get a pull request.
Join the betaPrivate beta
bugsnack · prod · apilive · sample data
- 14:02:11.204captureTypeError: Cannot read properties of undefined (reading 'cart')
- 14:02:11.205frameat renderCheckout (api/checkout.ts:142:18)
- 14:02:11.206context10 source lines around checkout.ts:142 attached
- 14:02:11.390ingestPOST /api/errors 202 Accepted
- 14:02:12.018analyzeClaude reading stack trace + source…
- 14:02:31.772causeuser.cart read before cart loads on direct visit
- 14:02:44.105githubbranch bugsnack/fix-a3f9c21d pushed
- 14:02:45.630prPull request opened · 1 file changed, +3 −1
- 14:02:45.902emailDiff sent to you for review
Built onNode.jsTypeScriptExpressReactGitHubClaude
The problem
Users find the bug before you do.
- 01Silent failuresconsole.error lands in a log nobody tails.
- 02Bare stack tracesFrames, no code. You still have to find the file.
- 03Manual triageReproduce, read, patch, open the PR. Every time.
- 04Repeat regressionsSame error next sprint. Nobody wrote down why.
server.tsthe whole setup
import bugsnack from "bugsnack";
bugsnack.init({
serverUrl: process.env.BUGSNACK_URL,
apiKey: process.env.BUGSNACK_KEY,
});10
lines of source above and below each frame go with every error.
Read more →
Most error tools stop at the stack trace. BugSnack reads the source around the failing line, asks Claude for the root cause and a patch, then opens the pull request. You stay the reviewer.
How it works
Error in. Pull request out.
- SDK
01 · Install
init() with your server URL and key.
- Server
02 · Capture
Exceptions, rejections, console.error.
- Claude
03 · Analyze
Trace + source lines → root cause.
- GitHub
04 · Review
PR on bugsnack/fix-*, diff by email.
The output
The fix arrives as a diff.
Nothing merges without you.
fix: guard cart read before loadbugsnack/fix-a3f9c21d → main · sample
api/checkout.ts+3 −1
140 export function renderCheckout(user: User) { 141 const items =- 142 user.cart.items;+ 142 user.cart?.items ?? [];+ 143 if (!user.cart) await loadCart(user); 144 return items;
Review changesMerge stays with you
Features
What ships in the beta.
- Automatic capture
- Uncaught exceptions, unhandled rejections, console.error, capture().
- Source-aware analysis
- Reads the code around the failing frame, then asks Claude.
- React error boundary
- Drop-in BugSnackBoundary for render crashes.
- Email alerts
- SMTP notice when an error is analyzed or a PR opens.
- Self-hostable
- Your infrastructure, your Anthropic and GitHub keys.
Private beta
Get your first fix PR.
We onboard teams in small batches. Leave your email and we'll reach out.