In production · 2026
A gate that refuses to ship a badly built site
A Playwright suite that audits every route before a deployment and fails it when something slips. This portfolio included.
- Role
- Design and development
- Checks
- 177
- Routes audited
- 14
- JavaScript budget
- 200 kB
Problem
Checklists of “things to review before publishing” do not get reviewed. You read one, agree with every line, and by the third deadline you ship without looking at any of it.
The failures are always the same: one title reused across every page, no meta description, two level-one headings, a social image returning 404, an error page answering 200, and a three-megabyte bundle.
Decision
Turn the checklist into tests. Not documentation, not a reminder: checks that fail and stop the deployment.
And run them against a production build, never the dev server. In development Next injects reload scripts, serves unminified code and exposes source maps — auditing there measures something no visitor will ever see.
Implementation
Per route: declared language, a unique title, a meta description of usable length, exactly one level-one heading, an absolute canonical pointing at itself, complete Open Graph with an image that genuinely returns 200, no images without alt text, zero console errors and zero axe violations against WCAG 2.2 AA.
Site-wide: sitemap, robots and llms.txt exist and parse, the favicon is not the template’s, the error page returns a real 404, structured data is valid, no source maps are served, and the home page stays under its JavaScript budget.
And one that covers several at once: the page text has to be in the served HTML. An empty view-source gives away an app shipped without server rendering, and it is the first thing anyone notices when the link is shared.
Result
The first run failed 22 checks: the Open Graph image existed only on the home page. The cause was that exporting Open Graph settings from a page makes Next discard the image generated by file convention.
That is exactly the kind of failure you never see while browsing, and always see the moment someone shares the link and gets a grey card.
Later, a performance run surfaced an accessibility bug the gate itself did not cover. That check got added: when something slips through, the answer is not to fix it and move on, it is to make sure the gate catches it next time.