shadcn/ui 4 min read

shadcn/ui Just Dumped Radix. That's Bigger News Than It Sounds

If you build UIs in React, you know shadcn/ui. It has blown past 80,000 GitHub stars and become the component library everyone reaches for. So when it made a quiet but decisive move recently, most people didn’t notice the significance. It ripped out Radix UI, the engine that had powered it from the start, and made Base UI the new default. This isn’t a button-color tweak. It’s a tremor in the bedrock of frontend development.

Wait, What Is shadcn/ui and Why Does This Matter

shadcn/ui is a strange beast. Most component libraries get installed via npm and imported into your app. shadcn/ui works the other way around. It copies the component code into your project. You’re not installing a library; you’re pulling source into your own tree.

That approach caught fire. The code becomes yours, so you can hack it however you like, and you never get held hostage by a version bump. It also plays beautifully with Vercel’s Next.js ecosystem, which didn’t hurt.

But there’s a catch. shadcn/ui only handles the design. The actual behavioral skeleton has always been outsourced to another library. The logic for opening and closing a dropdown, the keyboard navigation through a menu, the focus-trapping inside a modal — invisible stuff that is genuinely hard to get right. For years, Radix UI did all that dirty work.

So Why Ditch Radix

The core issue is maintenance momentum. Ever since WorkOS acquired Radix UI, the community has grumbled that update velocity fell off a cliff. Issues piled up, and support for the latest React versions lagged. When an infrastructure library stalls, everything built on top of it stalls too — including shadcn/ui.

Enter Base UI. This is not some no-name newcomer. It was built by the core developers behind Radix, working alongside the Material UI (MUI) team. In plain terms, it’s the spiritual successor to Radix — the original creators pouring their accumulated know-how into a fresh vessel.

For shadcn, the math is obvious. Trade a stalled old partner for a new one that carries the same DNA but actually ships. And because shadcn/ui copies code rather than importing it, swapping the engine leaves the visible surface almost untouched. That’s a structural advantage: it can change the motor without jolting the driver.

The Headless War: The Real Fight Happens Where You Can’t See

To grasp what’s really going on, you need the concept of the headless component. Headless means exactly that — no head, no design, just the behavior and logic.

Why split that out? Because accessibility and interaction logic are far harder than they look. Building a single combobox correctly means handling screen-reader support, keyboard control, positioning so the menu doesn’t spill off-screen, and dozens of other edge cases. Rewriting all that every time is a waste. So a cluster of “engine specialist” libraries — Radix, Base UI, React Aria, Headless UI — have been competing over this exact territory.

That’s why shadcn/ui’s default choice carries so much weight. Countless developers adopt whatever engine shadcn ships, without ever thinking about it. shadcn/ui is effectively the de facto distribution channel of the frontend world. Getting shipped there, or not, can decide an engine library’s fate. With this decision, Base UI just got a launchpad to the mainstream, and Radix lost its biggest storefront.

What Happens to Existing Users

This is the practical worry. If you’re already running a Radix-based shadcn/ui project, where does that leave you?

The ground isn’t collapsing under you. The whole philosophy of shadcn/ui is that the code is already yours. Components you copied in the past keep working exactly as before. The wrinkle: newly added components will be Base UI-based, so you can end up with two engines coexisting awkwardly inside one project.

Migrating an existing project wholesale to Base UI is real work. The API names differ, and the fine-grained behavior has subtle divergences, so a simple find-and-replace rarely gets you there. For a greenfield project, just follow the new default and move on. For a service already in production, weigh the migration cost coldly. There’s no reason to rush the switch.

When the Landlord Changes

shadcn/ui’s decision isn’t a mere technical preference. It’s a contest over who controls the frontend’s invisible foundation. Base UI, the successor built by the original crew, just seized the most powerful distribution network, while a stagnant Radix stands at a serious crossroads.

We pick our stacks for the shiny surface, but what actually decides a project’s lifespan is the health of the infrastructure underneath. The library you depend on right now — what’s running beneath it? It might be time to look down at what you’re standing on.

shadcn/ui Base UI Radix UI frontend React

Comments

    Loading comments...