Backend
Frontend
SDKs
Jan 2026 – Present
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.
HTTP checks every five minutes for URLs, plus heartbeat pings for background jobs - three retries before a URL is marked down, one missed ping before a job is.
Per-route p50/p75/p95/p99 latency, throughput, and error rate, so a slow tail hiding behind a healthy average doesn't stay hidden.
A page at your own slug showing the monitors you choose and any incident you post - no login required for the people who'd otherwise DM you.
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