Case study:This Portfolio

Case 04 · Design systems

This Portfolio, Built From Measured Rules

Problem

Readers found my dense case studies hard to follow.

What I did

I turned a film-interface style into rules the site has to pass.

Reading column vs a rail

2.1×

CodeMedian

Lowest text contrast

4.77:1

CodeAA 4.5

Self-measured

Type
Personal project
Role
Designer · Researcher
Scope
Research · System · Build
When
Apr – Oct 2026
Code
With an AI coding agent
Fig 01The four cases on the light table1440 × 900View
The landing's light table: this case's card open on the left, and the four cases as folders on a dark sea of dots, each with its ring, Case 04 locked on.

01Context

The first version was a game, and readers got lost in it

The first version told my cases as a game-like conversation, and readers found them hard to follow.

My work is enterprise tools: an AI that investigates outages, a compliance tool, a loan app used in the field. Each case is long and technical. The first version of this site, live in spring 2026, told them as an interactive experience: an illustrated me to talk to, questions to pick, text typed out line by line, a guided path walked with the arrow keys. When I tested it, readers found the cases hard to follow.

Fig 02Version 1, opening a case1440 × 900View
A case in the first version of the site: a “Use your keyboard to explore” tutorial over a blurred, NDA-locked screenshot, the sections listed on the left, and an illustrated avatar below offering questions to follow.

Version 2 cleaned it up, but the cases were still a conversation with an avatar.

A second version that summer kept the idea and cleaned it up, with real screenshots on the cards and articles beside the cases. The cases still came as a conversation with an avatar.

Fig 03Version 2, the landing1440 × 900View
The landing of the second version: an illustrated avatar beside an introduction, four question buttons, and three project cards with screenshots and a metric each.

This version had to make long stories easy to read, and not look like a template.

So this version started as a reading problem. The site had to make a long story easy to take in, at whatever depth a reader has time for. And it still had to look like it was made by a designer, not picked from a template.

More detail

Who it's for

Hiring managers and design leads, often on a laptop between two meetings. They give a case a minute before deciding whether to read on.

So every case reads at three depths. Skim tells the story in about two minutes, Read is the case, and Full adds the deep dives. The depth is a switch on the page, not three separate pages.

02Research

Film interfaces, measured instead of copied

I reproduced twelve film-interface screens and measured them, instead of copying the look by eye.

I kept the dark ground and the voice, now a quiet line in the side rail, and dropped everything a reader had to play through. For the look, I wanted the feel of the interfaces designed for films: dark screens, thin rules, readouts you take in at a glance. But a style copied by eye turns into a generic dark theme. So I reproduced twelve of those screens in Figma and measured them: how much of the screen is lit, how many text sizes, how bright each tier of text is.

Each finding was graded: rules hold everywhere, defaults bend only with a reason.

Every finding got a grade for how sure I could be of it. A rule held on every screen I measured; a default held on most, and bending one needs a written reason. The rest were per-screen choices, the signature of one source, or decisions of my own.

01

13 rules

Hold on every screen measured. The interface lights only 5–17% of the screen. Text uses one cool ink, in at least three brightness steps. The biggest text is a title or a number, never a paragraph.Hold everywhere: little of the screen lit, one ink in three steps, numbers and titles biggest.
02

15 defaults

True on most screens. Detail sits around the main panel, which stays plain and roomy. Five to seven text sizes, with big jumps between them. Every value has its label touching it.True on most: a plain main panel, five to seven text sizes, labels touching values.
03

14 decisions of my own

Where reading on the web needs what a film screen doesn't: body text at 19 px with 1.5 line spacing, lines of 55–75 characters, and every text at 4.5:1 contrast or more.Where the web needs more: bigger body text, shorter lines, AA contrast everywhere.

More detail

Why grade the rules

A pattern that held on one screen and broke on another isn't a rule. Treating it as one would have pulled every page toward that one screen.

Grading kept the system honest about what it knew. The rules are fixed, the defaults bend with a reason, and my own decisions are mine to change.

03What didn't work

Following the rules still looked like a template

The first drafts followed the rules and still looked generic: everything had the same importance.

This version went through several drafts in Figma before any code. The first ones followed the rules, and still read as generic. A critique pass found why: everything had the same importance. Six lit chips used as headings, five ways to start a section on one screen, eleven text sizes, some of them one pixel apart.

Fig 04Draft 5, critiqued1440 × 1024View
The fifth draft of the case page with numbered pins: red pins mark ten problems, worst first: the rails taking as much light as the reading column, lit chips used as headings, five header styles; green pins mark what to keep.

Measured: the right rail held 37% of the light on a quarter of the width.

To see it, I measured where the eye goes: the share of bright pixels in each column. The reading column took 45% of the light on half the width. The right rail took 37% on a quarter of it, and the brightest thing on the page was a button.

Fig 05Where the eye goes, draft 5900 × 807View
The fifth draft of the case page as a heatmap of bright pixels: hot spots on every lit chip and the brightest on the READ button in the right rail. Under it, the share of light: left 18%, centre 45%, right 37%.

More detail

What rules can't do

Rules describe what the reference screens have in common. They can't say what a screen is about, so a screen that follows them can still have nothing to look at first.

From then on every screen had to answer three questions: what is it about, what does it have that no other screen has, and which details carry real information.

04Decisions

Hierarchy is a budget of light

The reading column must hold 1.2× a rail's attention. Dimming the rails did it; colour didn't.

I set a target I could measure: the reading column holds at least 1.2 times the attention of either rail. Colour didn't get there; I tried four palettes and every one failed. What worked was taking light away from the rails: one ink tier dimmer, one size smaller, thin numbers, and the framed panel back on the reading column. Preview D was the first to pass, at 1.26.

Fig 06Draft 5 and Preview D, same content1440 × 1024
Preview D of the same page on a black ground: dimmer rails with plain labels, thin numbers, and the reading column framed and brightest.
01

Colour on objects, not text

My navy ground was the same hue as the text, so the screen read as one colour. A neutral black ground with one teal ramp fixed it, but only once the figures, tags and the one control that's on carried the colour.A black ground and one teal ramp, carried by figures and tags, not text.
02

Quiet buttons

Coral buttons pulled more attention than the content. Now the choice that's on is a lifted fill with a bright outline, the rest are dotted outlines, and coral only ever means live.Buttons went quiet; coral only means live.
03

One style for every diagram

I took one of my own diagrams and changed one thing at a time, in four steps, against the rules. The third won: colour means category, from five colours the page already has, flat, no glow.Every diagram uses one flat, five-colour style.

05The system

Every rule is a check the build has to pass

One token file writes the CSS, and the build fails when a rule is broken.

Rules in a document drift. So every value lives in one token file that writes the CSS, and the build fails on a broken colour reference, text under 4.5:1 contrast, a size below the floor, or a raw value in a component's styles. The Figma variables are checked against the same file, so design and code can't quietly disagree.

Fig 07The token studio, contrast1440 × 900View
The site's token studio: every text colour checked against every ground it can sit on, each with its contrast ratio, 29 of 29 passing.

Each page loads at most 90 KB of JavaScript, so it arrives fast and finished.

Speed is a rule too. Each page loads at most 90 KB of JavaScript before it works, so the site has its own small router instead of a routing library, and every page arrives as finished HTML.

Motion only where something changes

Text never moves; motion marks a change, sound is off by default, reduced motion is complete.

Reading stays still. Motion happens at a change: the camera tilts from the hero down onto the cases, a ring lights once to say there's more below, a diagram draws itself in the order you'd read it, then stops. Sound is off until you turn it on, and with reduced motion every value is simply there.

Fig 08The hero, where the camera starts1440 × 900View
The portfolio's landing: the headline “Enterprise tools people understand” over a dark 3D sea of dots, with a lit ring and a “Selected work” tag on the horizon.

More detail

The limits I set on motion

Nothing loops on a reading page. The ring's call ends within four seconds, and nothing flashes more than three times a second. A scroll is never taken over: a fast swipe stops at each case once and then lets go.

The sea is a real 3D terrain now, drawn on the graphics card. It loads once the page is idle, and without it the page is the same, flat.

06Working with AI

An AI agent wrote the code; the rules said what good looks like

An AI coding agent wrote the code. I set the standard and judged the result.

I wrote little of the code by hand. An AI coding agent did, working from the graded rules, the tokens and the Figma frames. My job moved from making every screen to setting the standard and judging the result.

The rules became a guide the agent reads first, with scripts and an audit for AI tells.

The rules became a guide the agent reads before any design work, with scripts that measure a screenshot against them. When generic design advice pulled the look back toward a template, the guide won. It also lists the tells of AI-made design, and every screen is audited for them.

Fig 09An audit for AI tells1440 × 1024View
Preview D of the case page with pins: red S pins mark tells of generic, AI-made design, such as a hand-drawn stand-in cover and a waveform with no sound behind it; green K pins mark what passes, such as real figures and one place to look.

It got things wrong; I caught them by looking, on my own screens.

It still got things wrong, and the fixes came from looking. Folders built to the rules looked, in my words, “flat and meh, like we gave up”, so they became real folders, with flaps and the case's screen tucked inside. On my own laptop, the scroll through the cases fought my trackpad; the tests had passed, my hand hadn't.

More detail

How a change gets made

I say what's wrong, in plain words. The agent finds the rule it breaks or proposes a new one, builds the change, measures it and runs the audits: contrast, accessibility, interface guidelines.

I review it on my own screens before anything ships. A rule that turned out wrong is changed in the guide, with the reason, so it stays fixed.

07Impact

The case studies became the brightest thing on the page

Reading column vs a rail

2.1×

CodeMedian

Lowest text contrast

4.77:1

CodeAA 4.5

JavaScript, heaviest page

85 KB

CodeOf 90

Self-measured

Measured, not client-reported. Whether readers follow the cases better is the next test.

No client numbers here; this one is measured. On every screen of this page the reading column holds more attention than either rail, 2.1 times on a typical one. Every text passes AA contrast, the lowest pair at 4.77:1, and the heaviest page loads 85 KB of JavaScript. Whether readers follow the cases better is the next test, with the same readers as before.

Fig 10From a dark theme to a reading instrumentDiagram

A style is a look. A system is the reasons, written down where a build can check them.

01 · 2025Enterprise IT opsShipped

Agentic AI for Enterprise IT Operations

An AI that finds out why systems break. The hard part was getting engineers to believe it.

Mean time to resolve

−92%

Client-reported

Case 04This Portfolio