Blog
Notes on backend engineering, scalable systems, and things I've learned building production APIs.
Race Conditions: A Simple Example and Four Ways to Fix It
A practical walkthrough of a classic check-then-act race condition, how to reproduce it locally with multiple instances, and four ways to fix it: optimistic locking, single-processor queues, application-level mutexes, and database row-level locking.
Oct 2, 2026Distributed Systems: What They Are and Why You Can't Avoid Them Anymore
A practical breakdown of distributed systems - core concepts, why modern applications need them, the real challenges they introduce, common architectures, and a guide to designing one that actually holds up in production.
Sep 23, 2026Building Backend Infrastructure That Actually Scales
A practical, experience-driven look at what really matters when designing backend systems for scale - from distributed computing challenges to the mistakes that keep showing up.
Sep 1, 2026How a 'Simple' CSV Export Crashed Our Node Service (And the One-Line Fix That Wasn't)
A postmortem on a memory-crashing CSV export bug, and how switching to Knex streams with Node's pipeline() fixed it for good.
Aug 26, 2026Redis Will Go Down. Make Sure Your Node.js App Doesn't.
A practical framework for deciding what should happen when your cache, session store, or job queue can't reach Redis - classification, fallback patterns, and the client config details that actually matter in production.
Aug 20, 2026Database Tuning at Scale: What Actually Moves the Needle in Whitelabel Systems
Lessons from tuning PostgreSQL and MySQL in large, multi-tenant whitelabel platforms - the mistakes, the wins, and the things nobody tells you until 3 AM.
Aug 19, 2026Learning About Analytics Led Me to Parquet Files - Here's What I Found
A backend developer's dive into why Parquet is the default choice over CSV for analytics workloads - column-oriented storage, compression, schema, and a hands-on PostgreSQL export comparison.