CLI & registry
Find, inspect and install components from the command line.
Templates in one command
Templates install by URL. Pick the path that matches where you start.
New project
Use init when you're starting from nothing. It creates the Next.js app with the theme and every component the template needs, so there is nothing to set up first.
pnpm dlx shadcn@latest init -d -n my-saas https://paneui.dev/r/saas.jsonThen run cd my-saas and pnpm dev.
Existing project
Use add when the app is already set up and you want the template's pages next to your own.
pnpm dlx shadcn@latest add https://paneui.dev/r/saas.jsonBefore you run it, check these.
- The app uses the App Router and Tailwind CSS 4. If it has no
components.json, the CLI offers to create one first. - Your work is committed, so you can review the diff afterwards. Add
--dry-runto list the files without writing them. - Nothing you need lives at the template's routes (table below). The CLI asks before replacing an existing file;
--overwritereplaces it without asking. - The theme rewrites its variables in your global CSS, so custom values under the same names are replaced. Re-apply them after.
The notion-editor and email-editor blocks install the same way, for example add https://paneui.dev/r/notion-editor.json.
Pick a template
Swap saas in either command for another name. Each one also adds its parts under components/<name>/.
| Template | You get | Writes to |
|---|---|---|
| saas | Marketing pages, sign-in and a dashboard | app/page.tsxapp/not-found.tsxapp/pricingapp/changelogapp/(auth)app/dashboard |
| vscode | A code editor with a shared workspace and terminals | app/page.tsx |
| agent-workspace | The agent workspace with its ACP bridge server | app/page.tsxserver/acp-bridge.mjs |
| docs | A docs site | app/docs/page.tsx |
| blog | A blog with a post page | app/blog |
The registry
paneui is published as one static JSON file per item at https://paneui.dev/r/<name>.json. Register the namespace so every command below accepts short names like @paneui/button.
The function(){throw Error("Attempted to call CLI_NAME() from the server but CLI_NAME is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")} CLI
Runs the shadcn CLI for you and records what it installs, so one command updates every item and the theme. Both CLIs write the same files; use either.
pnpm dlx paneui@latest initRegisters the namespace above in components.json, running shadcn init first if there is none, and installs the theme.
| Command | What it does |
|---|---|
| add <items...> | Adds items and records them in paneui.json. |
| search [query] | Finds items by name, title, description or category. list shows them all. |
| info <item> | Lists an item's dependencies and files, and where the files go. |
| update | Reinstalls the theme and every installed item, then your accent, radius and icon style. |
| theme [accent] | Reinstalls the theme with an accent and --radius. --list shows the choices. |
update replaces files whole, so commit first and preview with --dry-run. It also finds items you added with the shadcn CLI. Templates are skipped unless you pass --templates, because reinstalling one replaces its routes.
pnpm dlx paneui@latest update --dry-runadd
Copies one or more items into your project, along with their registryDependencies (other @paneui items) and npm dependencies.
pnpm dlx shadcn@latest add @paneui/date-range-picker @paneui/tool-resultAdd --dry-run to preview the files without writing them, or --diff <path> to see what would change in a file you already have. Use --overwrite to replace existing files and --path to choose where they go.
view
Prints an item's metadata and source before you install it.
pnpm dlx shadcn@latest view @paneui/prompt-barsearch
Lists the items in the registry, optionally filtered with -q. list is an alias.
pnpm dlx shadcn@latest search @paneui -q "chart"Install by URL
Any command also takes an item's URL in place of its name. Keep the namespace registered anyway, because items depend on other @paneui items such as the theme.
pnpm dlx shadcn@latest add https://paneui.dev/r/button.jsonUpdating
Installed files are yours, so nothing updates on its own. To pull a newer version of an item, compare first with --diff, then re-add it with --overwrite and re-apply any local edits. Check the Changelog for what moved.
pnpm dlx shadcn@latest add @paneui/button --diff components/ui/button.tsxTo update everything at once, run update from the paneui CLI.
Upgrading after a theme change
When a release changes the theme, update it first, then the components that use it. Commit before you start so you can review every change.
- Reinstall the theme.
--overwriteis required: the theme also shipspackages/ui/src/lib/utils.ts, and without it a non-interactive run stops at that question before the stylesheet is touched.
pnpm dlx shadcn@latest add @paneui/theme --overwrite- Reinstall your accent and radius presets, if you use them, so they apply on top of the new theme.
- Run the upgrade check. It lists tokens the release removed, broken rules from older installs and code that uses a changed API, with a fix for each.
--fixcleans the stylesheet, then checks again and lists only what is left; it never edits your source.
pnpm dlx shadcn@latest add @paneui/upgrade-check- Re-add the components you use with
--overwrite, a few at a time, and re-apply local edits from the diff.
Migrations
Newest first. Each step lists only what needs your attention.
| Theme | What changed | What to do |
|---|---|---|
| 2.3 | The frame inputs (--frame-r, --frame-p, --frame-b) reset on every element in @layer base instead of @property, so reinstalling the theme leaves the stylesheet unchanged. | Reinstall the theme, then run the upgrade check with --fix to delete the old @property rules. |
| 2.2 | Every radius token stops at --radius-max (16px), and the supported --radius range is 0 to 1rem. Old rounded-4xl and rounded-5xl corners come out at 16px. | Reinstall the theme. The upgrade check flags a stylesheet without the cap or a base above 1rem. |
| 2.1 | Wide-gamut colours and the layered popover shadow now apply. Older installs wrote them without the leading --, so browsers ignored them. | Reinstall the theme, then run the upgrade check with --fix to delete the broken lines. |
| 2 | New foundation. The --accent-50 to --accent-950 ramp is replaced by eight role tokens; --radius goes from 0.625rem to 0.5rem; alpha grey text and borders; four shadow levels; Inter, JetBrains Mono and Newsreader font stacks; frame-* and rounded-inner utilities. | Move accent-* classes to primary roles, then delete the ramp (--fix). Keep 0.625rem with theme-radius-lg if you prefer it. Install fonts to self-host the fonts. Reinstall components so nested corners use the frame utilities. |
| 1.x | size on Input and NativeSelect became the control size; the native attribute moved to htmlSize. | Rename numeric size props to htmlSize. The upgrade check lists each one. |
The installed version is meta.version in @paneui/theme; view @paneui/theme prints the current one.
What the CLI merges
- Variables in
:root,.darkand@themeare added or updated in place, so new values replace old ones under the same name. - Nothing is ever removed. A token a release drops stays in your stylesheet, along with any utility it generates; the upgrade check finds them.
- Rules inside
@supportsand@mediablocks merge by selector and property, the same as variables. @propertyrules are appended again on every reinstall, so the theme ships none. Copies left by theme 2.2 and earlier are harmless; the upgrade check removes them.- Files with a
~/target, such as the design skill and the upgrade check, land at the project root even when your components live undersrc/. - Component files are replaced whole with
--overwrite, or skipped after a prompt without it. Use--diffor--dry-runfirst; there is no three-way merge of your edits.
Switch the icon style
The icon set comes in three styles with the same exports, and all of them install to the same file. Replace it to switch the icons in every component.
pnpm dlx shadcn@latest add https://paneui.dev/r/icons-puffy.json --overwritepnpm dlx shadcn@latest add https://paneui.dev/r/icons-outline.json --overwriteTo go back to the default rounded set, run this.
pnpm dlx shadcn@latest add https://paneui.dev/r/icons.json --overwriteWhen you later add an item that uses icons, the CLI asks before overwriting packages/ui/src/icons/index.tsx. Answer no to keep your style. A non-interactive run stops at that question. If you add with --overwrite, the rounded set comes back, so run your style's command again. Compare the styles on Icons.
Item types
registry:uiis a component, installed to youruialias.registry:blockis a block or template, which can ship several files including apage.tsx.registry:themeis the theme or an accent preset, which writes CSS variables rather than files (see Theming).registry:libandregistry:componentare shared files such as@paneui/utilsand@paneui/icons.
This is a trimmed item file as the CLI receives it.