Toge design system · Sprout Solutions

Easy to launch. Hard to keep.

Nine products, one design system, and the two migrations it took to make it survive.

Role
Design system lead
Company
Sprout Solutions · HRIS
Timeline
2022 – 2026
Team
Design + frontend, every product
The Toge design system documentation site: foundational styles, component library and getting-started guidesOpen the Storybook
Toge — the foundational styles and component library the nine products ended up sharing.
products
9
years
4
migrations
2
start reading
Act one

Getting it adopted

A system is easy to launch. Getting nine products onto it, without asking anyone to stop shipping, is the whole job.

01

Final_Final_UseThisOne

I moved to another product team and opened their Figma. Final_V2. Final_Final_UseThisOne.

The files weren't the problem. Nobody could tell which one was true.

02

Nine dialects of the same UI

Ten years of building on top of what was already there. Customers moved from HR to payroll to the full suite and felt every seam — same brand, different rules.

Nine products, nine buttons
SaveSAVESave changesSaveSubmitsaveSaveSave NowOK

Every one of these was a reasonable local decision. Nine reasonable local decisions don't add up to one product.

03

Foundational styles, components, governance

Three layers, in order. Foundational styles: one definition of color, type, spacing, radius — any designer proposes a change, the whole design team reviews it. Components built on top, documented in Storybook.

Then governance, which is the layer that actually decides whether a design system survives. Teams don't request components here. They contribute them — needing one is how you end up owning one, alongside the roadmap rather than instead of it.

Color
surface-white
surface-hover
border-weak
text-weak
text-strong
accent-primary
Spacing
space-4
space-8
space-12
space-16
space-24
space-32
How a component gets in
  1. Sprint needa team needs a component
  2. Check the systemdoes it already exist?
  3. Check the boardnot listed · backlog · in progress · done
  4. Design reviewspecs written if the design isn't ready
  5. The team builds itinto the system, alongside their roadmap
  6. Code + design reviewboth, every time
  7. Deploy to the systemeveryone gets it
The boardDuplicate work becomes visible before it happens.
The weekly syncTwo teams needing the same component become one team building it — a primary team, and support roles.
04

The migration nobody had to stop for

No freeze, no rewrite. Teams upgraded a screen when they already had it open. Slower than a rewrite, and the reason it survived real deadlines.

Foundations, components, file structure

Designers can't adopt what they can't find. We cleaned the room before building anything.

before
after
The core product, every screen — before the system, and after
05

What broke

Edge cases lagged

Happy path documented early, ugly states late. One-offs filled the gap and some are still there.

Habits outlived the code

People reached for the familiar pattern long after the component existed. Docs didn't fix it; pairing did.

Convincing took as long as building

Every conversation restarted from zero until there was a migrated screen to point at.

06

Where it stood

One foundational-style layer, one component library, public docs, and nine products that finally looked like one company.

Coverage
87%component coverage
Sources
9 → 1sources of truth
Adoption
3 qtrto adoption
Act two

Getting it adoptable

A year later the system was fine and the way we shipped it was the problem.

It held for a year.

Then the thing that made the system easy to distribute made it impossible to change.

The system was never the problem. The package was.

07

Version drift

Every product pinned a version and stopped upgrading. Releases became ceremonies. A year in, we had the 2022 problem again — this time wearing a package.json.

One library, three truths
  • Product A@design-system: 1.2.014 releases behind
  • Product B@design-system: 2.0.36 releases behind
  • Product C@design-system: 2.4.1current
08

Nobody could change it

The components lived in another repo. That made the same thing impossible for two very different consumers — a team that needed one hover state, and an agent that couldn't read the source at all.

What it takes to change one component
A team needs one hover state
  1. Patch the third-party library
  2. Re-verify with the other teams
  3. Deploy to the production design system
  4. Now the team can use it
An agent writes the screen
  • Sees node_modules — opaque
  • Reads the .md docs instead
  • Matches the look, invents the code
Resembles the system. Isn't on it.

Prose documentation isn't runnable code. The agent matched the look and invented the implementation.

09

The second migration

We piloted the shadcn model on one product — Agentic Implementation — then broke from the package. Adoption was fast because everyone could already see the old model wasn't sustainable.

Source lands in the repo; foundational styles stay the contract. Teams own the file, agents read the real rules, and a needed variant stops being a fork.

  1. Run it▸ add choiceboxsource redacted
  2. It drops a filecomponents/ui/choicebox.tsxyours now — editable, reviewable, diffable
  3. It reads your stylesSame component, re-skinned by foundational styles alone.the prototypes on this site are the proof
10

Proof: one prompt, a real screen

The argument for moving off our published component library was hard to make in a deck. So we built the same screen twice and watched an agent try to help.

Click between the two models. Same prompt, same screen — the only variable is how much of the system the agent can read.

Same prompt, same screen
01The prompt
payroll-web · agent
/* context */src/components/ui/ — 41 filestokens.css — 260 vars
> Build the payroll approval table: bulk approve, exception badges, sticky totals row. Use our existing Table + Badge.
enter to run · ⌘K for files
A consultant's actual request, typed by the designer.
02Working
complete
read ui/table.tsxread ui/badge.tsxmatched token --surface-raisedwriting PayrollApprovalTable.tsx
It reads the components before writing — impossible when they were a black-box package.
03Rendered
Payroll approvals
All 148Exceptions 12Approved
EmployeeNet payStatus
A. Ramos₱48,200OT
J. Villamor₱52,900ND
M. Cruz₱41,150OK
R. Santos₱39,700OK
Total₱6.1M
First render, unedited. Real Table and Badge, tokens and behaviour intact.

That was the argument. Not that one model is nicer — our components had to be readable by the thing writing most of our screens.

11

What broke

No automatic upgrades

A fix in the canonical component no longer reaches every product on its own. Someone has to re-pull or diff.

Right component, wrong pattern

Literal cards used for single-select, where the choicebox already exists. Freedom to edit isn't knowledge of the system.

Flexible source drifts

Agents edit freely, so borders thicken and card radii stop matching. Small, constant, everywhere.

The freedom that let agents work is the same freedom that lets them drift. Governance now has to catch what a version number used to.

12

Where it stands

Foundational styles are the contract, the registry can diff a copied component against upstream on demand, and Storybook is what keeps behaviour consistent across repos. The rest of the drift problem is open.

What's different is what a screen costs now. An agent reads the real components and the real styles, so what it generates is on-system by default instead of a lookalike someone has to unpick.

13

What I'd do differently

From act one
  • Write the migration guide first, not last.
  • Document the ugly states early — empty, loading, error, too-long label.
  • Stop selling. One migrated screen convinced more people than a year of explaining.
From act two
  • Ship the lint rules with the freedom. Copy-in without a token check is an invitation to drift.
  • Treat the registry as a product, with a changelog teams can read and a diff they can run.
  • Teach the pattern, not the component. A team that knows why the choicebox exists won't reach for a card.
Toge is public

Foundational styles, every component, and the states teams actually ship — the same library the nine products read from.

Open the Storybook