Performance posts
Everything in the journal filed under performance.
2026
Lab numbers, field data and a real phone
A synthetic audit, real user data and a phone in your hand answer three different questions. Here is when each one lies and how to measure a change.
An eleven kilobyte home page: the case for static sites
What pre rendering buys you, what it costs, and the build pipeline, page weight budget and caching rules that keep a static site small and boring.
Keeping an AI feature affordable in production
An AI feature that works can still produce a bill nobody planned for. Where the tokens go, what to cache, what to trim and how to cap spend per user.
From a slow query to the right index
Find the query, read the plan, then choose the column order. A practical route from a slow page to an index that actually gets used, and its cost.
2025
What the responsive images audit is really telling you
The audit compares the file you sent with the pixels the device needs, which is layout width times pixel ratio. Here is how to read it and what to change.
A hundred thousand rows pasted into a form: move it to a queue
A synchronous bulk import dies at the proxy timeout, leaves half written state and charges the user twice. Accept, store, return, then work in chunks.
From 300 to 19,000 an hour: where sending throughput actually goes
A sender stuck at 300 messages an hour is not short of CPU or bandwidth. It is waiting for one round trip at a time, and the fix is measurable.
Your entrance animation is delaying your largest paint
An element that starts at opacity zero is never painted, so a fade in pushes Largest Contentful Paint out by the delay plus part of the animation.
When PNG beats AVIF: images made of hard dots
Lossy codecs are built for photographs. On a halftone screen an indexed PNG beat AVIF at every width, and the only way to know is to measure both.
Subset the fonts, match the fallback metrics, stop the layout shift
A page that renders 127 characters should not download 889 glyphs. Subset at build time, metric match the fallback, and the font swap stops moving things.