Sections
Overview01 The Problem02 Zero-Build Architecture03 Live It · Tokens04 Typography05 Seven Principles06 The Shell07 The AI Pair08 Live It · Receipts09 The Build Record10 Where It's Going11 Outcomes12

The Design System
this site, documenting itself

Ten case studies argue that working software beats slideware. This eleventh one turns the argument on the site itself: the token architecture it renders from, the zero-build stack it ships on, the AI-paired process that built it, and the verification culture that gates every change. Two of its exhibits run live on this page.

Role
Designer & design engineer — solo, AI-paired
Stack
Zero-build HTML · CSS · JS · React CDN ×3 pages
Scale
29 pages · ~76,000 lines · 11 case studies
Accessibility
WCAG 2.2 AA / AODA target · standing audit
In this page
2 live instruments
The portfolio's work index in lobby view: a dark grid of case-study tiles, each carrying its own accent color on the shared canvas
01 · Overview

The last case study is the one you're standing in.

This portfolio is a single product: 29 self-contained pages sharing one token discipline, one accessibility bar, one editorial voice, and one build record. There is no handoff anywhere in it — the research framing, the interaction design, the visual system, and the shipped code are the same artifact, authored by the same person directing an AI pair.

That makes it inspectable in a way portfolios usually aren't. Every claim on this page has a source you can open: the tokens resolve live below, the slot math re-derives in your browser, the build record at the bottom of every page is generated from git. The numbers that follow are the honest ones.

0
npm dependencies, bundlers, servers, or backends
232
Design-token values in the three-tier mirror
9
In-page simulations and playable systems
02 · The Problem

Assertion is cheap. Drift is silent. Slop is fast.

Three failure modes stalk every senior portfolio. The first is assertion: "systems thinking" and "accessible craft" are claims on every resume, and static case studies can't prove them. The second is drift: a design system documented apart from its product decays quietly — the spec says one thing, the shipped pixels another. The third is new: AI makes generic output effortless, so a portfolio that reads like it was generated is now indistinguishable from one that was.

The structural answer to all three is the same: make the portfolio a product. Claims become inspectable systems; the documentation renders from the tokens it documents, so drift is impossible by construction; and AI is used openly, directed by a written brief and gated by verification — so the velocity is real and the slop never ships.

03 · Zero-Build Architecture

No build step, by conviction.

Every page is a single file with its CSS and JS inline. No npm, no bundler, no server, no backend — the repo deploys as pure static hosting, and view-source shows you everything. Three pages render through a small React runtime loaded from a CDN; everything else is hand-written vanilla. The decision record names the tradeoff plainly: "Portability and longevity beat tooling for a portfolio. Deploys anywhere static; first load needs the CDN; degrades gracefully."

The platform caught up to this bet. Native <dialog>, <details> disclosures, CSS custom properties, and IntersectionObserver do the work a framework pipeline would do elsewhere. Robustness is designed in: every module init is isolated so one failure can't cascade, overlays anchor to their stage rather than the viewport so transformed embeds can't lose them, and every localStorage touch is guarded.

ModuleLinesWhat it does
support.js1,579The DC runtime: renders <x-dc> template pages with CDN React. Generated, committed — the site still needs no build.
la-sims.js932Three photometric interactives sharing one footcandle engine: sandbox, AI AutoLayout, IES filter demo.
aegis-gims-proto.js763Native, dependency-free port of the AEGIS GIMS prototype — the case study carries the prototype itself.
parlay-slot.js630The honest demo slot: published reel strips, CSPRNG stops, exact RTP, ethics annotations with citations.
concierge.js625The portfolio concierge — deterministic retrieval with a written honesty constraint: no backend, no LLM, and the copy never claims otherwise.
boot-loader.js239Holds the homepage behind a boot screen until every subsystem passes verification, re-wiring any that fail.
a11y.js139Site-wide accessibility layer: skip link, focus ring, reduced-motion kill switch, target-size enlargement.
colophon.js136The build record on every page — generated from git and the deployments API, never hand-edited.
case-back.js50Back links remember which hub you came from; returning restores the browse where you left it.
SELECTED FROM 18 ROOT MODULES · LINE COUNTS FROM THE WORKING TREE · THREE PYTHON SCRIPTS GENERATE THE DERIVED LAYER: BUILD RECORD, 112-SECTION SEARCH INDEX, 42-DOCUMENT DESIGN COMPENDIUM
04 · Live It · The Token Architecture

The spec sheet is the page.

The system runs three tiers — primitives that carry raw values, semantic roles that give them meaning, and themes that swap them — mirrored to portable JSON and enforced by a written rule: reference var(--…), never hardcode a hex. Naming is semantic over literal: --ac2 and fg.muted, never --teal-300.

Two runtime systems share that discipline: the homepage family (dark by default, with a light "architect" mirror) and the case-study shell this page uses (light by default, dark on toggle). They share one saved preference, so your theme follows you across the site. The inspector below isn't a screenshot of the spec — it reads the computed custom properties of the page you're on, right now.

{palette.teal.700} #0d5350 → primitive: a raw value, no meaning accent.default var(--c-accent) → semantic: what it's for .cs / .cs.dark #0d5350 / #5fc2a8 → theme: what it resolves to, per mode .btn-primary background:var(--c-accent) → component: where it lands
Token inspector — this page, live
resolving…
READING THE COMPUTED CUSTOM PROPERTIES OF THIS DOCUMENT — PRESS THE THEME TOGGLE IN THE NAV AND EVERY VALUE RE-RESOLVES · NOTHING HERE IS TYPED OR PICTURED
05 · Typography

Three faces of type, one voice each.

The system runs three working families with strict roles — Inter for headings, DM Sans for prose, JetBrains Mono for anything the system itself says — plus VT323, which belongs to the retro terminal alone. The rule comes from the content-voice guide: sans for prose, mono for HUD and system labels. If text speaks as the interface, it's mono, uppercase, and letter-spaced; if it speaks to you, it's sans.

Like everything else in this case study, the specimens below aren't pictures of the type — they're the page's own fonts and classes, rendering live.

Live specimen — the working scale
SET BY THIS PAGE'S OWN CSS
HERO · INTER 600 · CLAMP(40PX, 6.4VW, 88PX) · −3PX TRACKING · LINE 1.0
Designing clarity & control.
SECTION HEADER · INTER 600 · CLAMP(32PX, 4.6VW, 58PX) · −1.6PX · LINE 1.02
The section header, with the house em.
LEAD PROSE · DM SANS 400 · CLAMP(16PX, 1.5VW, 18PX) · LINE 1.78

Body text is DM Sans at a relaxed 1.78 line height — built for long case-study reading, not for density. Emphasis inside prose uses the accent italic, never bold shouting.

SYSTEM VOICE · JETBRAINS MONO · UPPERCASE · 0.04–0.22EM TRACKING
The eyebrow · 11.5px · 0.22em · accent
The label · 10px · 0.1em · muted
THE HONEST FOOTNOTE · 9PX · WHERE EVERY NUMBER NAMES ITS SOURCE
NUMERIC READOUTS · TABULAR-NUMS · DIGITS THAT ALIGN IN COLUMNS
96.0428%
08.1163%
11,113.00
FAMILIES LOADED BY THIS PAGE: INTER 400–800 · DM SANS 400–700 · JETBRAINS MONO 400–700. VT323 IS NOT LOADED HERE — IT SHIPS ONLY ON THE RETRO HOMEPAGE, WHICH IS THE SYSTEM WORKING: EVERY PAGE SUBSETS THE FONTS IT USES.
TokenSize → mobileWeightLineTracking
display-xl72 → 36px5001.25−1.44px
display-lg60 → 32px5001.2−1.2px
display-md48 → 28px5001.25−0.96px
display-sm36 → 24px5001.22−0.72px
text-md18px4001.560
text-sm · body default16px4001.50
text-xs / xxs14 / 12px4001.43 / 1.50

Two habits carry the personality. Heroes escape the static scale through clamp() — fluid between a floor and a ceiling, so the headline is composed for the viewport instead of snapped to a breakpoint (the retro terminal pushes to clamp(60px, 13vw, 168px) in VT323). And negative tracking tightens as type grows — headings run −0.02 to −0.04em — while the mono voice spreads out the smaller it gets. Large type gets tighter, small system text gets looser: that tension is the typographic signature of the whole site.

06 · Seven Principles

Rules that are enforced, not aspirational.

The design principles live in the repo as working agreements — loaded into every AI session, checked in review, and auditable in the shipped pages. Each one names where it's enforced.

01
Read the trace, not the number

Evidence before verdicts, everywhere: the AEGIS drills show source pips and dissent before you classify; stat blocks carry mono footnotes naming what each number is.

02
Systems, not screens

Every value traces to a token; every surface designs its empty, loading, error, and longest-content states. Enforced by the never-hardcode rule and the state checklists in the design docs.

03
One idea per view, one accent per screen

If a screen needs a legend, it's doing too much. The accent discipline is written into the design-system rules and visible on every page of this site — including this one.

04
Meaning survives without color

No saturated red/amber/stoplight-green as status, ever; coral is the strongest risk signal, and every signal pairs hue with text or shape. The one severity scale (CTOC's) re-tints per theme and never stands alone.

05
Accessible by default

WCAG 2.2 AA / AODA as a target with a standing audit file the rules require to be kept current — 4.5:1 contrast in both themes, visible focus everywhere, 44px targets, real keyboard paths in every game.

06
Motion with intent

Animation explains a state change or directs attention — never decoration — and every animated component gates on reduced motion. The kill switch is layered: a global rule, per-module early returns, and per-page media queries.

07
Robust by construction

Self-contained files, isolated inits, stage-anchored overlays, guarded storage. The site is built to survive slow networks, transformed embeds, and its own future edits.

07 · The Shell

Components? You're looking at them.

There is no component library — there's a convention, realized inline on all 20 case pages and documented in the design-system docs. The sticky glass nav above you, the case-study switcher inside it, the version pill floating at the bottom of this page, the numbered eyebrows, the reveal-on-scroll sections: that's the shell, doing its job right now.

Because the specimens are live, this section can demo instead of describe:

LIVE SPECIMEN · EYEBROW + PILL CTA + STAT VISUAL — RENDERED BY THE SAME CSS AS THE REST OF THIS PAGE
The Eyebrow · Mono · 0.22em Tracking
The pill CTA

The recurring parts: the .win browser frame around every screenshot (its traffic-light dots are the only place those hues appear — decorative, aria-hidden, never status); full-bleed gradient bands for chaptering; data-reveal entrances staggered by an IntersectionObserver and hard-disabled under reduced motion; and stat blocks whose graphics are role="img" with sentence-length labels for screen readers. New components follow the variant/state model in the docs before they earn a place in the convention.

08 · The AI Pair

A machine-readable brief, a standing pair.

The site is built with Claude Code as a standing AI pair — and the repo is structured so the pair can't go off-brief. The design intent lives as files the model loads every session: the project context, the full design reference, and four rule files covering the design system, accessibility, code style, and content voice. The design system stops being documentation humans consult and becomes an operating contract both human and model execute against.

The loop is the same every time, and it's the section after this one made procedural:

1
Brief

Intent expressed in natural language against the written system — the constraint files ensure generated output lands on-token, on-voice, and accessible rather than as generic AI defaults.

2
Build

The pair executes volume — research fan-outs, prototypes, refactors — inside the conventions. New work is researched before it's designed; the slot was built against 2025–26 casino UX conventions and the gambling-research literature it inverts.

3
Drive the real page

Playwright opens the actual pages, clicks the actual buttons, plays the games to game-over. Changelog entries close with proof: "verified: sub-pixel placement error at 0.8×, 1.0×, and 1.3×."

4
Judge

The human role concentrates in judgment: setting the thesis, choosing among directions, naming tradeoffs in the decision log, rejecting on taste. Adversarial review hunts what confirmation misses.

5
Ship, on the record

Decisions land ADR-style with named alternatives; the changelog reads as narrative, not just diffs; the colophon regenerates so the build record stays true.

09 · Live It · Receipts

The review that caught the math.

The best story in this site's build log is a bug. The Parlay Reels slot published its return-to-player as ~96% — verified, the page said, over ten million simulated spins. An adversarial review re-derived the math independently and found the coded engine was actually paying 95.916%: free-spin scatter pays were missing the ×3 multiplier the interface promised on three separate surfaces. The gap was 0.127 points — small enough for a ten-million-spin Monte Carlo to hide inside its own noise, which is exactly why the review enumerated instead of sampled.

One line fixed the engine; the published figure became exact: 96.0428%, derived analytically over all 68,883,048 stop combinations. The derivation is fast enough to run right here. Press the button — your browser re-computes both engines from the same constants the slot actually spins on.

Run the receipts — re-derive the RTP
NOTHING UP THE SLEEVE: THE SIX FIGURES THAT APPEAR HERE ARE COMPUTED ON CLICK, IN THIS TAB, FROM THE REEL STRIPS AND PAYTABLE MIRRORED OUT OF PARLAY-SLOT.JS

The same culture runs site-wide. The accessibility audit reports 23 of 27 pages clean on the automated scan — and then states its own limits: "automated tooling reliably catches only ~30–50% of WCAG criteria. A pass on the axe scan is necessary, not sufficient." A cursor bug got a root-cause narrative and a comment warning future editors; a fix that regressed got caught, explained, and re-fixed the same day, on the record. Shipping gates on evidence, not vibes.

10 · The Build Record

Every number derived, never typed.

The colophon at the bottom of every page — including this one — is a generated file no one is allowed to hand-edit. Its rule is the site's honesty policy in miniature: each stat is computed from a source of record at release time.

StatDerived from
SITE ESTThe first commit's date — git log --reverse
DEPLOYMENTSThe GitHub Pages deployments API, paginated, with the UTC timestamp converted to local time so an evening deploy can't read as tomorrow
VERSIONComposed as v{generation}.{case studies}.{commits} — the case-study count comes from globbing the showcase files, so publishing this very page bumps it to 11
LINES · PAGESCounted from the working tree with every generated file excluded — the count doesn't flatter itself
OFFLINE FALLBACKIf the API is unreachable it reuses the last generated values rather than guessing — and warns

Scroll to the bottom of this page and you're reading its output, live. The same pattern carries the whole site: the sims say what they simplify, the concierge's own header forbids it from claiming to be an LLM, and the analytics load only after explicit consent — or not at all.

12 · Outcomes & Reflection

What a portfolio can prove.

The outcome is the site itself: a solo designer shipping at team velocity — 29 pages, 9 playable systems, 100+ deployments in under a month of calendar time — without a line of unverified AI output landing on the record. The craft claims are checkable because the checking is built in.

WHAT WORKED

Writing the design system down as executable working agreements — then letting both human and AI build against it. Verification as the shipping gate, which turned AI velocity from a risk into the whole point. And honesty as an editorial spine: the mono footnotes, the derived build record, and the self-caveating audit earn more trust than any polished claim could.

WHAT I'D PUSH FURTHER

Four pages still carry automated-scan findings — the audit names them and they're next. Two token systems is a documented tradeoff, not purity; a future pass could unify them behind one semantic layer. And the hand-curated mobile switcher menus are the last place a case study can be added by hand and missed — the kind of drift this site exists to make impossible.

The through-line is the portfolio's thesis, applied to its own making: the model brings receipts, the designer keeps the decision. That was the argument in the defence work, the lighting work, and the gambling work — and it turned out to be the working method for building the argument itself.

Next: Goals-Driven Fintech Read the source
Version Quick tour Deep dive