Engineering
This site is its own case study. Every number on this page was produced by the pipeline run that built and deployed it, so it can only be as good as the code actually is.
Measured October 13, 2026.
Measurements
- Lighthouse performance
- 98
- Budget: 95 or the build fails
- Lighthouse accessibility
- 100
- Budget: 100
- JavaScript on the home page
- 136 kB
- Compressed, measured in a real browser. Budget: 150 kB
- Accessibility violations
- 0
- Across 9 pages, light and dark
- Unit and component tests
- 79
- In 19 files
- Line coverage
- 100%
- Branches 98%, functions 93%
- Storybook stories
- 31
- Covering 13 components
- End-to-end checks
- 43
- Playwright, Chromium
The pipeline
GitHub Actions runs these steps in order on every pull request, on every merge, and once a week on its own so the site keeps getting patched while I am busy elsewhere.
Pull request
Every change arrives as a pull request, including the automated dependency updates.
Tools: GitHub
Static checks
Strict TypeScript, ESLint and Prettier. Nothing else runs until these pass.
Tools: TypeScript, ESLint
Unit and component tests
Logic is tested in isolation; components are tested by rendering their stories in a real browser.
Tools: Vitest, Testing Library
79 tests, 100% line coverage
Storybook
Each component is documented with its states, and every story doubles as an accessibility test.
Tools: Storybook, axe
31 stories
End to end
Every page is loaded in Chromium, navigated, and scanned for accessibility problems.
Tools: Playwright, axe
43 checks, 0 accessibility violations
Performance budget
Lighthouse runs against the production build. A score below budget fails the pipeline.
Tools: Lighthouse
Performance 98, accessibility 100
Deploy
Pull requests get a preview URL. Merges to main go to production on Netlify.
Tools: GitHub Actions, Netlify
Stay current
Dependabot proposes updates weekly. Patches and minor versions merge themselves once everything above is green.
Tools: Dependabot, CodeQL
AI as a tool
I use Claude Code daily, including to build this site. Here is how I keep it useful and keep it honest.
Rules live in the repository
AGENTS.md and prompt files give every AI session the same conventions a new teammate would get: how to test, what not to touch, where things go.
Agents get a narrow job
On Hexploration, separate agents handle level design, balance tuning and player feedback, with a coordinator handing work between them.
Tools, not pasted context
MCP connections let the agent read the Unity scene and the Notion design wiki directly, so it works from the source of truth.
CI has the final word
AI drafts; it does not approve. Every change, whoever wrote it, passes the same checks below, and I read every diff before it merges.
Choices for speed
- Every page is prerendered. The root layout requires static output, so the build fails if anything starts rendering per request.
- Server Components by default. The hero map is generated on the server as SVG and animated with CSS, so it costs no JavaScript.
- Two self-hosted variable fonts, preloaded, with no third-party requests.
- Light and dark themes follow your system setting through CSS alone.
- Security headers, including a content security policy, are set on every response.