← Jason Haynes All work

A design system ten products actually use

ClientCity Electric Supply
RoleSole author
Year2022–present
StackFigma → Swift
Figma layer panel before and after: 490 unnamed layers beside the governed structure
Left: the file as inherited. Right: the same screen after the rebuild.

01 The problem

The flagship file had 490 layers in a single frame. Thirty-seven of them sat at the top level. Thirteen were untracked groups with names like Group 12 and Rectangle 4 Copy 85. Eleven things were components; everything else was a copy of something that used to be a component.

Nobody had done anything wrong. This is what a file looks like after three years of shipping under deadline — every rush leaves a copy behind, and copies don't inherit changes.

The cost showed up as time. Changing a color across the scoreboard cards took twenty seconds of hunting. Adjusting a layout took a minute and a half. Small numbers, until you multiply them by every edit, every designer, every sprint — and until you notice that the fear of touching anything had quietly become a design constraint of its own.

A design system isn't a component library. It's a decision about who is allowed to change what, and how fast.

02 Approach

I audited how fifteen mature systems handle the same problems — Stripe, Shopify, Airbnb, Meta, Netflix, Spotify, Dropbox and others — looking specifically at naming conventions and nesting depth rather than at visual style. Style is the easy part. Conventions are what survive a team.

Then I rebuilt one screen end to end as a pilot before touching anything else, working through five layers in order. Each one had to hold before the next made sense.

Layer panel comparison highlighting naming conventions replacing generic layer names
Naming was the first pass. A layer called Card/Notification can be found, reused, and reasoned about. Rectangle 4 Copy 85 can only be scrolled past.

Layout

Flatten the frame, name every layer to a convention, and make the panel legible top to bottom. If you can't read the file, you can't govern it.

Hierarchy

Group by meaning rather than by proximity. A card's contents belong to the card, not to whatever happened to be selected when someone hit ⌘G.

Components

Fix dimensions, define variants, and make the naming predictive — if you can guess the name, you can find the component without searching.

Spacing

One scale, applied everywhere. Odd values were the tell for where something had been nudged by hand.

Architecture

Nested components and a single color scheme, so a change at the library level propagates instead of requiring a sweep.

Library layer count before and after: 607 reduced to 255
Library component count before and after: 80 reduced to 32

One change at the library level reaches every frame that consumes it. That relationship is the entire product.

Component architecture map showing Core, iOS, Android, Web and Singles libraries
The architecture that came out of it: one core library, with platform-specific layers for iOS, Android and web that can be switched on or off per market.
Color token sheet
Typography token sheet

Color and type tokens. Decided once, applied everywhere — the part that makes localization a switch rather than a rebuild.

03 Two decisions worth defending

Component count went up, on purpose

Components in the pilot frame rose from 11 to 16 — a 45% increase, in a project otherwise reported as reductions. That was the goal. Loose layers became governed components. The number that mattered was total layers falling by 26% at the same time: fewer things, more of them under control.

I've since learned to lead with that when presenting to engineering, because "we added components" and "we simplified the file" sound contradictory until you show both numbers together.

I measured the edits, not the file

File size dropped 9%, which is the kind of metric that sounds like progress and changes nothing. So I timed the four edits designers actually perform all day — resize, retype, recolor, relayout — before and after, with a stopwatch.

That reframed the conversation. Nobody approves a refactor to save 200 kilobytes. They approve one that gives a designer back most of an afternoon.

Layout adjustment timing before and after: 1:29.94 reduced to 0:04.43
Layout adjustment fell from 1:29.94 to 0:04.43. The others followed the same pattern.

04 Results

Measured on the pilot, then applied across the portfolio.

−60%Library components
80 → 32
−58%Library layers
607 → 255
−100%Untracked groups
13 → 0
−95%Layout edit
1:29.94 → 0:04.43
−76%Color edit
0:20.09 → 0:04.76
~10Products now on
the system

The systems are now the single source of truth for component, pattern, and platform decisions across the organization — and I'm no longer required in the room for most of them.

05 What I'd do differently

I built the system before I built the case for it. The pilot was finished before anyone outside design saw a number, which meant I spent the first month proving something I could have gotten agreement on in a week. Now I time the edits first and present that, then ask for the room to fix it.

I under-documented the conventions. The naming scheme is legible once you've seen it and invisible until then. A one-page rulesheet would have saved every conversation that started with "which component do I use here."

The thing I'd keep: rebuilding a single real screen end to end before proposing anything. Every argument I needed later came from that one file.