Colophon
How this site is built
This portfolio is meant to demonstrate the same care I put into client work, so its own quality is measured and enforced, not asserted. Here is what runs it and how the numbers below are produced.
Stack
Next.js (App Router) with TypeScript and Tailwind CSS v4. Long-form content — case studies and study notes — is authored in MDX. The one heavy interactive piece, a 17,000-row grid demo, uses TanStack Virtual. Fonts are Geist, self-hosted. There is no analytics script and no third-party embed.
Static generation
Every page is prerendered at build time. Pages with no parameters are statically generated; the case studies, study notes and their social images come from generateStaticParams, so each URL is built to static HTML with no server rendering at request time. That is why the performance scores are what they are — the browser receives finished HTML and a small amount of JavaScript.
Testing and CI
The test suite runs in Playwright across a desktop and a mobile project: smoke tests that every page returns 200 with a single h1, behavioural tests for the demos, and accessibility checks (below). GitHub Actions runs lint, a production build, the Playwright suite, and Lighthouse CI on every push and pull request.
Accessibility
The approach is semantic HTML first: one h1 per page, real landmarks, labelled form controls, a skip link, visible focus rings, and respect for prefers-reduced-motion. Every main page is scanned with @axe-core/playwright against the WCAG 2.1 A and AA rule sets as part of the test suite, and Lighthouse's accessibility audit gates the build at 90.
Latest Lighthouse scores
Measured on 2026-09-29 with the Lighthouse desktop preset against the production build. The build fails if any category drops below 90. These numbers come from the CI report — see the notes for the techniques behind them.
| Route | Performance | Accessibility | Best practices | SEO |
|---|---|---|---|---|
| / | 100 | 100 | 100 | 100 |
| /work/ddmind | 100 | 100 | 100 | 100 |
| /work/ddmind/grid-demo | 100 | 100 | 100 | 100 |
| /notes | 100 | 100 | 100 | 100 |
Scores live in src/content/lighthouse-scores.json and are updated from the Lighthouse CI artifact, so nothing here is a number I haven't measured.