Why Design Systems Fail (And What to Do Instead)

Design Systems

Most design systems start with good intentions. A team gets tired of rebuilding the same button for the third time, so someone proposes a shared component library. Six months later, you have a 200-page Confluence wiki, a dedicated "design systems team" of four, and engineers who still copy-paste from old projects because the official components are too rigid.

The problem is not the idea of shared components. The problem is that design systems often become bureaucratic overhead disguised as productivity tools. Every new component needs a proposal, a review, an accessibility audit, and three rounds of feedback. By the time it ships, the team that needed it has already moved on.

Image

Design system component library — Figma

What works better is what I call a "living kit" — a small set of primitives that are intentionally incomplete. Instead of shipping a fully-styled, fully-documented Button with 14 variants, ship an unstyled, accessible button primitive and let teams compose on top of it. The constraint forces consistency at the behavioral layer while allowing visual flexibility.

The teams I have seen succeed with this approach share one trait: they treat the design system as a product with users, not a mandate from above. They measure adoption, not compliance. They ship fast, deprecate freely, and accept that some inconsistency is the price of velocity.

Key insight: Treat your design system as a product with users, not a mandate from above. Measure adoption, not compliance.

The living kit starts with three primitives: a base button, a base input, and a base card. Each handles only behavior and accessibility. Teams compose visual layers on top using design tokens. This keeps the behavioral contract stable while allowing visual flexibility across products.

The key metric shifts from 'are all teams using the same button?' to 'are all buttons accessible and keyboard-navigable?' Consistency in behavior matters more than consistency in appearance.