Scalability Cross-platform

Design System

Revamped a loose Figma guide into a token-bound library — then taught it to grow itself with AI agents.

When I joined, “the design system” was a rough Figma style guide — shared elements pulled from the live app, but no real components and no tokens. With our other designer I co-led the rebuild into a true library: real components with full property sets, semantic tokens, and parity across mobile and web. To keep it growing without more hands, I built a pair of AI agents that create and review new components against our tokens and HIG/Material rules.

RoleProduct Designer
Timeline2 weeksMaintenance ongoing
ScopeMobile & WebiOS · Android · Responsive web
Team2 designersLibrary co-led 50/50
Tooling Library, variants & AI agents in Git
My Contribution120+ components · AI agents400+ variants · two-agent workflow
Where We Started

A style guide,
not a system

The starting point was a Figma file used as a reference — consistent-looking elements pulled from the live app, but nothing was a real component. Every new screen meant redrawing or copy-pasting from the guide; values drifted between the two of us; and there was no way to ship dark mode or retheme without editing every file by hand. Spanning mobile and web with two designers, that simply didn’t scale.

Before
Reference file
Shared elements lived in one Figma page, used as a visual reference.
No components — just frames
No tokens — raw hex everywhere
No variants — copy-paste per state
No instance swap, no overrides
Inconsistent — values drifted between us
Mobile only
After
A real library
A revamped library of true components, each with the full property set.
120+ components, fully built
Semantic tokens, light & dark
Variants for every state
Boolean, instance swap, text, instances
One source of truth — zero drift
Mobile & web parity
Process

From style guide
to autonomous system

Four phases, each one removing more friction from the design workflow.

01
Phase 01
Gather
Pulled together the atoms we reused most across screens — the recurring elements — from a rough style guide with no real components or tokens yet.
02
Phase 02
Revamp
Rebuilt the library as real components with properties — variants, boolean, instance swap, text, instances.
03
Phase 03
Expand
Extended from mobile to web with shared tokens and platform-appropriate primitives.
04
Phase 04 · Now
Agents
Built a DS Agent — builder.md + evaluator.md — to automate creating and reviewing components.
A note on scope

Under NDA — the Mobile & Web assets that follow show only a small slice of the system; the full component set and production details can’t be shared publicly.

Mobile

Mobile foundations
& components

Implemented the iOS & Android library from the ground up — a type ramp, a spacing scale, and a set of componentized primitives. Every fill, stroke, and dimension binds to a semantic token, so light/dark themes and platform variants flow through the whole library from a single source.

Foundations
The visual foundations
The base layers every component is built on — Color, Typography, Layout, Icons, Logo, and Visuals — each defined once as tokens and styles.
Components
The componentized library
Each rebuilt as a true Figma component — variants, booleans, instance swap, text properties, nested instances — with every value bound to a token.
The library, at a glance

One token core,
the whole dark system

Every primitive above binds to the same semantic tokens — so the entire library retheme­s to dark from a single source, no redraws. The mobile set, rendered on its dark surface, before the same core extends to web.

InputInput — dark theme
SearchSearch — dark theme
ChipsChips — dark theme
ControlControl — dark theme
App barApp bars — dark theme
TabsTabs — dark theme
SegmentedSegmented buttons — dark theme
NavNavigation — dark theme
LabelsLabels — dark theme
Sheet headerSheet header — dark theme
ButtonsButtons — dark theme
CardsCards — dark theme
ListsLists — dark theme
CellsCells — dark theme
ProgressProgress indicator — dark theme
MenuMenu — dark theme
DialogDialog — dark theme
BannerBanner — dark theme
Web

Web parity —
same tokens, wider canvas

Extended the system to web with a shared token core. The type scale opens up for desktop reading, layout moves to a wider column grid, and the component set adds the web-native primitives (sidebars, data tables, toolbars) on top of the mobile foundations.

Foundations
Web foundations
Same token core, opened up for desktop — a roomier type ramp with longer line lengths and bigger display sizes, on a wider baseline grid and multi-column layout sized for dashboard density.
Components
Web component library
Several component sections live under the Web split in Figma. Each ships as a true component with full property sets — size, behavior, state — mapped to the shared token core.
Responsive web Same tokens as mobile
Watch

Native to the wrist —
watchOS & Wear OS

The newest surface for the system, on both wrists. Rather than shrink the phone UI onto a 1-inch screen, I built the watch set on each platform’s native foundations — Apple’s watchOS and Android’s Wear OS title and card patterns — then layered our own brand components on top. It reads as native to each platform while staying recognisably ours, and still binds to the same token core as mobile and web.

Apple Watch
watchOS
Native watchOS title and card patterns, with the brand button set and pickers built on top — each bound to the shared token core.
Android
Wear OS
The same set on Wear OS — native Wear OS title and card patterns under the brand button set and pickers. Visibly different from watchOS, yet built from the one token core.
Apple Watch · watchOS Android · Wear OS Same tokens as mobile & web
Two-Agent Flow

Automate the build,
gate the publish

A 2-designer team can’t scale linearly with the product. So I built our component-creator skill as two agents — builder.md and evaluator.md — that automate the repetitive half of design-system work. Both follow one rule: every built component is a 1-to-1 mirror of its source frame — bind tokens, expose every property, never invent or silently “fix.”

how a component ships
automated
source frame builder.md build report evaluator.md pass / hold
then
human gate publish
builder.md
Agent · Builder
Clones a frame — adapts, never rebuilds
props variant axes, booleans, text & swaps
tokens raw hex bound, 44pt (iOS), 48dp (Android) touch target
overrides copied across all four layers
proof built vs. source, side-by-side
evaluator.md
Agent · Evaluator
The gate — recommends, never edits
two passes visual render + API read, both must pass
fidelity radius, padding, size, position match source
standards HIG / Material, tokens, AA, 44/48 tap
holds any drift or mismatch blocks publish
Impact

What changed

The biggest pain for a 2-person team was time. Componentizing the library bought back hours and the agents bought back days — but the bigger payoff came later, when the same token core became the launchpad for a brand refresh.

Phase 01 Efficiency
Faster by default
Real components and shared tokens cut the redraw-and-copy-paste work; the agents took over the repetitive build-and-check loop. A 2-designer team started shipping at the pace of a much larger one.
0 → 1Style guide to true library
100%Values token-bound
Phase 02 Foundation
A stepping stone
to the rebrand
Because every value binds to a token, the system became the base layer a full visual rebrand could stand on — retheme the tokens once, and every component follows. The library didn’t just speed up today’s work; it turned tomorrow’s redesign into a config change, not a rebuild.
Reflection

What I Learned

Adapt before you create. A 2-person team can’t out-work a growing product, so most of my calls optimized for leverage over short-term speed. The builder treats “make a new component” as a last resort — it adapts an existing one by default. Reuse is what keeps a library coherent; every net-new primitive is a future maintenance cost.

Fidelity over cleverness — and a gate to enforce it. The hard call was making the AI boring — a 1-to-1 mirror of the source frame, never inventing or silently “fixing,” because a design system that quietly improves things is a system you can’t trust. So builder and evaluator are split on purpose: an independent gate — one that can recommend but never publish — catches the drift that self-review rationalizes away.

Tokens first, even when slower. Binding every value to a semantic token cost time up front and felt like overkill at a dozen components. It’s exactly what later turned a full rebrand into a config change instead of a rebuild.

The real test is organizational, not technical. The agents are the newest piece — whether a teammate who didn’t build them can drive them, and whether the evaluator’s bar holds as components get more complex. Designing for that hand-off is where I’d put the next round of work.