Why we stopped using component libraries
Three years in, we own less code and ship faster. Here's the math.
by Nephele K.
We were Material UI users. Then Chakra. Then Radix. Then headless plus a wrapper around the headless. We stopped wrapping in 2025, and the codebase has been calmer since. This is the post we wished existed when we were debating it.
The cost of a component library shows up at two predictable moments: the first time the design diverges from the library's defaults, and the first time the library issues a major version. Both are guaranteed. Both happen on a deadline. The math you didn't do up front shows up as an emergency in week eight.
What we use instead: Tailwind on raw code, with our own primitives where we need them. Every project ships with maybe ten components — Button, Card, Field, Modal, Toast, Table — written from scratch, owned by us, lifted from project to project where it makes sense. They are not perfect. They are exactly what we need.
The math: one engineer, one afternoon per primitive, amortized across two years of projects. Less than the time we used to spend reading library changelogs, debugging cascading version bumps, and arguing with someone else's API decisions. We will not be installing a new component library this year, or next.
The grid above is the actual list. Ten components, each owned and understood by everyone on the team. Compare to the 240 components a generic library ships — we've genuinely never needed a Stepper, a TreeView, or 80% of what Material exposes. The 90% that looked like a shortcut turned out to be a museum we paid rent on.
The incident that pushed us over: a library major bump in 2025. Three projects on the same version, all needing a peer-dep update for a new React. The migration was not hard — but it was three migrations, coordinated across three clients, on a week we had not budgeted for it. Sat with that for two days. Wrote our own primitives the next quarter. Have not had a coordinated peer-dep emergency since.
When we'd reverse course: a project where the team is two junior engineers and the deadline is six weeks. Reach for Mantine or shadcn/ui, ship, hand off. The argument here is about studio-scale economics, not absolute correctness. If you're paying ten engineers to maintain custom primitives instead of building the actual product, you have not saved any money.