Backend
Frontend
SDKs
Jan 2026 – Mar 2026
BugCatch is a full-stack error tracking and application monitoring platform - a developer tool in the category of Sentry, Datadog, and New Relic. I designed and built the entire system end to end: the backend API, the React dashboard, two SDK packages (JavaScript/TypeScript and Java 21), and a containerized infrastructure.
The core design challenge was building a high-throughput ingest pipeline that never blocks on the hot path, while still providing rich grouping, deduplication, and alerting logic in the background. Every architectural decision - from Redis caching to BullMQ queue concurrency - was made to keep the ingest endpoint fast regardless of load.
Errors are deduplicated by hashing errorType, message, filename, and line number. Same error from any user hits the same Issue record - no duplicates, no noise.
The ingest endpoint authenticates via Redis cache (never hits MySQL on the hot path), enqueues via BullMQ, and returns HTTP 200 immediately. All processing is async.
A global interceptor tracks every API route's response time. Slow API requests, slow DB queries, high CPU, and high memory each trigger cooldown-protected alert emails.
When a resolved issue receives a new event, it automatically re-opens with a regression email to the project owner. Ignored issues stay ignored - events still recorded.
A JS/TS SDK (ESM + CJS) ships auto-capture for errors, promise rejections, breadcrumbs, and navigation. A separate zero-dependency Java 21 SDK covers Spring Boot apps.
A weekly digest email (Fridays 12pm) summarizes project activity for all members. A monthly cron purges old events, stale issues, and API metric logs in safe batches.
Installed in the monitored application. Auto-captures errors and breadcrumbs, parses stack traces, attaches user context, and POSTs structured payloads to the ingest endpoint using a DSN copied from the dashboard.
The highest-traffic endpoint. Validates the SDK key via Redis cache (5-min TTL, MySQL fallback), generates a SHA256 fingerprint, enqueues the job, and returns 200 immediately - no waiting on DB writes.
BullMQ worker running at concurrency 5 with exponential-backoff retries. Gets or creates the Issue by fingerprint, handles regressions, creates the Event record, increments counters atomically, and tracks unique affected users in a Redis Set.
Built with NestJS 11 and TypeScript following a strict module-per-domain structure. Each feature (ingest, issues, events, analytics, source maps, metrics, admin) is a self-contained module with its own controller and service. Data lives in MySQL via TypeORM; all email is async through a BullMQ mail queue with Handlebars templates.
Auth uses JWT with 15-minute access tokens and 7-day refresh tokens, guarded by Passport. The API is documented with Swagger and fully containerized with Docker Compose (MySQL + Redis + API).
Built with React 19, Vite 6, and TypeScript. Components use shadcn/ui (Radix primitives) with Tailwind CSS and full dark/light mode via next-themes. Server state is managed by TanStack Query v5; auth state by Zustand persisted in localStorage.
The dashboard lets developers triage issues with filters by status, level, and search; inspect raw events with parsed stack traces and breadcrumbs; view event frequency histograms via Recharts; upload and manage source maps; and control project settings and team membership.
Backend
Frontend
SDKs