Ethan McNamara

Colophon

The materials behind this portfolio. Every figure below is measured from the generated files; the results belong to the revision shown beside them.

This build

Built8 October 2026
Revisiona758ccb
Pages22
HTML, all pages719 kB
Assets, all types169.80 MB
Search entries19
Build time908 ms

By file type

TypeBytes
.mp4145.23 MB
.webp18.75 MB
.js2.08 MB
.png1.86 MB
.css1.08 MB
.mjs489 kB
.woff2187 kB
.json66 kB
.html33 kB
.vtt24 kB
.txt9 kB
.svg6 kB

The diagrams are drawn at build time from their sources and inlined in each project page, so they add nothing to the SVG figure.

How it is built

Stack

No application framework. Static HTML, CSS and JavaScript, rendered by a Node script using the standard library. Fonts are self-hosted. The production site uses Vercel Web Analytics for aggregate traffic statistics. Read about privacy and your analytics choice.

The components collection keeps its own React and Motion runtime, styles and Inter fonts. Those files are self-hosted and load only when you open it.

Type

Geist, self-hosted. Geist for the interface and Geist Mono for anything a machine produced — including every number on this page and the drawing chrome of the home page's exploded view. Caveat is kept for a hand annotating the work rather than the interface speaking. All three are subset, served from this domain, and released under the SIL Open Font Licence.

Theme

Light on a first visit, whatever your system is set to. A saved dark choice is remembered on this device and restored before first paint by a small inline script, so there is no flash either way. The script never reads your operating system's preference. Both themes are checked in the browser.

Checks

Last run Thu, 08 Oct 2026 09:01:11 GMT against revision 00f0294.

CheckResultDetail
G1 build Pass 24 pages, 21 routes
G2 vendor identity Pass 13 files byte-identical to source
G3 reviewed dependencies Pass 117 files; only official analytics SDK permitted
G4 html Pass 24 pages checked
G5 links Pass internal links and anchors resolve
G6 budgets Pass largest page 227kB · max route css 28.7kB gz · js 29.3kB gz · aggregate css/js 64/180kB · fonts 187kB
G7 css rules Fail 18 site stylesheets
G25 components Pass 38 identities, original checksums, checked adapters, scoped styles, one h1 and no review tooling
G26 share images Pass 23/23 pages with a sound 1200×630 og:image · 21 distinct images, 1601kB linked · assets/og 20 files, 1568kB
G27 Dot engine Pass 30 properties: frame-rate determinism, seek equals play, continuity, area, reduced motion, golden frames
G8 contrast Pass WCAG AA on 15 routes, both themes
G9 accessibility Pass names, targets, slider and dialog semantics
G12 layout Pass no horizontal overflow
G20 console Pass no errors or warnings
G10 keyboard Pass focus, palette, lens keys
G11 reduced motion Pass nothing moves; films show stills
G14 theme Pass light first, saved dark wins, persists, no flash
G13 vitals Pass mobile, CPU 4x: CLS max 0.0047 · LCP max 556ms across 7 routes
G17 archive Pass 472 of 472 artefacts painted · 129 open · 74/74 wall behaviours · 9 of 9 decks draw in the viewer · frame:1b opens in the lightbox
G18 receipt truth Pass every figure on the colophon is computed
G21 panel regressions Pass every held defect class still fixed
G22 the exploded view Pass keys, hand, lift, leaders on their evidence, arrival, touch and the fold, driven
G23 the hero control Pass focus, names, micro type, dark materials, reduced motion, no-script rest pose
G24 Project mechanisms Pass one template at 320/390/768/1440; four models; media; reduced motion; no-JS
G28 Dot page Pass focus ring both themes; storage blocked; idle, paused and exclusive films; gated film sound; reduced motion; touch drag; keyboard pick up, move and throw; film played = film seeked; expression links; replay keeps the full stop; proof identical at every stop; springs switch; mood keys and sentence; finale full stop; no-JS content; no overflow 320–1920
G29 Dot performance Fail slow start-ups (median of 3): short dot-undo 93 ms; long tasks in 3 of 3 runs: 153 ms in arrival, 136 ms in film | 189 ms in arrival, 95 ms in film | 146 ms in arrival, 93 ms in film; up-front JS 25.0 KB gz (budget 25 KB): dot-studio.c651f359.mjs, engine.4dc4ae63.mjs, mind.2bed42e6.mjs, stage.36b932ea.mjs, tuning.0e3a1209.mjs