Featured3 min read

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.

Felipe Goncalves ·
In this article
ExpandAdd the new shape beside the old
BackfillCopy data over in small batches
ContractRemove the old shape once unused
Read article →
9 articles
Performance

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.

TypeScript

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.

Databases

Indexes you forgot you had

Every unused index taxes every write. One query to find them, and a safe way to drop them.

Operations

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.

AI

Small models, real work: running inference locally

When a laptop is enough, and how to tell before you provision a single GPU.

Engineering

The case for fewer dependencies

Every package is a promise someone else has to keep. Count the promises before you add another.

Databases

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.

Databases

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.

Databases

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.