How we measure
Every page on this site states its own weight in the footer. A weight only means something for one stated setup, because the image a browser picks, the formats it supports, its cache and any requests it defers all change the total. So the footer names its setup: phone, AVIF, fresh visit. This page spells that setup out.
The reference profile
| Setting | Value |
|---|---|
| Viewport | 412 × 823 CSS px, the Lighthouse mobile emulation |
| Device pixel ratio | 1.75 |
| Browser | Chromium, current stable, with AVIF support |
| Cache | Cold: a new browser context, no service worker, no HTTP cache |
| Compression | As the production CDN serves it, Brotli where offered |
| Boundary | Initial load: navigation to the load event, with no scrolling or input |
| What counts | The transfer size of the navigation entry and of every resource entry in Resource Timing, same-origin and third-party alike |
| Checked against | The deployed preview URL for the pull request, not a local server |
Two boundaries, not one
We use two byte boundaries, and they are not interchangeable.
- Before LCP counts the bytes transferred until the page’s largest element (on phones often the headline text, on desktop the hero photo) has painted. This is the figure behind our speed budget.
- Initial load counts the bytes transferred from navigation to the load event, with no scrolling or input. This is the figure printed in the footer.
The footer figure is therefore a little larger than the before-LCP figure, because it runs later. Images further down the page that only load when you scroll are not counted in either.
How the printed number is made
The number in the footer is not typed in by hand. When the site is built, we load each built page under the reference profile, record what the browser fetches for the initial load, add up the Brotli-compressed size of those files, and write the total into the page.
The 5% check
Before a change ships, our tests load every page on the deployed preview under the same profile and add up the transfer sizes the browser reports. If the measured figure and the printed figure differ by more than 5%, the build fails. A mismatch means our model of what the browser fetches is wrong, so we fix the model instead of waiving the check.
The build also fails if either figure goes over the page’s initial-load budget: 200 KB for the home page and 140 KB for every other page.