The rule is simple.
A pull request doesn't merge if Lighthouse scores below 95 on any page for even one of its four metrics. Not "a warning in the logs." Not "a green check with a note." The merge physically doesn't happen — the button in GitHub is gray.
This rule is one of four that hold a project together between releases. The other three — types must pass, tests must pass, the screenshot diff must not exceed the set threshold. If any of these rules fails, CI is red and a merge is impossible.
No exceptions for "let's merge now, fix it later." No "skip lighthouse for this PR" flags. If a rule gets in the way of working, we discuss the rule — we don't go around it.
Four metrics, two devices.
Lighthouse computes four scores: Performance, Accessibility, Best Practices, SEO. Each — from 0 to 100. We hold the bar at 95 on all four.
Performance is the most temperamental. On a fast desktop, zero effort gets you 100. On a throttled Android — 60. So we run Lighthouse in CI on an emulated Pixel 5 with 4G throttling. Not on the developer's laptop. Not on an iPhone 15 Pro. On a real device that a significant part of the world will actually open the site on.
Accessibility is the steadiest. If the developer is disciplined, it holds near 100 effortlessly. If not — it drops to 70 on the first large form.
SEO is simple. Meta tags, alt text, hreflang. Machinery. It drops when someone forgets an attribute.
Best Practices — about HTTPS, no deprecated APIs, correct security policies. Drops rarely.
What's in, what's not.
In CI: every page (not a sample), every PR (not a weekly build), every environment from preprod to prod. A run takes 4–6 minutes on a typical site. That's a lot for a PR cycle, but little for the quality we want to preserve for years.
Not in CI: design fidelity, brand consistency, copy, tone. That's the work of hands, not the machine. CI catches regressions; it doesn't judge taste. The machine doesn't know whether the hero page looks "premium" or "freelance." Only the people in the studio know that.
The machine holds the floor. The people hold the ceiling.
This boundary is the main one. CI should catch things that are objective and verifiable. Everything else is the team's competence.
The performance budget.
The Lighthouse score is the final grade. Beneath it are specific metrics we set budgets on, in code.
JavaScript on a page — no more than 180 KB after gzip. CSS — no more than 60 KB. Hero-section images — no more than 200 KB. Fonts — only the ones actually needed, in WOFF2, hosted locally on our CDN. No third-party font services in production.
These budgets live in a performance-budget.json file. CI reads it and compares against the real bundle size. Exceeding it is a CI failure, not a warning. It's rare but regular — every two or three months a developer gets caught on "just one library," and it has to be thrown out.
Three years later.
The site passes to the client. Editors change the content. They upload images that aren't always optimized. They embed YouTube. They add a third-party analytics counter. Does the score drop?
Sometimes. So CI stays on after release. Every PR from an editor — whether adding a new article, updating the team, changing a price — goes through the same check as ours. If a new photo breaks Performance, the merge won't happen until the asset is recompressed.
This works because an editor must not be able to "push through" a bad edit. CI isn't an obstacle, it's protection for the editor themselves against accidentally lowering the quality of a site that was paid for.
The standard holds not by our hands. It holds by the rules we left in the repository. In three years, in five — as long as the rules are in CI, the score stays 95+. And that's what we sell.
What that number means.
A Lighthouse score of 95 isn't a "premium badge." It's a set of measurable things: the site loads in a second and a half on 4G, the text reads without zoom, buttons are tappable without misses, images don't jump as they load, search bots understand the structure.
This converts into a business result that can also be measured. Lower bounce rate. Greater scroll depth. Longer time on page. These metrics appear in analytics two or three weeks after release, and we deliberately don't highlight them — they're just there.
Performance isn't a "nice to have." It's the primary brand signal, read before typography, before color, before copy. A site that lags is a site where the visitor feels the company isn't investing. No amount of copy fixes that afterward.