Last January, I sat in a conference room staring at a dependency graph that had grown to 847 nodes. Our component library — the one we had proudly open-sourced two years earlier — had become the single largest source of bugs in our product. Not the rendering engine. Not the data pipeline. The buttons, the modals, the dropdowns. The things that were supposed to be solved problems.
We had fallen into a trap that I suspect many teams recognize: every new feature request became a new variant. A button that was "almost like the primary, but with an icon, and slightly different padding on mobile." A modal that needed "the same behavior as the existing one, except it should animate from the bottom on tablets." Each request felt reasonable in isolation. Together, they created a combinatorial explosion that no one could reason about.
The audit that changed everything
When we finally audited the library in March, we found 14 distinct button variants, 9 modal configurations, and a tooltip component with 23 props — most of which were never used in production. The median component had been modified 31 times in eighteen months. We were maintaining theoretical flexibility that no one had asked for.
The hardest part of building a design system is not the building. It is the saying no. Every edge case you accommodate today becomes a surface area you must defend forever.
So we made a decision that felt radical at the time: we would rewrite the library from scratch, but this time with a hard constraint. Every component would ship with exactly the variants that production required — no more. If a new variant was needed, the team requesting it would own the implementation and the migration path. We called it "demand-driven composition," though internally most people just called it "the purge."
What we learned about saying no
The rewrite took six weeks, not six months. The six months came afterward — migrating every surface in the product to the new primitives. But the result speaks for itself: our component-related bug reports dropped by 73 percent. The median component now has 4 props instead of 11. New engineers onboard in days instead of weeks, because there are fewer paths to confuse.