Skip to content

Design Systems

When to Break Your Own Design System

Move with Design · April 28, 2026 · 6 min read

A design system exists to make the common case fast and consistent — the hundredth form field, the thousandth button, the recurring patterns that make up the bulk of any real product. It was never meant to be the final word on every edge case a product will ever encounter, and treating it that way asks a general-purpose toolkit to do something it was never designed to do: anticipate every future situation in advance, perfectly, at the moment it was built. No system, however thoughtfully designed, can do that, and pretending otherwise sets up a conflict that the system will eventually lose.

The failure mode that actually damages a system isn't breaking it. It's breaking it silently, without anyone deciding to, and without anyone else finding out. A designer under deadline pressure hits a genuine gap — the standard component doesn't fit this particular data shape, this particular platform constraint, this particular stakeholder requirement — and ships a one-off pattern to close the gap and move on. That's often the right immediate call. What makes it dangerous is what doesn't happen next: no note, no flag, no record that a decision was even made. The system's owners don't find out this exception exists until months later, if ever, usually when someone else stumbles into the same gap and builds a second, slightly different one-off right next to the first.

Picture a design system with a well-regarded, standard modal component, used correctly across the vast majority of the product. One team hits an edge case — a modal that needs to host a genuinely unusual multi-step flow the standard component's API doesn't support — and, reasonably, builds a custom variant to ship on deadline. No exception process exists, or the one that exists feels too slow to bother with, so nobody logs it. A year later, three more teams have hit similar edge cases and built three more custom modals, none of them aware of the others, because there was never a visible record that the first exception had happened at all.

It's worth being fair to the counterargument here, because it's not a strawman: a system that bends too easily risks becoming no system at all, just a loose collection of components with an exception carved out for anyone who asks. That's a real failure mode, and it's the mirror image of the one this piece is mostly concerned with — where a system so permissive about exceptions never actually constrains anything, and the cumulative cost of unlogged one-offs eventually swamps the value the standard components were providing in the first place. The answer to silent breakage isn't unlimited, unaccountable breakage either. It's visible, accountable breakage, which is a genuinely different thing.

The healthier version has three concrete pieces, and each one matters for a different reason. First, an explicit exception process that's fast enough to actually get used under deadline pressure — if it's slower than just building the workaround quietly, it will get skipped, no matter how well-intentioned it is. Second, a short, real note on why the standard component didn't fit — not a formality, but an artifact that lets the system's owners understand the actual gap rather than guessing at it later from the shipped result. Third, an explicit decision about what happens to the exception afterward: does this become a new supported variant because the need is likely to recur, or does it stay a documented one-off because the situation was genuinely unusual.

That third step is the one teams skip most often, and it's arguably the most valuable of the three. An exception that's logged but never revisited just becomes a permanent, undocumented liability with slightly better paperwork than the silent version — still untested against future system changes, still invisible to anyone auditing the product's consistency, just with a paragraph explaining how it got there. The real payoff of an exception process comes from the follow-up decision: either promoting a recurring need into something the system officially supports, which makes the whole system better at its actual job, or consciously accepting a one-off as a one-off, with everyone aware of what that tradeoff costs going forward.

In practice, this looks like a lightweight ritual rather than a heavy process: a short template — what was needed, why the standard component didn't fit, what was built instead — filed in a visible place, reviewed at the system's next regular triage rather than requiring an urgent sign-off before shipping. The team doesn't wait for permission to solve their immediate problem; they ship the workaround and log it in parallel. The system's owners get a rolling, honest picture of where the standard component set is actually falling short, sourced directly from the moments it happened, rather than trying to reconstruct that picture later from inconsistent screens they stumble across during an audit.

There's a trust dimension to this that's easy to underweight against the purely operational benefits. Designers who feel like the system has no honest mechanism for handling genuine edge cases don't stop encountering edge cases — they just stop telling anyone about them, which is strictly worse for everyone, including the designers themselves, who now carry an undocumented decision with no institutional memory backing it up if anyone ever questions it. An explicit, reasonably fast exception path doesn't just produce better data for the system's owners. It changes the working relationship between the people using the system and the people maintaining it, from adversarial-by-default to collaborative-by-default.

Systems that allow this, deliberately and visibly, end up more trusted than ones that pretend to be universal, and the mechanism behind that is worth naming plainly. A system that claims to have an answer for every situation, and clearly doesn't, teaches people that its confidence can't be relied on — which erodes trust in the parts of the system that are actually solid, not just the parts that are genuinely incomplete. A system that says, openly, "here's what we cover, and here's exactly what to do when you hit something we don't," is being honest about its own limits, and that honesty is what lets people trust it fully in the areas where it does claim to have the answer.

Designers stop working around a system in secret, specifically, once there's an honest and reasonably fast way to work outside it in the open. That single change in behavior — moving exceptions from hidden to logged — is worth more to a system's long-term health than almost any amount of additional component coverage, because it's the difference between a system that slowly, invisibly loses touch with what the product actually needs, and one that has a live, continuously updating feed of exactly where it's falling short. The system that bends occasionally, on purpose, with a reason on record, isn't a weaker version of the one that never bends. It's the only version that survives contact with a real, changing product for more than a couple of years.

#design-systems#craft