For a new Next.js App Router product in 2026, start with shadcn/ui if you want Tailwind-owned components and a design system you can edit file by file. Pick Mantine when you need a large installed kit (forms, dates, charts, notifications) and accept that every Mantine component is a Client Component. Pick Chakra UI v3 when your team already thinks in Chakra recipes and snippets, and budget time for an Emotion style registry if you stream UI through Suspense or enable Next.js 16 Cache Components.
I get this question from founders who want one "best UI library" answer. The useful answer is which failure mode you refuse: owning CSS forever, shipping a fat client tree, or fighting hydration when styles stream late.
What each library actually is
shadcn/ui is not an npm component package you import forever. Treat it as a distribution system: you copy open component code into your repo (CLI and registry), style with Tailwind, and own the files. The public docs describe it as "how you build your component library," with open code, composition, and AI-ready source as design goals. Under the hood you still choose accessible primitives; as of July 2026 new shadcn projects default to Base UI, and Radix remains fully supported. I covered that primitive choice in my older post comparing Radix UI and Base UI for shadcn/ui.
Mantine is a classic installed library. @mantine/core plus @mantine/hooks give you a broad UI surface; optional packages cover forms, dates, charts, notifications, TipTap, dropzone, carousel, spotlight, and modals. The official Next.js guide puts MantineProvider and ColorSchemeScript in the App Router root layout and states that Mantine components cannot be Server Components because they need context for default props and the Styles API. Package entry points already carry 'use client'.
Chakra UI v3 is a rewrite on Ark UI primitives with a recipe-based styling system, still using Emotion at runtime. The App Router guide targets Next.js 15 and 16: install @chakra-ui/react and @emotion/react, generate a Provider that wraps Chakra plus next-themes, and add suppressHydrationWarning on <html>. Snippets via @chakra-ui/cli put composable pieces in your project, closer to shadcn's ownership model than classic Chakra v2.
Numbers that matter for the decision
For the week of 2026-10-05 to 2026-10-11, npm reported about 2.82 million downloads for @mantine/core and about 1.62 million for @chakra-ui/react. shadcn has no single runtime package to compare; class-variance-authority, which most shadcn Button stacks still use, sat near 65.9 million that same week because it appears across Tailwind codebases of every size. Downloads are not quality scores. They do show that all three remain in active production use, so "dead library" is not a reason to reject any of them.
App Router constraints that change the pick
Server Components are the default in the App Router. Interactive UI still needs 'use client'. The difference is where that boundary appears.
With shadcn, you keep leaf wrappers as Client Components and leave pages, layouts, and data-fetching trees as Server Components. That matches the pattern most Next.js teams already use with Tailwind. Bundle weight tracks the number of components you copied and how large their primitive deps are, not a monolithic UI package.
With Mantine, docs are explicit: components render on server and client, but they are not Server Components. You should enable experimental.optimizePackageImports for @mantine/core and @mantine/hooks so App Router tree-shaking stays sane. Compound APIs like Popover.Target need either a client boundary or the flat PopoverTarget export. For an internal admin full of dense forms, that client cost is often fine. For a content-heavy marketing site where every kilobyte of JS shows up in Core Web Vitals, that cost shows up as a real tax.
With Chakra v3, the happy path Provider setup is enough until you stream. When Chakra components first appear inside a streamed Suspense chunk, Emotion can insert <style> tags into the React tree after hydration and break the page. The current Chakra App Router docs add an optional EmotionRegistry that uses useServerInsertedHTML and @emotion/cache. If you turn on Next.js 16 Cache Components, streaming is the default path, so treat the registry as required for Chakra, not optional. Chakra also documents Turbopack hydration mismatches that push some teams to next dev --webpack / next build --webpack until Next.js fixes the Emotion path.
How I choose on real projects
I pick shadcn when:
- The product has a custom brand and designers will change tokens weekly.
- The team already ships Tailwind and wants file-level ownership (and AI tools that can edit component source).
- Marketing and docs pages should stay Server Components where possible, with small interactive leaves.
- We may later swap primitives under the same wrapper API (Base UI vs Radix), which shadcn already supports.
I pick Mantine when:
- An internal tool or B2B admin needs dates, charts, notifications, and forms this sprint, not next quarter.
- Nobody on the team wants to assemble every Select and DatePicker from primitives.
- Dark mode and a coherent default look matter more than pixel-unique marketing chrome.
- We will set
optimizePackageImportson day one and accept a client-heavy UI shell.
I pick Chakra v3 when:
- The codebase or the team already knows Chakra patterns, or we want Ark-based primitives with Chakra's recipe system.
- Snippets-in-repo ownership is attractive, but Tailwind-first is not.
- We schedule the Emotion registry and webpack workaround before the first Suspense-heavy route ships.
I reject "use all three." Shared design language across mixed libraries costs more than any single kit saves.
Migration and coexistence notes
Moving from Mantine or Chakra to shadcn is a rewrite of UI surfaces, not a codemod weekend. Moving the other way is the same. If you already standardized on shadcn, stay there and extend the registry; do not bolt Mantine DatePicker beside a shadcn Dialog unless you enjoy two theme systems.
If you are on shadcn and still choosing primitives, read the Radix vs Base UI post before you migrate wrappers. That decision is orthogonal to Mantine and Chakra.
Practical setup checklist
- New customer-facing Next.js app with Tailwind:
npx shadcn@latest init, keep Client Components at the leaves, link tokens to your design system. - Dense admin with calendar and charts due this month: Mantine template for App Router,
ColorSchemeScript,optimizePackageImports. - Chakra shop on Next 16 with Cache Components: Provider plus Emotion registry before the first streamed Chakra tree, and verify hydration under Turbopack before launch.
- Measure LCP and INP on a real route after the first feature lands. Library marketing pages will not show your JS cost.
Bottom line
shadcn wins most new product UIs I ship in 2026 because ownership and Server Component boundaries stay under my control. Mantine wins when speed of a full kit beats ownership. Chakra v3 wins for Chakra-shaped teams that plan for Emotion streaming. Pick the constraint you can live with, then stop shopping for libraries.
Sources worth reading next to this post: shadcn/ui introduction docs, Mantine Next.js guide (Server Components and optimizePackageImports), Chakra UI Next.js App Router guide (Provider, Emotion registry, Turbopack note), and npm download counts for the week of 2026-10-05 to 2026-10-11.