Skip to content
duck/ui

duck/ui vs shadcn/ui

The original copy-paste component collection and the CLI, schema and MCP server that every third-party registry rides on.

Short answer

duck/ui is not an alternative to shadcn/ui — it is a registry that installs into it. shadcn/ui gives you correct, accessible, deliberately neutral components; duck/ui gives those components an opinion by shipping a token set, plus signature components shadcn does not include. If you already run shadcn/ui, adding duck/ui is one line in components.json and one install.

shadcn/ui is best described as: the base layer every registry installs into. Compared against its publicly documented positioning as of 2026-07-31.

What shadcn/ui does well

Stated first, because a comparison that skips this is not worth reading.

  • The accessibility and correctness baseline the whole ecosystem builds on.
  • Neutral by design, which is exactly right when you have your own brand tokens.
  • The CLI, the registry schema and the MCP server — all of which duck/ui uses rather than replaces.
  • The largest primitive coverage: dialog, dropdown, table, form, everything duck/ui deliberately does not ship.

Where they differ

 shadcn/uiduck/ui
What it gives youAccessible primitives with neutral stylingA token set with an opinion, plus components shadcn does not ship
Colour directionLight-first; dark is derived from itDark designed first; light derived and checked separately
RelationshipThe base layerAdditive on top — install both
Install pathnpx shadcn add buttonnpx shadcn add @duck/theme — same CLI, @duck namespace

Which to pick

Pick shadcn/ui

Use shadcn/ui on its own when you already have a brand token set, or when the design is someone else's job and neutral is the correct starting point.

Visit shadcn/ui

Pick duck/ui

Add duck/ui when the neutral default is the problem — when the app works but looks like a demo, and you want a stated aesthetic without giving up shadcn's primitives.

Read the install guide

Using both

They are meant to run together. @duck/theme implements the full shadcn CSS-variable contract, so the shadcn components already in the project pick up the new tokens with no markup change. Keep using standard shadcn for dialog, dropdown and table — the theme styles them too.

See every comparison

FAQ

Do I need shadcn/ui installed before duck/ui?

Yes. duck/ui expects a project already initialised with shadcn, so components.json and lib/utils.ts exist. The @duck registry is added as a second namespace in that same components.json.

Will duck/ui break my existing shadcn components?

No markup changes and no files are overwritten. @duck/theme writes tokens into globals.css, so existing components change appearance but not behaviour. Reverting is reverting one file.