Development··3 min read

shadcn/ui: Who It's For and Who It's Not

A copy & paste UI library -- used it on 2 projects. The philosophy is great, but reality was a bit different.

Wait, you copy the source code instead of npm installing it?

When I first encountered shadcn/ui, I was puzzled. Usually you npm install a UI library and import it. This one copies component source code directly into your project. Run npx shadcn@latest add button and a Button component source file appears in your components/ui/ folder.

"Why is this supposed to be good?" But after using it, I understood.

Full customization freedom is the point

Customizing something like MUI or Ant Design means learning their theming system, finding the right style to override, and sometimes resorting to !important. This process eats more time than you'd think.

With shadcn/ui, the source code is right there in your project. Want to change the padding? Just edit the Tailwind classes. Done. This flexibility really shined when collaborating with designers.

(Honestly, I also started using it because it looked cool.)

First project: great fit

Built a startup admin dashboard with shadcn/ui. No existing design system, needed to move fast. Pulled in the basic components (Button, Input, Dialog, Table) and just tweaked the colors to match the brand.

Built 20 pages in 2 weeks. Accessibility came for free since it's built on Radix UI. The designer even said "Where'd you get this? It looks really clean."

Second project: not a great fit

Introduced shadcn/ui again on a project with 7 team members. Problems emerged. Since the components live in your project, everyone modifies them differently. Person A changes Button styles, and Person B's pages break. "Did you check how this Button change affects other pages?" became a weekly code review topic.

We ended up with a rule: "Only one person can modify shadcn/ui components." But at that point, how is it different from using an npm package?

The pain of managing updates

With an npm package, you bump the version and you're done. With shadcn/ui, when an update drops, you have to manually diff and merge. Keep your customizations while pulling in bug fixes -- it's more tedious than it sounds.

I skipped updates for 3 months, and when I finally tried to apply them all at once, there were conflicts in 8 places. Gave up, re-ran add from scratch, and reapplied the custom code. Lost 2 hours.

Who it's for, who it's not

Individual projects or small teams (1-3 people), frequent design customization needs, comfortable with Tailwind CSS -- shadcn/ui is a great fit.

Large teams, existing design system, need frequent component updates -- a traditional UI library is better.

It ultimately comes down to whether the tool's philosophy matches your situation. shadcn/ui's "you own the code" philosophy can be either freedom or a burden.

Related Posts