Why We Chose shadcn/ui Over Radix Themes for Our CMS Admin
51 Components, 205 Admin Pages, Honest Reasons We Picked shadcn
When we started building the UnfoldCMS admin in early 2024, "shadcn or Radix Themes" looked like a Pepsi-vs-Coke decision. Both were React component libraries, both were popular, both ranked on the front page of Hacker News every other week. Two years and 205 admin pages later, I can say with confidence: they aren't the same kind of product, the comparison most blog posts make is wrong, and the right pick for a long-term production admin isn't subtle.
This is the honest version. Why we picked shadcn/ui over Radix Themes for a CMS admin that's now running 51 components across 205 pages in production, what that decision actually saved us, and where Radix Themes would have been the better call.
Disclosure: I work on UnfoldCMS. shadcn/ui is one of the company's design-system choices and a load-bearing part of the admin. Radix Themes is a great product I'd recommend in the right situation. Pick on fit, not on which one I write about.
TL;DR — the comparison most blog posts get wrong
Almost every "shadcn vs Radix" post conflates two different Radix products. Radix UI ships:
- Radix Primitives — unstyled, headless components (Dialog, Dropdown, Tooltip, etc.) with accessible behaviour but no visual design. ~19,000 GitHub stars.
- Radix Themes — a pre-styled design system built on top of Radix Primitives. Sleek, polished, opinionated. ~8,500 GitHub stars.
shadcn/ui (~116,000 GitHub stars as of June 2026) sits between the two: it uses Radix Primitives for accessibility and behaviour, layers Tailwind styling on top, and gives you the component code in your repo to fork.
| Product | Primitives | Pre-styled | Code in your repo |
|---|---|---|---|
| Radix Primitives | Yes | No | Imported package |
| Radix Themes | Yes (via Primitives) | Yes | Imported package |
| shadcn/ui | Yes (uses Radix Primitives) | Yes (Tailwind) | Yes — copied into your repo |
The "shadcn vs Radix Themes" question is really three sub-questions: do you want code-in-your-repo, do you want Tailwind, and do you want the design system pre-styled. Get those right and the choice picks itself.
What Radix Themes actually offers
Radix Themes is a serious, professionally-designed component system maintained by WorkOS. The pitch is "polished from day one" — every component has consistent spacing, a coherent colour system, dark mode built-in, and the kind of micro-interaction polish that takes a year to add to a homegrown design.
Where Radix Themes wins:
- Out-of-the-box visual quality. Drop it into a new app, you have a credible product UI in an afternoon.
- First-party theming via design tokens — a clean colour scale, accent colours, radius, panel background. Configured in code, not CSS variables.
- One install, one upgrade path. It's an npm package; you bump the version, you get updates.
- WorkOS-maintained. Backed by a real company with paid engineers.
Real adoption: Vercel, Linear, Supabase, and a long list of YC-stage SaaS products use Radix Primitives. Radix Themes has narrower adoption but is the right pick for teams who want a polished design system without designing one.
For more on the Themes-vs-Primitives distinction, see WorkOS's own breakdown.
What shadcn/ui actually offers
shadcn/ui is not a component library in the package-import sense. It is a collection of components you copy into your repo, layered on Radix Primitives, styled with Tailwind. Each component is a .tsx file that lives in components/ui/. You own it. You can modify it. You can read every line.
The pitch is "you own the code." For our admin, that compounded into:
- Fork-and-modify for free. Every component is a normal file in our repo. Adding a new variant to
<Button>is a one-line PR. - No vendor upgrade hell. When Radix Primitives ships a new version, we patch on our schedule. No "this version of the design system needs this version of React 19."
- Tailwind native. Tailwind v4 + shadcn is the dominant 2026 stack. The configuration overhead vs Radix Themes' design tokens is zero — we get themes via CSS variables in one file.
- AI ecosystem. As of mid-2026, shadcn is the default component library for Vercel's v0, Lovable, Claude Code's UI scaffolds, and most AI front-end tools. The ecosystem advantage isn't trivial.
- Block library + community. Shadcnblocks and the official Blocks ship hundreds of pre-built sections you can copy in.
For the longer narrative on what shipping 51 components looks like, see shadcn/ui in Production: 1 Year, 51 Components, 205 Admin Pages — Lessons.
Why we picked shadcn for a CMS admin specifically
The CMS admin job is different from a SaaS marketing site. A CMS admin needs:
- Many similar but customised forms — post editor, page editor, settings, user create, redirect create, menu builder. Each is a form with subtly different field types and validation.
- Many similar but customised tables — posts, users, categories, redirects, menus, comments. Each is a DataTable with different columns and actions.
- Composition over configuration — a Dialog inside a Sheet on mobile, a Tabs inside a Card on settings, a Form inside a Drawer for inline edits.
- Per-customer theming — three themes ship by default in UnfoldCMS, with the architecture to add more without recompiling.
Radix Themes covers the first two well. It struggles with the third (composition is more constrained when the components are pre-styled) and the fourth (the theming model assumes you use Radix Themes' tokens; per-customer themes are workable but feel against the grain).
shadcn covers all four cleanly because every component is your code. We modified <Button> to add an xs size on day three. We added a multi-sort column resize behaviour to our <DataTable> wrapper around TanStack Table. We swapped the default Tailwind colour palette for our brand-blue palette in 20 minutes. None of these are extraordinary — they're the small adjustments any production admin needs, and they're free with shadcn.
For the architectural argument longer-form, see The CMS Built on shadcn/ui: Why It Matters.
Where Radix Themes would have been the better pick
I want to be honest about cases where I'd recommend Radix Themes instead:
- You're building an internal tool and don't want to design. Radix Themes ships a complete, coherent design out of the box. No "what's our spacing scale" debates. No "do we round corners 4px or 6px" debates. Just install and ship.
- Your team is React-first but Tailwind-allergic. Radix Themes uses vanilla CSS + design tokens; shadcn requires Tailwind. If your team genuinely prefers CSS-in-JS or vanilla CSS, the Tailwind tax is real.
- You want a stable, packaged upgrade path. shadcn requires you to manage upstream changes via git (we covered this in shadcn/ui Roadmap and Our CMS). Radix Themes is
npm update. For some teams, that's the better trade. - You're building a customer-facing app with a single brand. Radix Themes' opinionated polish reads as "premium" to non-technical users. For a single-brand product, that's a feature.
For a multi-tenant CMS where each customer's theme matters, the trade flips. For a single-brand consumer product, Radix Themes could easily be the better choice.
The actual sizes don't matter
The "shadcn vs Radix Themes" bundle-size debate that comes up in comparisons is largely noise. A typical shadcn Dialog + Radix Primitive is about 31KB. A typical Radix Themes Dialog is about 9KB gzipped. Both are well under the budget of a production admin. Pick on architecture, not on kilobytes.
What we'd warn other CMS builders about
Two patterns we learned after a year:
- Don't add a shadcn variant until you've needed it three times. Variant explosion is a real risk when the components are in your repo. Resist the urge to add an
xssize, anxxssize, asubtle-ghostvariant. Wait for the third real need; the first two times, use a className override. We covered this in shadcn/ui in Production lessons. - Storybook earlier than you think. We added Storybook around month six and immediately caught three variant collisions that had been silently breaking. Add it in week two next time.
People Also Ask
What's the difference between Radix Primitives and Radix Themes?
Radix Primitives are unstyled headless components (about 19,000 GitHub stars). Radix Themes is a pre-styled design system built on those Primitives (about 8,500 stars). shadcn/ui uses Primitives under the hood but ships its own Tailwind-based styling.
Is shadcn/ui production-ready?
Yes. UnfoldCMS runs 51 shadcn components across 205 admin pages in production for 12+ months. Cal.com, Midday, and a long list of YC SaaS products also use it at scale. The "is shadcn production-ready" question stopped being interesting around 2024.
Why is shadcn more popular than Radix Themes?
Three reasons: code-in-your-repo lets you modify anything without forking a package; Tailwind v4 alignment matches the dominant 2026 frontend stack; AI tools (v0, Lovable, Claude Code) default to shadcn. The 14× star ratio (116K vs 8.5K) reflects these structural advantages.
Can I use Tailwind v4 with Radix Themes?
You can use them in the same project — Radix Themes won't break Tailwind. But Radix Themes' theming model assumes you use Radix's design tokens, not Tailwind utility classes. Mixing the two means you have two design systems competing for the same UI.
Should I switch from Radix Themes to shadcn?
Only if your team is hitting limits Radix Themes can't address — usually per-customer theming, deep component customisation, or alignment with the AI / Tailwind ecosystem. Switching design systems mid-project is real engineering cost. Don't do it without a concrete reason.
Bottom line
shadcn/ui and Radix Themes solve the same surface (production React UI) with very different architectures. For a CMS admin where customisation, per-customer theming, and ecosystem alignment matter, shadcn wins by a wide margin — and the 51 components / 205 pages we run in production are the proof. For a single-brand customer-facing app where polished defaults matter more than fork-and-modify freedom, Radix Themes is the better call.
If you're picking a design system for a real CMS admin in 2026, I'd bet on shadcn. Try the UnfoldCMS demo to see the result, or see pricing.
Sources and methodology
- shadcn/ui — github.com/shadcn-ui/ui, 116K+ stars as of June 2026. Official docs.
- Radix Primitives — github.com/radix-ui/primitives, ~19K stars.
- Radix Themes — github.com/radix-ui/themes, ~8.5K stars. Official site.
- WorkOS comparison — What is the difference between Radix and shadcn-ui.
- Community sentiment — Edriso on dev.to, Radix Themes Discussion #95.
- UnfoldCMS counts —
find cms/resources/js/components/ui -name "*.tsx" \| wc -l= 51;find cms/resources/js/pages/admin -name "*.tsx" \| wc -l= 205. Verified at write time. - Bundle size data — drawn from PkgPulse 2026 component comparison.
- All star counts verified June 2026. Subject to growth.
Free & Open Source
Own your CMS. No subscriptions.
Unfold CMS is free to download and self-host. Built on Laravel + React, full source code included.
Share this post: