Count the Processes: Three Production Bugs That Only Exist Behind More Than One Worker
A rate limiter that never limited, a database that ran out of connections, and migrations that couldn't get a lock. One root cause behind all three.
Writing
Real bugs, real decisions, and what I changed afterwards: LLM pipelines, real-time features, payments, security, and AI-assisted engineering.
A rate limiter that never limited, a database that ran out of connections, and migrations that couldn't get a lock. One root cause behind all three.
Moving the JD Analyzer from OpenAI to Gemini was a base-URL change. Finding out why it stopped after two eval cases was the real lesson.
Five rules I shipped in a live-lesson whiteboard on Laravel Reverb: authorise once, write before you broadcast, send pointers, anchor to the page, and degrade o…
I moved a marketing site from a Vite SPA to the Next.js App Router for SEO, with Claude's help. The port worked. It also rewrote copy nobody asked it to touch.
Each side was correct on its own. The bug was in what one side assumed about the other. Five real examples, and why owning both sides finds them faster.
Hundreds of my production commits are co-authored with Claude. Here's the standard each one has to meet before it lands.
How I wired SAML SSO and password resets on a multi-tenant FastAPI backend so a real session token never lands in a URL, and where the design still has a gap.
html2canvas choked on Tailwind's lab() colours, jsPDF drawing drifted from the design, an iframe was a workaround. The fix was to stop making PDFs in the browse…
How I introduced Vitest to two production Next.js sites with zero tests, what I covered first, and how I checked that the tests actually catch the bugs they cla…
Two marketing sites called a paid IP-geolocation API from the browser, with the key in the bundle. The country was already in a request header.