· react / ui-components / shadcn

shadcn/ui in 2026: Is the Registry Model Working?

[email protected] is the default substrate for AI-assisted UI work. The copy-paste model delivers on bundle size and ownership. Upgrade friction is real but improving. Mantine 9 is the right call if you need 100+ components.

By Ethan

1,417 words · 8 min read

The registry model is working. After three years of skepticism, shadcn/ui is the default substrate for AI-assisted UI development — every major coding agent defaults to it, and CLI v4 (March 2026) has made upgrades meaningfully less painful. Bundle size stays 3–4× smaller than MUI or Mantine for comparable component counts. The remaining hard problem is customization divergence: once you’ve made significant edits, --diff shows you the delta but can’t apply it for you.

Who this is for

React and Next.js teams choosing a component library in mid-2026. If you’re on Angular, or you’re not using Tailwind and don’t want to start, stop reading — shadcn/ui is not for you. If you need 100+ production-ready components without customizing them, Mantine 9 is a better fit and this review will tell you why.

What we tested

  • [email protected] — released May 5, 2026, CLI v4
  • CLI flags: --diff, --dry-run, --view, --template
  • shadcn/skills (AI context layer) and MCP server
  • Bundle size comparison: shadcn/ui + Radix vs Mantine 9 vs MUI, 30-component sample
  • Base UI vs Radix for the Dialog component specifically

Registry upgrade DX

The copy-paste model solves the problem it claims to solve: you cannot have an upstream npm breakage surprise when there is no upstream dependency. A shadcn update button failure is a merge conflict in your own code, not a semver accident in someone else’s.

CLI v4 adds three flags that make this concrete:

  • --diff shows a unified diff of what update would change before you commit
  • --dry-run runs the update logic without touching files
  • --view opens the source in your browser

These are meaningful quality-of-life improvements over the v3 workflow, where “what changed?” meant manually git diff-ing after the fact.

The unsolved problem is customization divergence. If you’ve modified a component significantly — renamed a variant, restructured the markup, added a compound sub-component — --diff shows you a conflict, not a merge. You resolve it by hand. GitHub Discussion #790, open since 2023, tracks the community ask for an automated update command for exactly this reason; it was still unresolved as of May 2026. Near-stock usage: upgrade friction is low. Heavy custom divergence: it’s a real cost.

There is also no semantic versioning per component. shadcn update fetches the current registry version, which may have changed in any direction. The diff flag compensates for this, but it means you’re flying without a changelog per component.

CLI v4: AI-native features

shadcn/skills

shadcn/skills is a context layer that teaches AI agents (v0, Cursor, Claude) about your actual registry — your customized components, your design tokens, your naming conventions. Without it, agents generate code against stock shadcn defaults and you fix the deltas manually. With it, agents generate against your installed configuration.

This is the most practically useful addition in v4. If your team uses an AI assistant for UI work at all, shadcn/skills eliminates a category of correction that was previously invisible in time-tracking.

MCP server

The MCP server lets AI assistants install components from any registry via natural language: “add the Dialog component from the corporate registry.” It talks to shadcn add under the hood. Useful in environments where the developer wants to stay in chat rather than switch to a terminal.

Presets and templates

Presets package an entire design system as a short code: npx shadcn init --preset [CODE]. Teams can publish their design system as a preset and onboard new projects in one command. The registry:base and registry:font additions extend this to full design systems and font configuration as first-class install payloads.

shadcn init --template covers Next.js, Vite, Laravel, React Router, Astro, and TanStack Start. If you’re not using one of those, you’re wiring the config yourself.

package.json imports (v4.7.0, May 2026)

package.json#imports support lets you use private #... aliases in your component code. Combined with target aliases in files[].target, this makes monorepo setups substantially cleaner — components can install into their correct package without post-processing.

Ecosystem health

v0.dev distribution flywheel

v0 defaults to shadcn/ui. That’s the biggest single factor in 2026 adoption numbers. Teams that start a project with v0 land on shadcn/ui by default, then stay because switching costs compound. The 115K GitHub stars and ~4.7M weekly CLI downloads on npm [11] (undercounted — the copy-paste model means many installations never touch npm) reflect this.

Storybook and testing

Third-party integrations are mature. @storybook/react works out of the box. Component testing with Testing Library is straightforward because components are local code, not black-box npm modules — you can add data-testid attributes or restructure markup without waiting for a library PR.

Community registry blocks

The community block ecosystem has grown substantially. Unofficial registries (e.g., the shadcn/ui Blocks collection) offer pre-composed page sections — dashboards, sidebars, auth forms — installable via shadcn add. Quality varies. Treat them as starting points, not production drops.

Alternatives snapshot

LibraryWeekly npm downloads30-component bundleBest fit
shadcn/ui + Radix~4.7M CLI [11] (undercounts)~80KBTailwind shops, AI-assisted dev
Mantine 9~2M [12]~250KBTeams needing 100+ components + hooks
MUI~9.3M [13]Enterprise, Material Design constraint
Base UIgrowingsmaller than RadixPerformance-critical, Tailwind optional
DaisyUI 5growingminimal JSCSS-class workflows, accessibility not default

MUI is the enterprise default and won’t lose that position soon. ~9.3M weekly npm downloads [13] means the ecosystem (third-party integrations, hiring pool familiarity, Stack Overflow answers) is unmatched. The constraint is Material Design aesthetics — if your product’s visual identity conflicts with Material, MUI’s customization story is significant work.

Mantine 9 is the right call if you need 100+ components out of the box plus 50+ hooks. The bundle is ~250KB for 30 components versus shadcn/ui’s ~80KB, but you’re getting a complete toolkit. If you’d otherwise be composing 40% of your UI from scratch on top of shadcn/ui, that delta flips.

Base UI is officially supported under shadcn (you can swap Radix primitives for Base UI since January 2026). Base UI and Radix share a comparable footprint — tailkits.com [9] classifies both as “Very small” in their bundle comparison, without published KB benchmarks. If you’re building a performance-critical app and Tailwind is acceptable, this is now the cleaner primitive choice.

DaisyUI 5 operates on a different model entirely: CSS classes, minimal JavaScript, no Radix dependency. Accessible by default it is not — you add ARIA attributes yourself. Different audience, not a direct competitor.

Verdict

Pick shadcn/ui if you’re on React/Next.js with Tailwind, you’re using AI coding assistants, and you want component ownership without npm surface area. shadcn/skills makes AI-generated code target your actual design system rather than stock defaults. For near-stock usage, upgrade friction is low.

Pick Mantine 9 if you need a full component library — 100+ components, date pickers, rich text editors, 50 hooks — and you’d rather not compose them yourself. The bundle is larger but you’re not writing the missing 70%.

Pick MUI if you’re in an enterprise context where Material Design is acceptable and hiring-pool familiarity matters. The ecosystem depth is unmatched.

Pick Base UI over Radix if you’re building performance-critical work on top of headless primitives and the smaller component footprint is worth the tradeoff.

Caveats

Bundle size numbers for shadcn/ui and Mantine 9 are from a third-party comparison (saasindie.com, September 2025) using a 30-component sample, not official benchmarks. Your actual bundle depends on which components you import and whether your bundler tree-shakes correctly — measure your own build.

The copy-paste upgrade story is improving but not solved. Teams with heavily customized components will spend time on merge conflicts at upgrade time. The --diff flag helps but does not automate the resolution.

We did not test shadcn/ui in a non-Tailwind setup. Tailwind v4 compatibility has been confirmed but we have not verified it end-to-end.

References

  1. shadcn/ui changelog
  2. CLI v4 announcement — March 2026
  3. package.json imports + target aliases — May 2026
  4. shadcn/ui GitHub — stars, issues
  5. GitHub Discussion #790 — upgrade divergence
  6. v0.dev design systems docs
  7. MCP server docs
  8. Mantine vs shadcn/ui — bundle comparison
  9. Base UI vs shadcn/ui vs Radix UI — size comparison
  10. React UI libs 2025 — comparative overview
  11. shadcn npm package — weekly downloads
  12. @mantine/core npm — weekly downloads
  13. @mui/material npm — weekly downloads