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
  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.