Engineering

Performance budgets: a slow page is a broken page

A page that takes four seconds to become useful is not a fast page with a flaw; it is a broken page that happens to render. Users do not experience your architecture. They experience the wait — and speed is part of whether the thing works.

A slow page is a broken page

The reader never sees your clean data model or your elegant service layer. They see the blank rectangle, the spinner, the layout that jumps as an image finally loads and shoves the button they were about to tap. To the person on the other side, a slow page is not a fast page carrying a minor defect. It is a product that does not work yet, dressed as one that does.

The trouble is that speed is easy to lose slowly. One more script, one more font weight, one unsized image — each defensible on its own — and the page that launched fast is heavy by the third quarter, with no single commit anyone can point to as the culprit. Good intentions do not hold a line. A number does.

Turning speed into a spec

A performance budget makes speed a requirement instead of a wish. It names the numbers the page must meet — Largest Contentful Paint under two and a half seconds, Cumulative Layout Shift under a tenth, a ceiling on the total bytes shipped — and treats a page that misses them the way you would treat a failing test. Not a note to revisit later. A failure, now, blocking the change.

LCP measures when the main content actually appears, not when the server first answered. CLS measures how much the page moves under the reader after it starts drawing — the single most infuriating thing an interface can do. Written as thresholds, both stop being opinions to argue about. A change either stays within budget or it does not, and the answer reads the same for everyone who runs the check.

How the budget gets held

Holding a budget is mostly the discipline of refusing to spend. Ship the smallest thing that works — self-hosted variable fonts instead of a chain of remote requests, images sized and compressed to exactly what the layout needs, no framework where plain markup does the job. This site has no build step and serves its own fonts for precisely this reason: fewer moving parts means fewer places for speed to leak away unnoticed.

A budget only earns its keep if it runs automatically, on every change, against the built page rather than a developer's fast laptop on a good connection. That is the same standard we bring to software we build for others — measured, budgeted, and enforced in the pipeline. It is part of what custom web application development should include, even when the brief forgets to ask for it.

Questions

People also ask

    What is a performance budget?

    A set of numeric limits a page must meet to ship — for example Largest Contentful Paint under 2.5 seconds and Cumulative Layout Shift under 0.1. A page that exceeds the budget is treated as failing, the way a failing test blocks a release.

    Why treat Core Web Vitals as a requirement rather than a goal?

    Because speed erodes one small addition at a time. Written as a spec and checked automatically on every change, the budget catches the regression at the commit that caused it, instead of long after users feel a page that has quietly grown heavy.