FLIGHT RECORDER — DO NOT PAINT OVER
Black-box
Flight recorders are painted international orange so they can be found after the fact. This page is the same idea: how the site is built, what it refuses to do, and what broke on the way.
01Stack
FrameworkNext.js 16 — App Router, TypeScript, static-first
ContentMDX in-repo, gray-matter + next-mdx-remote, compiled at build
AnimationGSAP 3.13 — ScrollTrigger, SplitText, Flip, Draggable, Inertia, CustomEase
Smooth scrollLenis (lerp 0.08; 0.11 in articles), driven by GSAP's ticker — one rAF
TransitionsCustom manager — not the View Transitions API. Deterministic timing, Flip morphs
Render tierTier B by choice: DOM + CSS filters + SVG. The GL layer remains bolt-on-able
02Type
DisplayClash Display 500–700 — Fontshare, self-hosted woff2
Body / confessionalZodiak 400 + 700 + italics — Fontshare, self-hosted
InstrumentationFragment Mono — Google Fonts (OFL), self-hosted
Subsettingpyftsubset to the used character set; preloaded set 94KB (budget 120)
03Motion spec
--t-micro / ui / reveal / scene0.22s / 0.45s / 0.9s / 1.4s
--e-outcubic-bezier(0.16, 1, 0.3, 1) — default reveal
--e-settlecubic-bezier(0.22, 1, 0.36, 1) — media; the flare
--e-thrustcubic-bezier(0.83, 0, 0.17, 1) — transitions and wipes
LawsNothing bounces · entrances decelerate · exits anticipate · velocity is visible · articles are a no-fly zone
04Performance — recorded
Lighthouse (desktop)Performance 100 · Accessibility 100 — home and article
LCP0.7s (budget ≤ 2.0s)
CLS0.014 home · 0.000 article (budget ≤ 0.02)
Total blocking time0ms
JS, home route252KB gz (budget ≤ 300KB)
Fonts, preloaded94KB woff2 (budget ≤ 120KB)
Morph frame rate60fps sustained through the full transition (rAF-metered)
MeasuredAug 2026, production build, this hardware — not estimated
05What broke during the build — recovered from the recorder
- Fragment Mono is not on Fontshare, despite the spec insisting it was. It lives on Google Fonts under the OFL. The prototypes rendered a fallback mono for two days and nobody noticed, which is its own lesson about fallback stacks.
- Next 16 intercepts history traversal through the Navigation API, so popstate never fires. Scroll restoration now detects back/forward by whether our own link component initiated the navigation.
- A stale scrollend listener kept saving the next page's zero scroll under the previous page's key. Restoration read 0 forever. Keys are now taken from location at event time.
- The shared-element morph animated the page container out — and the container lives in the persistent layout, so every morph destination arrived invisible. The entrance now clears it before anything measures.
- mix-blend-mode: difference turns paper-on-orange into cyan. Real runway thresholds are white, which fixed the physics and the palette in one move.
End of recorder data. The site remains in service.