colophon
How this site is built
Static HTML, one stylesheet, two typefaces, and a build that refuses an uncited number.
Every claim has a source, or the build fails
Case files are a content collection with a schema. A metric needs a method and the id of one of its entry's sources; and every narrated line needs at least one citation. Either one missing, and astro build stops.
After the build, tools/check_links.py follows every internal link and anchor and requests every source URL, including ones in the content files that no page renders yet. A dead source fails the check. The CI workflow runs both on every push.
What the sources can't support is written down instead: each teardown ends with what it doesn't claim.
What loads, and when
- First paint: HTML with the stylesheet inlined, two preloaded font files, and the small script that places Neo, prints the receipt and handles citations.
- First scroll, key or tap: GSAP, ScrollTrigger and Lenis, for the scroll-linked narration.
- After first paint, when idle: three.js and Neo's 3D scene.
- Near the viewport: each interactive demo, on its own.
Everything that moves is an enhancement. Without JavaScript the text, tables and source cards all work, and reduced motion turns the scroll choreography off.
Type and colour
Funnel Display for headings and Space Grotesk for text, both variable and self-hosted through Fontsource, with JetBrains Mono for metadata, tables and code. Each section of the home page has its own colour, over faint column guides.
Stone pages and one blue accent for links and focus. Green, amber and red appear only where they mean a state, in tables like the one below, and each comes with a shape and a word so colour is never the only signal.
How Neo is rendered
Neo is a three.js model drawn on one fixed, transparent canvas. The scene renders in linear HDR into a multisampled target, lit by a studio environment. A final full-screen shader tone-maps it onto the page and adds what a plain render can't: the circular clip when Neo sits in a badge, the print-in intro, where the figure appears as 1-bit dithered ink before developing into colour, and the ink outline with its hard offset shadow.
Where Neo stands comes from the page itself: each section names a spot, and Neo walks between them as you scroll.
Measured
Lighthouse 12.8.2, run on 2026-10-27 against a local preview of this build. Mobile runs use Lighthouse's simulated throttling, so they're slower than a typical phone on Wi-Fi.
| Page | Device | Perf. | A11y | Best pr. | SEO | Blocking | CLS |
|---|---|---|---|---|---|---|---|
| / | desktop | 59 | 100 | 100 | 100 | 5,900 ms | 0 |
| / | mobile | 47 | 100 | 100 | 100 | 15,320 ms | 0 |
| /work/ | desktop | 60 | 100 | 100 | 100 | 5,050 ms | 0 |
| /work/ | mobile | 35 | 100 | 100 | 100 | 47,320 ms | 0 |
| /work/loom-ai/ | desktop | 60 | 97 | 100 | 100 | 8,880 ms | 0 |
| /work/loom-ai/ | mobile | 54 | 97 | 100 | 100 | 19,660 ms | 0 |
