Unattended shadcn init runs now get Base UI unless they pass -b radix
shadcn/ui's init command has picked Base UI over Radix by default since 3 July 2026, according to a DEV Community guide. CI and scaffolding scripts that assume Radix now need an explicit flag on fresh checkouts.
The Engineer · Build desk
Five rows. Fresh projects: since 3 July 2026 npx shadcn init picks Base UI instead of Radix. CI and scripts expecting Radix: add the -b radix flag. Templates using asChild: it becomes render. Open-state selectors: data-[state=open]: becomes data-open:. Existing projects: untouched.
- Who has to decide decision Fresh projects Since 3 July 2026, npx shadcn init picks Base UI instead of Radix, claim 1
- Who's exposed exposure CI and scripts calling init Those calling init non-interactively and expecting Radix should add the -b radix flag now, claim 5
- Who's exposed exposure Templates using asChild asChild becomes render, the change the guide says everyone meets first, claim 8
- Who's exposed exposure Open-state selectors data-[state=open]: variants become data-open:, hidden in className strings and cva variants, claim 9
- What it limits constraint Existing projects Untouched by the change, claim 3
| Who | How | Kind | Claim |
|---|---|---|---|
| Fresh projects | Since 3 July 2026, npx shadcn init picks Base UI instead of Radix | decision | 1 |
| CI and scripts calling init | Those calling init non-interactively and expecting Radix should add the -b radix flag now | exposure | 5 |
| Templates using asChild | asChild becomes render, the change the guide says everyone meets first | exposure | 8 |
| Open-state selectors | data-[state=open]: variants become data-open:, hidden in className strings and cva variants | exposure | 9 |
| Existing projects | Untouched by the change | constraint | 3 |
What happened
- Existing projects are untouched by the change, and Radix is still fully supported for new ones.
- A fresh project that wants Radix passes one flag, written as npx shadcn@latest init -b radix.
- According to the shadcn team, both libraries get every update and every new component, except components that exist only in Base UI.
- Base UI covers primitives Radix never shipped, including Combobox, Autocomplete, Number Field, Toast and Preview Card.
Why it matters
- What it limits constraint A script that runs init unattended can no longer lean on the default for Radix. The choice has to be written into the command, or a fresh checkout gets Base UI.
- Who's exposed exposure Templates and tests written against Radix conventions, such as asChild, data-[state=open] variants and arrow-key tab activation, are exposed in any freshly scaffolded project.
- Who has to decide decision Teams with a stable Radix app have no deadline. Radix stays supported, so migration is a choice to make when a missing primitive like Combobox forces it.
The default bites at one moment: a fresh checkout running init with no human at the keyboard. The guide's author says to add the flag to any CI or script that calls init non-interactively and expects Radix [5]. Existing projects are untouched [3], so a repo that already has its components in place sees no change.
The failure that follows is likely to show up later than init does. The guide's first difference is that asChild becomes render, which it calls the one everyone meets first [8]. Radix code wraps a Button in `<DialogTrigger asChild>`. Base UI code writes `<DialogTrigger render={<Button />}>` [8]. A scaffold script or template that writes the first form into a Base UI project is writing an API the new primitives do not use.
The quieter differences are the ones a green build will not catch. The guide sorts changes by how they fail: some break the build, others compile and change behavior silently [12]. Open-state variants move from `data-[state=open]:` to `data-open:`. The author says they hide in className strings and cva variants, so grep for `data-[state=` before calling a migration done [9]. Tabs no longer activate on arrow keys. The user presses Enter or Space unless `activateOnFocus` is set on the list [10]. An end-to-end test that arrows across tabs and expects the panel to switch would fail on that alone. Navigation menus open after a 50ms hover delay, against Radix's 200ms default [11], which is 150ms sooner [14].
The stated reason for the flip is adoption. By then Base UI was stable at version 1.6.0 and pulling more than six million downloads a week, and new projects made with shadcn/create already favored it over Radix by about two to one [16]. That ratio describes people starting new projects in one scaffolding tool. It transfers to your repo only if your team is also starting fresh and has no Radix-specific components to carry.
Two cautions on the source. The guide relays the shadcn team's statements secondhand, and its author maintains HextaUI, a registry built on Base UI [7]. Even so, its advice on migrating is conservative. Asked whether to move, it answers "Probably not this quarter, and not all at once" [13]. It says to stay on Radix if the app is stable and nobody is blocked on a missing primitive, and to move if you need Combobox or Number Field without a second library [13].
What to watch
- Whether shadcn's own CLI documentation lists -b radix as the opt-out, since this guide is the only source for the flag here.
- Whether components that exist only in Base UI start shipping without a Radix version, which would break the dual-support promise.
- Whether unattended jobs that scaffold fresh projects begin failing on asChild, data-[state= selectors or tab tests after the default change.
Clarity's read
What the record supports and how the coverage leans. The claims behind it follow.
Reality
- Evidence50
- Adoption55
- Hype gap−5
- Incentives45
- Confidence58
Claim ledger
Ranked by verification strength, evidence, and original report placement.
- [1]
On 3 July 2026, npx shadcn init started picking Base UI instead of Radix.
- [2]
New shadcn/ui projects get Base UI primitives, and Radix is still fully supported.
- [3]
Existing projects are untouched by the change.
- [4]
To get Radix on a fresh project, pass one flag: npx shadcn@latest init -b radix.
- [5]
If you have CI or scripts that call init non-interactively and expect Radix, add the -b radix flag now, before a fresh checkout surprises you.
- [6]
Base UI is built by the people behind Radix, Material UI and Floating UI, covers primitives Radix never shipped such as Combobox, Autocomplete, Number Field, Toast and Preview Card, and as of September 2026 sits at 1.8.0.
- [7]
The guide's author maintains HextaUI, a shadcn/ui registry built on Base UI.
- [8]
asChild becomes render; the guide calls it the one everyone meets first. Radix uses <DialogTrigger asChild><Button>Open</Button></DialogTrigger> and Base UI uses <DialogTrigger render={<Button />}>Open</DialogTrigger>.
- [9]
Open-state selectors change from data-[state=open]: variants to data-open:. The change hides in className strings and cva variants, so grep for data-[state= before calling the migration done.
- [10]
In Radix, arrow keys move focus and activate a tab. In Base UI, arrow keys move focus and the user presses Enter or Space to activate; set activateOnFocus on the list if tests or users expect the Radix behavior.
- [11]
Base UI's navigation menu hover delay defaults to 50ms; Radix's delayDuration defaulted to 200ms.
- [12]
The guide groups the API differences by how they fail: the first group breaks the build, the second compiles fine and changes behavior silently.
- [13]
Asked whether to migrate, the guide answers 'Probably not this quarter, and not all at once.' It says to stay on Radix if the app is stable, you are not blocked on a missing primitive and nobody has a specific complaint, and to migrate if you need Combobox or Number Field without a second library, are already rewriting components for Tailwind v4, or want the layer new shadcn/ui components target first.
- [14]
The Base UI default hover delay is 150ms shorter than Radix's default.
- [15]
The shadcn team said every update and new component ships for both libraries, unless a component only exists in Base UI.
- [16]
Two reasons were given for the change: Base UI had reached a stable 1.6.0 with over six million weekly downloads, and projects created through shadcn/create were already choosing Base UI over Radix about two to one.
Get this ledger inside ChatGPT. Ask about any of our stories and the answer brings its figure, each claim’s verdict and the sources. Free, no account.
Sources
1 independent publisher whose own reporting we read for this story.
- dev.toshadcn/ui switched to Base UI. Here is what actually changes in your code
1 article · October 15, 2026
Topics and entities
Follow any of these and your For You feed starts watching them — no settings page required.