Quality
This site isa test subject
A Playwright suite runs against every push before the site can deploy. If I would not ship an untested build of a game, I will not ship one of my own site.
Level 2 · Latest run
The last run
10 of 10 checks passed in the run that deployed this page, on 28 October 2026. The home page runs live checks on itself when you press Test this page.
Test the home page1 of 1
Pages load
Every route answers 200 and renders one h1. No blank screens.
1 of 1
Zero console errors
Nothing red in the console, no request left failing.
1 of 1
Internal links resolve
Every internal link answers 200. No 404s hiding in the footer.
3 of 3
Three widths
No sideways scroll at 375, 768 and 1440 pixels. Phones count.
1 of 1
Accessibility scan
axe-core finds no violations. Keyboard and screen readers get the whole page.
3 of 3
Brand assets
Both typefaces load, the logo renders, favicon and Open Graph image present.
Level 3 · The suite
45 tests, read from the code
This list is built from the test files at build time, so it cannot drift from what runs.
Brand assets
- both typefaces load
- the logo renders in the header and the hero
- favicon, touch icon and Open Graph image exist
Contact
- loads with one h1, the direct details and no console errors
- an empty form is stopped with named errors and focus on the first field
- a bad email is named, and fixing it clears the error
- a valid message posts a JSON string as text/plain with every field, and shows Sent
- field errors from the script are shown beside the fields
- the script's error for the message field lands on the message box
- a rate limit asks for a minute
- a server error or a network failure keeps the mail fallback
- the honeypot is out of the tab order and hidden from assistive tech
- has no accessibility violations (axe)
- renders without sideways overflow at …px
Credits
- loads, has one h1, credits the type and the pixel art, and passes axe
- the footer links to the credits page and no longer lists photographs itself
Games
- the HUD shows, the games toggle off and the choice is remembered
- a bug is caught with the net, counts, unlocks the first achievement and survives a reload
- the net cursor shows over a bug and nowhere else, and only with a fine pointer
- a touch tap catches without a cursor change
- the ship moves along the floor with the scroll
- reduced motion removes the games and the bar
- the 404 page counts down and Stay here stops it
- the 404 page is a plain link home without script
Home
- loads with one h1 and no console errors or failed requests
- every internal link resolves
- has no accessibility violations (axe)
- headings are in order and images have alt text
- keyboard focus is visible on the first interactive element
- menu toggle works on a phone
- the self test runs, reports and scores the page
- the ticker moves, pauses with its button and stands still under reduced motion
- hero content is in the HTML before any script runs
- renders without sideways overflow at …px (…)
pages.spec.ts
- loads with one h1, its content and no console errors
- headings are in order, images have alt text, internal links resolve
- has no accessibility violations (axe)
- renders without sideways overflow at …px
- every public project has its own page, linked from the portfolio
- the skills jump list lands on each skill
- the old services address sends visitors to the skills page
- the built site is a portfolio, offers no work and carries no stale facts
Home on a phone
- every level heading is revealed on a phone, and the first screen holds the button
- the HUD is one slim row and the Games button opens the panel
- phone bugs sit in the top right corner of their level and the final level has none
Level 4 · Every push
The loop
Five steps between a commit and the live site. Lighthouse scores 100 in every category.
Push
Every push and pull request starts the workflow on GitHub Actions.
Install
A clean Node 24 install and a fresh Chromium for Playwright.
Build and serve
The site is built with Astro and served exactly as it will be deployed.
45 tests
Pages, console, links, viewports, forms, the games, and axe-core on every page.
Deploy only if green
A failing test stops the deploy. The live site is always a build that passed.
Level 5 · Final level