Boring migrations are the best migrations
The database changes that never page anyone at 2 a.m. share one trait: they are split into steps small enough to be uninteresting.
Reading a flame graph without fear
Most performance wins come from the widest bar, not the tallest stack. A short guide to knowing where to look first.
Type-safe APIs, and where the types stop
Generated clients are a gift, until the network hands you a shape your compiler never heard of.
Indexes you forgot you had
Every unused index taxes every write. One query to find them, and a safe way to drop them.
What a good on-call handoff looks like
Five minutes of writing at the end of a shift saves an hour of guessing at the start of the next one.
Small models, real work: running inference locally
When a laptop is enough, and how to tell before you provision a single GPU.
The case for fewer dependencies
Every package is a promise someone else has to keep. Count the promises before you add another.
Reading EXPLAIN without guessing
The plan tells you where the time goes if you read it from the inside out. A walk through the nodes that matter.
Connection pools are queues in disguise
When a pool runs dry, requests wait in line. Size it from your latency budget, not from a round number.
Picking a primary key you won’t regret
Sequential or random, integer or UUID: the choice shows up years later, in your index pages.
One email when there is something worth reading.
New articles, sent when they are published. Unsubscribe any time.