Writing
Notes on backend systems.
Long-form posts on the design decisions that don't fit in a README — distributed systems, queueing, IaC trade-offs, and the quiet failure modes nobody warns you about.
When the code is real and the description isn't
I published a post explaining an architecture I hadn't built, linked to the repo that contradicts it, and nothing caught it for four months. Here's why nothing could.
Package hallucination fails closed — the import errors and you find out. I hit a different category: every component I named was real, the code I'd written was real, and the prose described a system I hadn't built. Two greps found it. Nothing else in the pipeline could have.
Read postThe cost of three AZs
What multi-AZ resilience actually costs per month on AWS — and when two zones is the honest right answer.
Most cloud tutorials spread workloads across two AZs and stop. Three AZs gets you stronger failover but costs measurably more — usually NAT Gateways, not what you'd expect. Here's the real monthly bill, line by line.
Read postDead-lettering without a Dead Letter Exchange
RabbitMQ will route failed messages for you at the broker level. I chose not to let it — here's what that bought, and what it cost.
RabbitMQ has a built-in mechanism for failed messages: point a queue at a Dead Letter Exchange and the broker routes them for you. I built the dead-letter path in my application instead. That made my DLQ a SQL table and my replay an HTTP call — and gave up the one thing the broker does that my application can't.
Read post