Avik Mukherjee
Breaks prod so you don’t have to.
Backend engineer · Go, Postgres, distributed systems · Hyderabad, India
I build systems that have to survive reality. Right now that is AI and security infrastructure at SuperAlign, from endpoint ingestion to the data layer underneath. On my own time I rebuild systems to understand them, then write down what broke.
Experience
Full résumé (PDF, opens a download)- Own the Go backend for Surface end to end: asset inventory, auth (RS256, OIDC), dashboard APIs and scanner policy distribution
- 10K assets/s idempotent ingestion as the fleet grew from 200 to 1,000+ devices
- 11s → 1.5s listing for the S3 and Splunk prompt extensions, built on a generic Parquet parser; now building cloud sync for Copilot Studio and Cursor Cloud Agents
- ~70GB in under 4 min: a memory-bounded DuckDB pipeline from firewall logs to report
- Infra: self-hosting on Coolify behind Cloudflare Tunnels, GitLab CI/CD pipelines, and the Jamf integration that connects Surface to MDM
- DataFoundry AITrainee Engineer2024 — 2025
Azure Data Factory pipelines, Python backend work, and frontend RBAC in React with Axios.
- DankMobile Developer Intern2023 — 2024
Built the complete React Native app and its API layer, following React Native best practices; page loads down 40%.
- Auctopus TechnologyFrontend Developer Intern2023
Frontend pages, forms with React Hook Form, and Cypress tests that halved manual testing.
Selected work
All projectsQueryGuardnewp99 8.1 → 3.5 msPostgres proxy that stops one tenant slowing down everyone else
- noisy tenant's reads
- innocent p99
The hard part. The scheduler was the easy part. The hard part was what a proxy must understand first: what Postgres means by the same query, transaction and cancel. The benchmark caught six scans passing one budget check at once, so checking and charging now share a lock.
Governorp95 553 → 27 msBudgets, leases and deadlines for task trees that fan out
- quiet tenant p95
- retries per call
- peak concurrency
The hard part. A charge must fit under the task, its tenant and the root, all or none. I kept the tree in memory behind one lock and commit every change before replying, so a restart replays exactly what callers were told.
Term Bridge0 bytes relayedShare a real terminal with a 6-digit code, peer to peer
- 6-digit pairing code
- 0 bytes of terminal data through my servers
- P2P after handshake
- DTLS-encrypted DataChannel
The hard part. Signaling has to be central; terminal bytes must not be. A Durable Object relays only SDP and ICE, then leaves the path, so nothing I run sees your shell. Handing control between two PTYs was the harder half.
Sidecar~10 ms hook pathLocal-first hub for Claude Code, Codex and Cursor sessions
- 3 agents: Claude Code, Codex, Cursor
- ~10ms hook event write path
- SQLite-backed local session and token index
- 0 terminal/chat data sent to Sidecar servers
The hard part. Transcripts can't tell a finished turn from a pending permission prompt, so hooks are the only source of live state. They write to an atomic file spool, not SQLite, which keeps the agent's path near 10 ms even when Sidecar is closed.
miniqueue35 s max recoveryPostgres-backed job queue with leases and crash recovery
- at-least-once delivery
- 35s worst-case crash recovery
- 30s lease, 10s heartbeat
- zero duplicates via idempotency key
The hard part. SKIP LOCKED over NOWAIT, so a poll moves past locked rows instead of erroring. Recovery is a lease plus a reaper, not LISTEN/NOTIFY: slower, but it survives a worker dying mid-job, with a 35 s worst case.
Writing
All 42 posts →Approach
Generating code got cheap. Deciding whether it is correct did not. So I spend my attention on the parts a model cannot hand me.
- Start with constraints.
- Prefer the simplest architecture that survives them.
- Measure before optimizing.
- Design for failure.
- Understand the abstraction.
Connect
If you're working on hard problems in infrastructure, AI systems or security, I'd like to hear about it.
