Performance
The performance budget playbook: 100KB on every page
Performance budgets are not optional. Here is the playbook we use to hit 100KB on home, 110KB on service detail, 90KB on blog post and 80KB on contact.
Performance budgets are not optional. They are the difference between a fast site and a slow one. Here is the playbook we use to hit our budgets on every page.
The budgets
- Home: under 100KB gz JS.
- Service detail: under 110KB gz JS.
- Blog post: under 90KB gz JS.
- Contact: under 80KB gz JS.
- Third-party scripts total: under 50KB gz.
How we hit them
- **Server-render everything important.** Headings, body copy, FAQ and schema are all server-rendered. Search engines and AI crawlers see them without JavaScript.
- **One LCP image per page.** Preloaded, marked fetchpriority="high", never lazy-loaded.
- **No inline videos.** When video is needed, embed from YouTube with a written summary.
- **Tree-shake everything.** We use the auto-import optimisation in Next.js to drop unused icon code.
- **Lazy-load below the fold.** Below the fold, code is loaded when needed.
The enforcement
Performance budgets are enforced in CI. A PR that busts a budget without justification is blocked. We run Lighthouse in CI on the top 20 routes per country.
What to do when a budget is bust
- Identify the cost. Use the bundle analyser to find the offender.
- Find the fix. Replace, remove or lazy-load.
- Justify the cost. If you cannot fix it, document the reason in the PR.
Questions
Frequently asked questions
Common questions about the performance budget playbook: 100kb on every page, answered plainly.
Was this helpful?
One tap. No email, no signup.