Case study 04 · Design systems · Open source

Designing an open-source design system, with Claude as my build partner

Aa NAD is a universal, monochrome, accessibility-first design system for web and mobile. I designed and shipped it end to end: code, docs and a Figma Community library anyone can use.

Aa NAD Design System Figma library cover
one system, three themes, any brand
swap 11 tokens, get your brand ;)
OPEN SOURCE · MIT
TypeSelf-initiated, open source
RoleDesigner and system owner
PlatformWeb + iOS / Android guidance
Build partnerClaude (Cowork + Claude Code)
Statusv1.2.1 · updated weekly
(01) Snapshot

Snapshot

Aa NAD is written so designers, developers and AI coding agents can all follow it. The idea is “bring your own brand”: the base is monochrome, and swapping 11 primary-colour tokens recolours every component. I set the direction and made every design decision; Claude was my engineering partner for the build, contrast testing, interaction tests and a Figma plugin that generates the library from code. One source of truth, published to GitHub Pages and Figma Community, and still growing every week.

249design tokens
45React components, every state
3 themesLight, Dark and High contrast at WCAG AAA (7:1)
29 / 29core checklist components, plus 16 more

Counted from the repo and the Figma file at v1.2.1.

(02) The problem

The problem

Most design systems are a Figma file or a code library, rarely both, and almost never written for the AI agents that now write a lot of UI. Four gaps kept showing up:

PROBLEM 01Two sources of truth

Figma and code drift apart the week after handoff. Every fix has to be made twice, and usually only gets made once.

PROBLEM 02Accessibility as an afterthought

Contrast checked by eye, states missing, keyboard and screen-reader behaviour left for developers to guess.

PROBLEM 03Locked to someone else’s brand

Free kits ship a brand of their own. Re-theming means detaching components and repainting by hand.

PROBLEM 04Not written for agents

Docs are written for humans who skim. An AI coding agent needs rules it can follow without guessing.

so the brief: one system, one source of truth, readable by people and machines.

(03) Goals

What success looked like

For the system
  • One source of truth. Figma is generated from code, so the two can’t drift
  • Accessibility checked in code. every colour pair tested, every state and keyboard path defined
  • Complete, not just pretty. cover every core component on designsystemchecklist.com
For the people using it
  • Bring your own brand. swap 11 primary tokens and every component recolours
  • Usable on day one. load the tokens, the stylesheet and the bundle, no build step
  • Rules an agent can follow. plain-language guides with token names and do / don’t examples
(04) Understanding the users

Who it’s for

Three kinds of people (and one kind of not-person) read a design system. I wrote for all of them at once.

Three readers
DDesigners
Use the Figma Community library

Variables in three modes, text and shadow styles, component sets with variants and swappable icons.

DDevelopers
Ship with the React components

Tokens as CSS, 45 components with every state, keyboard support and screen-reader behaviour.

AAI coding agents
Follow the written rules

Guides that say exactly which token, which component and which state to use, so output stays on-system.

Methods
Benchmark: designsystemchecklist.comStandard: WCAG AA, AAA for high contrastPlatforms: web, iOS and AndroidType test: Atkinson Hyperlegible Next vs RobotoLogo: two directions, full kit each
The key insight

If an AI agent can follow the docs without guessing, a new developer can too.

(05) The approach

Me on direction, Claude on the build

I treated Claude (Cowork and Claude Code) as an engineering partner, not a generator. I set the direction and made every design decision; Claude built, tested and wired it up, and I reviewed every step.

I owned
  1. 01The brief, scope and benchmark
  2. 02Every design decision: colour, type, grid, motion, logo
  3. 03Component behaviour, states and content rules
  4. 04Reviewing every build and calling what ships
Claude handled
  1. 01Building the tokens and React components
  2. 02Contrast testing every colour pair in code
  3. 03Interaction and keyboard tests
  4. 04The Figma plugin that generates the library
The workflow
one loop, repeated every week
01Brief and benchmark
02Foundations as tokens
03Components, every state
04Contrast and interaction tests
05Figma library, generated
06Docs, release, weekly updates
Real bugs I fixed in Figma
Variants not grouping

Component sets came out as loose frames until the plugin grouped them by property.

Icons as solid squares

Strokes weren’t scaling with the shapes, so every icon filled in. Fixed in the plugin, so all 98 at once.

Text overlapping

Wrapped text boxes pushed into the content below. Fixed so layouts reflow.

(06) Design principles

Three rules, six decisions

01Accessible by defaultContrast, focus, keyboard and reduced motion are part of the component, not a checklist after it.
02Brand is a variableMonochrome base, one replaceable primary ramp. Your brand goes in, nothing else changes.
03Written for people and agentsEvery rule is plain enough for a human to skim and precise enough for a model to follow.
The decisions
every one written down, so nobody has to guess
ColourMonochrome base, replaceable primary

A 12-hue palette and semantic colours sit behind a neutral UI. The 11-step primary ramp is the only brand colour.

TypeAtkinson Hyperlegible Next

Chosen over Roboto for legibility: letterforms that can’t be confused, at every size.

Space8px grid, 4px half-step, 4px corners

One rhythm for spacing, sizing and radius, so layouts line up without thinking.

ThemesLight, Dark, High contrast

Every colour pair checked in code. High contrast meets WCAG AAA (7:1) with visible borders and a 3px focus ring.

MotionCalm and precise

Hover and press, controls, enter and exit, loading. All of it respects reduced motion.

AssetsIonicons, illustrations, avatars

Outline at rest, filled when active. 15 black-and-grey line illustrations and 8 illustrated avatars.

(07) The solution

What shipped

Version 1.2 is a complete, working system: tokens, components, guides and a Figma library, all from one repo.

A249 tokensColour, type, spacing, radius, shadow and motion, as CSS and Figma variables.
B45 React componentsEvery state, keyboard support and screen-reader behaviour, from Button to FileUpload.
C3 themesLight, Dark and High contrast, plus follow-the-OS and forced-colours support.
DFigma library207 variables, 22 text and shadow styles, 98 icon components and 15 component sets, all bound to tokens.
EAssetsThe Module Aa logo kit, Ionicons, 15 line illustrations and 8 illustrated avatars.
F6 guidesBrand book, accessibility, mobile, content, motion and contributing, plus iOS and Android guidance.
In the system
click any shot to open it
(08) Trade-offs

Trade-offs & decisions

the safe choice was always there. I mostly didn’t take it.

RobotovsAtkinson Hyperlegible Next

Roboto is everywhere and safe. Atkinson was built for legibility, which is the point of an accessibility-first system.

→ legibility over familiarity.
A branded palettevsMonochrome + one ramp

A colourful default looks better in a screenshot, but forces everyone to repaint it.

→ your brand, not mine.
Hand-built FigmavsGenerated from code

Building the file by hand is faster on day one. Generating it took a plugin and real bug fixing.

→ one source of truth wins by week two.
FocusvsModule

Two logo directions, each with a full kit. Module builds the letters from 8px-grid blocks, the same grid as the system.

→ the logo is made of the system.
(09) Impact

The impact

249design tokens: colour, type, spacing, radius, shadow and motion
45React components with every state, keyboard support and screen-reader behaviour
3 themesLight, Dark and High contrast; high contrast meets WCAG AAA (7:1)
29 / 29core components from designsystemchecklist.com covered, plus 16 more
11primary-colour tokens to rebrand every component
207Figma variables, plus 22 text and shadow styles, generated from code
98 + 15icon components and component sets in Figma, all bound to tokens
6guides: brand book, accessibility, mobile, content, motion, contributing

Counts come from the repo and the Figma file at v1.2.1. This is a self-initiated project, so there are no adoption numbers yet; I’ll add them here as the community file grows.

(10) Reflection

Looking back

“A design system is a list of decisions you only want to make once. Writing them for an AI agent made me make them properly.”

Working with Claude changed what one designer can ship: I stayed on direction and decisions while the build, the contrast maths and the Figma plugin moved at engineering speed. The hard parts were still mine. A disabled switch that read as “off”, an icon set that rendered as squares, a logo that had to earn its place. Next, I want real feedback from people using the community file, and their contributions back into it.

(11) The setup

The setup

RoleDesigner and system owner, solo
Build partnerClaude (Cowork and Claude Code): build, contrast testing, interaction tests, Figma plugin
StackDesign tokens, React, a Figma plugin, GitHub Pages
LicenceMIT for code, CC BY 4.0 for assets
Statusv1.2.1, live and updated weekly
The docs and the file
live, free, and yours to fork
(12) Living log

Still shipping

this section grows every week, as the system does.

Changelog
  1. v1.2.1LATEST

    Figma plugin builds a new cover from live components. Fixed icons rendering as solid squares and wrapped text overlapping.

  2. v1.2.0

    Figma library builder plugin. Open-sourced under MIT and CC BY 4.0 with a GitHub Pages site. New FileUpload. Disabled Switch redesigned.

  3. v1.1.0

    High contrast theme (WCAG AAA). Combobox, MultiSelect, BlockLoader. Calm and precise motion across every component.

  4. v1.0.0

    First release: tokens, 41 React components, the Module Aa logo, Ionicons, illustrations, avatars and the first guides.

Full changelog on GitHub
What I’m learning
Disabled is not off. A dimmed switch read as “off”, so disabled now gets a dashed track and a hollow knob.
Generate, don’t redraw. When Figma comes from code, one plugin fix repairs every icon at once.
Contrast is a test, not a feeling. Every pair is checked in code, in all three themes.
Next case study
Designing an AI-powered clinic SaaS app, shipped in two weeks →
Doctiq cover
Doctiq