Rob Austin - Feb 5, 2026
Base UI Support for Shadcn Blocks
We’ve added Base UI support across all of Shadcnblocks. You can now choose between Radix UI and Base UI as the underlying primitive library for your shadcn/ui components — and switch between them with a single line in components.json.
Why Base UI?
If you’ve been building with shadcn/ui, you’ve been using Radix UI under the hood. Radix is great — stable, accessible, well-documented. We still recommend it as the default.
But Base UI has become a solid alternative. Built by the team behind MUI (though it shares no code with MUI), Base UI is a standalone headless component library that offers smaller bundle sizes and a different API surface.
The bigger reason people are making the switch: Radix was acquired by WorkOS, and there’s a growing sense in the community that it has peaked. Updates have slowed, and many developers doubt it’s going to meaningfully improve from here. Base UI, on the other hand, is under active development with a well-funded team shipping regularly. For a lot of teams, it feels like the more future-proof bet — the library that’s going to keep getting better rather than coasting.
We’re not telling anyone to drop Radix. It works, it’s stable, and it’s not going anywhere. But if you’ve been eyeing Base UI, you no longer have to choose between it and the shadcn/ui ecosystem.
Base UI vs Radix UI — Which Should You Use?
There’s no wrong answer here. Both libraries produce the same visual output with shadcn/ui styles — the difference is what’s running underneath.
Radix is the safe choice. It works, it’s proven, and if your project is already built on it there’s no urgent reason to migrate. But if you’re starting something new, or you care about long-term trajectory, Base UI is worth a serious look. Smaller bundles, active development, and a team that’s clearly invested in pushing it forward.
How Base UI Works with shadcn/ui
Everything is controlled by the style field in your components.json. This single value tells the shadcn CLI two things: which primitive library to use (Radix or Base UI) and which visual style to apply. The format is {library}-{style}:
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "base-vega"
}
In this example, base means the CLI will install components built on Base UI primitives — so your Dialog uses @base-ui-components/react instead of @radix-ui/react-dialog, your Select uses Base UI’s Select, and so on. The vega part controls the visual style (border radius, spacing, density). You can read more about the available styles in our component styles post.
When you run npx shadcn add, the CLI reads this config and pulls the correct version of each component. A button installed with base-vega imports from Base UI. The same button installed with radix-vega imports from Radix. The component’s markup and styling are identical — only the underlying primitives change.
All 10 combinations are supported:
| Style | Radix UI | Base UI |
|---|---|---|
| Vega | radix-vega | base-vega |
| Nova | radix-nova | base-nova |
| Maia | radix-maia | base-maia |
| Lyra | radix-lyra | base-lyra |
| Mira | radix-mira | base-mira |
If you don’t set a style, radix-vega is the default — which matches what most shadcn/ui projects already use.
How Do I Update Shadcn Blocks?
If you’re switching from Radix to Base UI (or vice versa), or changing your component style, you’ll want to re-install your blocks so the CLI can pull down the correct versions. The good news is that this is straightforward — it’s the same npx shadcn add command you already use, with the --overwrite flag.
Start by updating the style field in your components.json to the combination you want (e.g., base-vega, radix-nova). Then re-install your shadcn/ui base components:
npx shadcn add button card dialog input select textarea --overwrite
Then re-install any Shadcnblocks blocks you’re using:
npx shadcn add @shadcnblocks/hero1 @shadcnblocks/pricing1 --overwrite
The --overwrite flag tells the CLI to replace the existing component files with the new versions that match your updated config. Without it, the CLI will skip files that already exist.
Most of our blocks work identically across both libraries — the primitive swap happens at the import level and doesn’t affect the component’s markup or styles. A handful of blocks (some Gallery blocks, for example) previously imported Radix primitives directly rather than going through the shadcn/ui abstraction layer. We’ve refactored those, but if anything looks off after switching, re-installing the specific block will fix it.
If you’re already on Radix and happy with your current setup, nothing changes. Radix remains the default, your existing components.json works exactly as before, and you don’t need to touch anything.