Writing
Notes on payments infrastructure, distributed systems, and the startup that didn't make it — plus the dev tools and ~30 books a year that fund the rest. Written down so I don't have to learn it twice.
Designing a dead-letter queue you can trust
In payments, the interesting question was never what happens when a message processes — it's what happens when it can't. Poison messages, replay safety, per-aggregate ordering, and schema drift, from the financial core at DoorLoop.
Read postZero any, one year on
Twelve months of strict TypeScript with no escape hatches. What the compiler caught before code review did, and how the rule walked me into domain-driven design one rejected cast at a time.
8 min readIdempotency keys are a design input, not a retry hack
If processing an event twice can't equal processing it once, you don't have a queue — you have a liability. Where the key comes from, and why the check and the effect must commit together.
7 min readStripe Treasury: embedded banking without becoming a bank
What it actually takes to move customer funds — accounts, fund flows, the reconciliation you don't see — and the failure modes that decide the architecture.
9 min readSpecBite: an honest postmortem
My failed startup, with the parts I'm not proud of left in. The engineering shipped; the business didn't. Here's the difference, in detail.
14 min readI keep my reading list in git
~30 books a year, one commit at a time. Queue management, speed, retention, and what I do with the notes when a book is worth keeping.
4 min readRunning K8s for a side project (don't)
I did it so you can read about it and choose a boring Postgres box on a single VM instead. A breakdown of what the complexity actually bought me.
9 min readDDD for people who actually ship
Domain-driven design without the 500-page book. The three ideas I use every week and the rest I happily ignore.
12 min readA LitRPG engine in TypeScript
Stats, progression curves, and generated encounters as plain data. Building a narrative game engine I can actually reason about — and test.
7 min readBuilding an MCP server in an afternoon
The Model Context Protocol is smaller than it looks. I shipped a working server between lunch and dinner — here's the whole shape of it.
6 min read