Issue deduplication
SHA-256 fingerprinting groups identical errors. One crash repeated 4,000 times stays as one issue — not 4,000 duplicate tickets flooding your inbox.
BugCatch captures every unhandled exception, groups duplicates by fingerprint, and alerts you before anyone files a ticket. It runs entirely on your servers — not ours.
NestJS · MySQL · Redis · React · TypeScript
import BugCatch from 'bugcatch-sdk';
BugCatch.init({
dsn: import.meta.env.VITE_BUGCATCH_DSN,
release: import.meta.env.VITE_APP_VERSION,
environment: import.meta.env.MODE,
});
// Auto-captures all uncaught errors.
// Manual capture when you need it:
try {
await processOrder(orderId);
} catch (err) {
BugCatch.captureException(err, { orderId });
}
what it is
An alternative to Sentry, Datadog, and New Relic — without the monthly bill or the data dependency.
BugCatch is an open-source error tracking platform you deploy yourself. A lightweight JavaScript SDK captures exceptions, promise rejections, and custom events across browser and Node.js apps. Every error is fingerprinted, deduplicated, and surfaced in a real-time dashboard with full stack traces, breadcrumb trails, and user impact metrics.
Errors stay on your database. No third-party ingestion pipeline. No usage tiers. No seat limits.
event flow
Attaches to window.onerror and unhandledrejection. Parses stack traces. Records click, navigation, and console breadcrumbs automatically.
Your app gets HTTP 200 immediately. The event is pushed to a BullMQ worker queue — no blocking, no latency added to the user's request.
SHA-256 of error type + message + file:line. New fingerprint = new issue. Known fingerprint = counter increment. Same crash, one ticket.
Email sent for new issues and regressions (with cooldowns to prevent noise). Dashboard shows event histograms, affected users, and full context.
capabilities
SHA-256 fingerprinting groups identical errors. One crash repeated 4,000 times stays as one issue — not 4,000 duplicate tickets flooding your inbox.
New issue detected? Email goes out immediately. Resolved issue re-opened by a regression? You'll know that too. Smart per-project cooldowns prevent alert fatigue.
Clicks, navigation events, and console warnings are captured automatically in the 100 events leading up to a crash. Reproduce bugs without guessing.
Upload source maps per release version. Minified production stack traces resolve to the exact line and column in your original source code.
Track heap memory, CPU usage, and event loop lag from Node.js apps. Slow API requests and slow DB queries trigger separate alerts with independent cooldowns.
Configure HTTP monitors per project. Status tracked as UP, DOWN, or UNKNOWN — response times logged, alerts sent when monitors go down, cooldowns prevent repeat noise.
Every Friday at noon, a project summary lands in every member's inbox. Issue counts, trends, top errors — all without opening the dashboard.
integration
Ships as ESM + CJS. Works with any bundler — Vite, Webpack, Rollup, esbuild.
React / Vite — main.tsx
import BugCatch from 'bugcatch-sdk';
BugCatch.init({
dsn: import.meta.env.VITE_BUGCATCH_DSN,
release: import.meta.env.VITE_APP_VERSION,
environment: import.meta.env.MODE,
});
// Uncaught errors captured automatically.
// Attach user context after login:
BugCatch.setUser({ id: user.id, email: user.email });
BugCatch.setTag('plan', 'pro');
Node.js — Express error handler
import BugCatch from 'bugcatch-sdk';
BugCatch.init({
dsn: process.env.BUGCATCH_DSN,
release: process.env.npm_package_version,
environment: process.env.NODE_ENV,
autoCaptureBreadcrumbs: false, // no DOM
});
app.use((err, req, res, next) => {
BugCatch.captureException(err, {
path: req.path,
method: req.method,
});
next(err);
});
self-hosted
BugCatch runs on MySQL, Redis, and Node.js. A single Docker Compose file spins up the full stack — API server, background worker, and both databases included.
# Clone and start the full stack
git clone https://github.com/you/bugcatch
docker compose up --build
# Services
# API → http://localhost:3000
# Dashboard → http://localhost:5173
# Swagger → http://localhost:3000/api
# Configure once in .env
BUGCATCH_DSN=http://localhost:3000/ingest/{projectId}?key={sdkKey}