shadcn/ui Switched Defaults to Base UI — Radix Isn't Dead, but the Old Assumption Is
Any team using shadcn/ui with AI coding tools now risks silent breakage: LLMs trained on mixed-era code will blend Base UI and Radix APIs, producing type errors and broken state styles. Specifying the backend in PRDs and prompts prevents that, and the default shift signals which library will get faster component coverage going forward.
Starting July 2026, shadcn/ui initializes new projects with Base UI as the underlying component library. The change follows months of coexistence where community adoption tilted 2:1 toward Base UI, which now clocks over 6 million weekly downloads. Radix is not deprecated — existing projects stay untouched, and a `-b radix` flag preserves the old path for new work.
The shift reflects component coverage more than quality. Radix's Dialog, Popover, and Select are mature, but Base UI ships faster with Combobox, Autocomplete, Number Field, Drawer, and OTP Field — the controls modern SaaS and AI products actually need. API differences like `render` vs. `asChild` and `data-open` vs. `data-[state=open]` are real but only surface when customizing component internals.
What changed most is shadcn/ui's identity. It now distributes the same component names, CLI, Registry, and Blocks across Base UI, Radix, and React Aria backends, stabilizing its own distribution system rather than any single primitive library. For AI-assisted coding, this means prompts must explicitly name the backend to prevent mixing incompatible APIs.
shadcn/ui's pivot reveals that component-library competition is shifting from stability of classic primitives to speed of coverage for modern application controls like comboboxes and OTP fields.
The real lock-in with shadcn/ui was never the npm dependency but the copied source code in `components/ui` that teams customize — making a backend migration far more expensive than a package swap.
By decoupling its CLI, Registry, and Blocks from any single primitive library, shadcn/ui is positioning itself as a component-distribution platform, which insulates it from the fate of any one backend.
AI code generation introduces a new constraint on framework defaults: every backend split creates a surface for LLMs to hallucinate incompatible API mixtures, forcing teams to encode backend choices into prompts.