← Writing
November 14, 2025
Why Most Design Systems Fail (And How to Build One That Doesn't)
A design system isn't a component library. It's a shared language — and most teams skip the hardest part of building it.
Every agency pitch deck has the same slide: "We build design systems." And yet most of the design systems we've inherited from previous agencies are, frankly, a mess.
Not because the people who built them were bad at their jobs. Because they solved the wrong problem.
A component library is not a design system.
When most teams say "design system," they mean: a Figma file with buttons, a Storybook with some React components, and a README that no one reads. That's a component library. Useful — but not what makes a team move fast over time.
A design system is a shared language. It's the agreement between design and engineering about what things mean, how they change, and who owns what. Without that agreement, you end up with 14 slightly-different shades of gray and a pile of tokens that nobody uses consistently.
The part everyone skips.
The most valuable work in a design system isn't building the components. It's the taxonomy. What do you call the thing? Where does it live? What decisions does it encode, and which does it leave open?
We once spent an entire week — before writing a single line of code — on a single question: is a "card" a layout primitive or a content pattern? It sounds trivial. It isn't. The answer determines how your spacing system works, whether cards can nest, and whether a developer can predict what a card will look like without checking Figma.
When you skip this work, you end up refactoring everything six months later.
How to build one that actually lasts.
Start with constraints, not components. What are the ten decisions you make most often? Spacing increments. Type scales. Border radii. Color meanings. Document those first — they're the 20% that affects 80% of what you build.
Build with your team, not for them. A system that engineers don't understand is a system they'll route around. Write it in the same language they already use. If they're on Tailwind, write your system in Tailwind. If they're on CSS Modules, write it there.
Version it seriously. Nothing kills adoption faster than a breaking change with no migration path. Treat your design system like a public API. Make breaking changes deliberate and rare.
Accept that it will be wrong.
The best design systems we've seen all have one thing in common: they were thrown out at least once. Not because the team failed, but because they learned something. The system you build at the start of a project is always wrong for the team you become six months later.
That's fine. The goal isn't to build a perfect system. It's to build a system that's easy to change.