Writing
Notes from production: payments, distributed systems and data, with the numbers and the mistakes left in.
2026
Idempotency keys are not enough: designing payout retries that never double-pay
Sep 2026 · 2 min
How a retry storm double-paid customers, and the ledger-first design that made it impossible.
Payments · Distributed systems
Kafka consumer lag as a product metric
Jul 2026 · 1 min
Why the delay between an event and a dashboard matters to users, and how we brought it under a minute.
Data
Row-level security in Postgres for multi-tenant SaaS, with numbers
May 2026 · 1 min
Isolating 340 tenants in one database: the setup, the query overhead we measured, and the gotchas.
Postgres
What I cut to ship an MVP in seven weeks
Mar 2026 · 1 min
The features, abstractions and infrastructure I left out on purpose, and which ones I had to add back.
Product
2025
Timeouts are not failures: modelling "unknown" in payment state machines
Dec 2025 · 1 min
A provider said no when it meant maybe. What that cost us and how the state model changed.
Distributed systems
BullMQ vs Kafka: picking a queue by failure mode, not throughput
Aug 2025 · 1 min
A side-by-side of what breaks, what you can replay and what it costs to run each one.
Distributed systems
Reconciliation is a product, not a cron job
Apr 2025 · 8 min · Medium ↗
Turning a morning spreadsheet ritual into an hourly system finance actually trusts.
Payments