Blog
Notes on systems, payments & the work
Practical writing about engineering at scale and the personal side of a career in software — architecture decisions, trade-offs, failures, and lessons learned.
Designing Reliable Payment APIs
The boundaries, invariants, and failure modes that make payment APIs trustworthy.
Context Cancellation in Go
How cancellation moves through a Go service and why ignoring it creates invisible production work.
The Queue Is Not a Database
Queues coordinate work; they do not replace durable state, ownership, or reconciliation.
A Practical Guide to API Timeouts
Timeouts are part of an API contract, not an afterthought added after the first outage.
Designing a Payment Transfer System for High Throughput
What it actually takes to move money across 130+ banks reliably: idempotency, reconciliation, per-integration failure domains, and keeping tail latency predictable when downstream banks misbehave.
What Makes a Good Go Package
Small APIs, clear ownership, and boring names make Go packages easier to maintain.
Database Migrations Without Panic
Safe schema changes are a sequence of compatible steps, not a single dramatic deploy.
How I Review Distributed System Designs
A review is strongest when it asks what happens when assumptions fail.
Backpressure Is a Product Feature
When a system is overloaded, graceful slowness beats silent failure.