The editorial argues that shadcn didn't need to publicly declare Radix dead — switching the default in the most-installed React component library is itself the loudest possible signal. It ties the move to the slowed cadence of @radix-ui/react-* packages since WorkOS acquired Modulz in early 2024, framing the changelog line as a quiet verdict on Radix's stewardship.
The editorial legitimizes the swap by noting Base UI was built by MUI core maintainers (Tassinari, Najdova, et al.) and hit 1.0 this year as a standalone unstyled primitive package. It frames Base UI as engineered from day one to occupy the same slot as Radix — accessible, unstyled behaviors for dialogs, popovers, menus, and comboboxes — making it a serious rather than experimental choice.
The editorial argues headless primitive choices are unusually sticky — ripping one out means rewriting every dialog, dropdown, and combobox — so the layer any new startup adopts today shapes their stack for years. Because shadcn is the copy-paste on-ramp for new React apps, every fresh `npx shadcn add` now propagates Base UI's API surface across the ecosystem, quietly displacing Radix as the default substrate.
By submitting the changelog line to Hacker News with the framing 'Shadcn/UI now defaults to Base UI instead of Radix,' dabinat treats what shadcn published as a routine changelog entry as a meaningful shift worth front-page attention. The 231 points and 122 comments validate that the community reads this as more than a patch note.
On the shadcn/ui changelog, Shadcn rolled out a quiet-looking line item: new components installed via `npx shadcn add` now use Base UI as their headless primitive instead of Radix. Existing components in your project keep their Radix imports. Nothing breaks today. But every new install from the most-copy-pasted React component library on the internet now pulls a different API surface.
Base UI is the headless primitive layer built by the Material UI team — Olivier Tassinari, Marija Najdova, and the rest of the MUI core. It hit 1.0 earlier this year after being spun out of the MUI internals as a standalone, unstyled primitive package. It was designed from day one to compete with Radix in the same slot: accessible, unstyled, composable behaviors — dialogs, popovers, menus, comboboxes — that a design system wraps and styles.
Radix, for context, was built by Modulz. WorkOS acquired Modulz in early 2024. Since that acquisition, the public cadence on `@radix-ui/react-*` packages has slowed noticeably — patch releases still land, but the major primitives haven't seen the kind of API expansion or behavioral fixes that were routine in 2022 and 2023. shadcn didn't say Radix is dead. He didn't have to. Changing the default in the most-installed React component library on GitHub is the loudest signal a maintainer can send without writing a blog post.
Headless UI primitives are the least-glamorous, highest-leverage piece of a modern React stack. They are the layer where keyboard nav, focus trapping, ARIA wiring, RTL support, and touch behavior actually live. Every design system in a company of any size sits on top of one — usually Radix, sometimes Ariakit, occasionally React Aria from Adobe. The choice tends to be sticky for years because ripping it out means rewriting every dialog, dropdown, and combobox in the app.
Shadcn's switch matters because shadcn is not a normal library. It is a distribution channel. When a startup spins up a Next.js app in 2026 and runs `npx shadcn add button dialog combobox`, that install is the first primitive decision the codebase makes — and it's usually the last. By flipping the default, shadcn just changed the demographics of the next 100,000 React apps.
The library-design angle is what makes this interesting. Radix's model was to ship many small packages — `@radix-ui/react-dialog`, `@radix-ui/react-popover`, etc. — each with a compound component API (`Dialog.Root`, `Dialog.Trigger`, `Dialog.Content`). Elegant, tree-shakeable, and — as anyone who has tried to compose two Radix primitives together has learned — surprisingly rigid when you want behavior that spans them. Base UI leans harder on hooks and looser composition, which is closer to how React Aria has always worked and, arguably, closer to how large design systems actually consume primitives once they get past the demo stage.
Community reaction on the HN thread (231 points at time of writing) split along predictable lines. The pragmatists asked the only question that matters: does this break my existing shadcn install? Answer: no. The maintainers asked the second question: does this mean I now have two primitive layers in the same repo forever? Answer: yes, probably, unless you do the migration work. And the Radix defenders pointed out — correctly — that Radix is not abandoned. It's just no longer the safe default in the mind of the person who ships the reference implementation of "how React components should look in 2026."
The uncomfortable truth is that primitive libraries live or die by their maintainer's roadmap, not by their code quality. Radix's code is still excellent. But when the largest downstream consumer picks a different upstream, that's a leading indicator for where the fixes, the new components, and the accessibility patches will land next.
If you're greenfielding a project this quarter, the decision just got easier: take the shadcn default and move on. Base UI has the MUI team's institutional knowledge of a11y edge cases from a decade of shipping components to enterprise React apps, and it now has a distribution flywheel behind it.
If you have an existing shadcn-based design system on `@radix-ui/*`, do not panic-migrate. Your Radix components still work. But you now need three things you didn't need last week. One: a written policy for whether new components in your system use Base UI or continue on Radix — because "whatever `npx shadcn add` gives me" is no longer a consistent answer. Two: a migration budget line-item for the moment a Radix primitive you depend on stops getting a fix you need. Three: an honest look at how many of your custom wrappers are actually load-bearing on Radix's specific compound-component API versus behaviors you could get from either primitive.
If you're on a different stack entirely — MUI proper, Chakra, Mantine, Ariakit, React Aria — this is a useful data point about where the wind is blowing, but it doesn't force any action. React Aria in particular has been on a steady tear and remains the most conservative choice for teams that care more about a11y correctness than ecosystem gravity.
The next twelve months will tell us whether Base UI can hold the crown or whether this is just a lateral move that gets reversed when Radix picks up its cadence again. Watch two things: how fast Base UI ships the primitives it doesn't have yet (a full combobox with async loading, a proper virtualized listbox, and a date picker that isn't a nightmare), and whether WorkOS pours engineering back into Radix now that its default-status has been publicly challenged. The React primitive layer has been remarkably stable for four years. It's about to be interesting again.
It bothers me that these popular UI toolkits render copious amounts of divs. I went to look at Base UI and for nearly every component it's "Renders a <div> element", when there are native elements that can achieve the same thing like details/summary for accordion.I'm f
For boring applications - do people prefer the copy paste approach of shadcn instead of a traditional ui library like mantine?The copy paste approach may be easily modifiable but creates new problems - ie now there is an upgrade ai agent for something that should just be ticking up a version number.
Would that lead to anything better for the users, such as a smaller bundle size? Or is it more of a QoL change for Shadcn maintainers?
I have used and mostly like Shadcn, and yet their Radix-based radio button was a bit much, as are other choices, where similarly overblown solutions were used.https://news.ycombinator.com/item?id=46688971
Top 10 dev stories every morning at 8am UTC. AI-curated. Retro terminal HTML email.
It’s getting tiring to hear at this point, but the Claude voice comes through clearly in this post, and it’s a little off-putting. If even an important product release doesn’t warrant full human attention, where will we draw the line?