Skip to content
Eric Blanchard

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.

  1. Pull request

    Every change arrives as a pull request, including the automated dependency updates.

    Tools: GitHub

  2. Static checks

    Strict TypeScript, ESLint and Prettier. Nothing else runs until these pass.

    Tools: TypeScript, ESLint

  3. 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

  4. Storybook

    Each component is documented with its states, and every story doubles as an accessibility test.

    Tools: Storybook, axe

    31 stories

  5. End to end

    Every page is loaded in Chromium, navigated, and scanned for accessibility problems.

    Tools: Playwright, axe

    43 checks, 0 accessibility violations

  6. Performance budget

    Lighthouse runs against the production build. A score below budget fails the pipeline.

    Tools: Lighthouse

    Performance 98, accessibility 100

  7. Deploy

    Pull requests get a preview URL. Merges to main go to production on Netlify.

    Tools: GitHub Actions, Netlify

  8. 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.