[ Ionut Dumitru ]
CraftMay 11, 20266 min read

A design system is a product, not a file

Tokens are the easy part. The hard part is adoption, versioning and treating your team as the customer.

Most teams build a design system the way you'd build a library: a folder of tokens, a Figma file, a few React components, a versioned package on the internal registry. Then they wonder why, eighteen months later, three teams are still using the old button, half the screens hardcode hex values, and the design system team has quietly become a help desk.

The mistake is treating the system as an artifact. A design system isn't a file you ship once. It's a product with users, a roadmap, breaking changes, and a support burden — and the moment you stop treating it that way, it rots.

Tokens are the easy part

Naming a color bg-surface-raised and wiring it through Tailwind takes an afternoon. Deciding what happens when a team needs a shade you didn't define — that's the work. The token layer is mostly solved by tooling now. What isn't solved is the social contract underneath it.

Every design system fails at the same seam: the gap between what you publish and what people actually use. You can have a perfect Button component with twelve variants, full keyboard support, and dark mode baked in. If a product engineer can't find it in under thirty seconds, or it doesn't do the one thing their PM asked for by Friday, they will write their own. And theirs will win, because theirs shipped.

So the real metric isn't coverage. It's adoption — how much of the product's surface area actually runs on your system, measured, not assumed. If you can't answer that with a number, you don't have a design system. You have a suggestion.

Treat the team as the customer

The hardest reframe for a design system team is that their users are not end users. They're engineers and designers inside the same building, and those people have deadlines, opinions, and the power to route around you entirely.

That means you owe them the things you'd owe any customer:

  • A changelog they can read in a minute, not a diff they have to reverse-engineer.
  • Migration paths that don't require a meeting. If you rename a prop, ship a codemod, not an apology.
  • An obvious answer to "what do I use for X," because the absence of an answer is itself a decision — and they'll make it without you.

If adopting your system is harder than ignoring it, people will ignore it, and they'll be right to.

I've watched a beautifully documented system lose to a worse one that happened to be one import away and never broke a build. Distribution beats quality more often than anyone in the craft wants to admit. The systems that win are the ones that make the right thing the path of least resistance — defaults that are correct, components that are discoverable, upgrades that are boring.

Version it like you mean it

The fastest way to destroy trust in a system is to break someone's build without warning. Once that happens, every consumer pins to an old version "just to be safe," and now you're maintaining five live versions of the truth — which is the same as having none.

So versioning is a product decision, not a publishing detail. Breaking changes get a deprecation window, a migration guide, and ideally a codemod that does the boring work mechanically.

codemod.ts

// before: Button variant="primary"
// after:  Button tone="brand"
renameJSXProp("Button", "variant", "tone");
remapValue("Button", "tone", "primary", "brand");

Ship the migration, not just the changelog.

When the upgrade is a one-line command instead of a half-day chore, people stay current. When it's a chore, they pin and drift, and the drift compounds until your system is a museum of past decisions nobody can safely touch.

Build the feedback loop, not just the components

A product without a feedback loop is just a guess that hasn't failed yet. Design systems are no different. The teams whose components you adopted in a hurry will find the rough edges first — the missing loading state, the modal that traps focus wrong, the table that can't do the one layout finance needs.

You want those complaints flowing back to you cheaply: a single channel, a triage rhythm, an open backlog people can see themselves on. The signal you're after isn't praise. It's the friction — every workaround someone built is a feature request they were too busy to file.

A design system that nobody can route around is a tax. A design system people choose because it's genuinely the easiest way to ship is leverage. The difference between the two has almost nothing to do with the tokens, and almost everything to do with whether you treated the thing as a product and the team as customers who could walk away. Most of them can. The good ones earn the loyalty anyway.

#Craft#Design SystemsShare ↗
→ / AUTHOR
Ionut Dumitru
Ionut Dumitru

Full-stack engineer and product designer. Writes about building products where the engineering and the design are the same job.

→ / NEXT
ProductMay 4, 2026
The roadmap is a list of things you're not doing
← All writingionutdumitru.com