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/ui | duck/ui | |
|---|---|---|
| What it gives you | Accessible primitives with neutral styling | A token set with an opinion, plus components shadcn does not ship |
| Colour direction | Light-first; dark is derived from it | Dark designed first; light derived and checked separately |
| Relationship | The base layer | Additive on top — install both |
| Install path | npx shadcn add button | npx 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/uiPick 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 guideUsing 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.
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.
