Loading...
Loading...
Publish your own work to 21st.dev and manage it from the terminal with the `21st` CLI (`@21st-dev/cli`): publish a React component to a team library, publish a CSS theme or a template listing, edit / unpublish / delete your published items, and read/replace your public profile page (bento board). Triggers when the user says "publish/share/upload this to 21st", "залей в наш регистр", "опубликуй компонент/тему/темплейт", "share with team", "make this reusable", "unpublish/edit/delete my component", "change its visibility", "add this to my 21st profile/bento", "update my profile page", "обнови мой профиль на 21st", "добавь блок в бенто". For finding and installing existing items use `21st-cli-use`; for turning a project's design tokens into a theme use `21st-design-sync`.
npx skill4agent add 21st-dev/skill 21st-registry21st@21st-dev/cli21st_sk_…21st login--api-key 21st_sk_…TWENTYFIRST_TOKENAPI_KEY_21ST@21st-dev/cli21st21st search "<query>"21st publish ./path/to/Component.tsx \
--to default \
--description "1-2 sentences: what it does and when to use it"| User says… | Flag |
|---|---|
| "share with team", "залей нам", default for any unqualified ask | (none — defaults to |
| "shareable link but not listed" | |
| "publish publicly", "make it public on 21st" | |
| "restrict to the team library", "keep it internal" | |
--public| Flag | When to use |
|---|---|
| Required, 10+ chars: what it does + when to use it. Never fabricate — read the code or ask the user. |
| Override auto-detected name / URL slug / 1-5 tags. |
| Demo file. Auto-found ( |
| Optional static thumbnail (png/jpg/webp); the library also renders a live iframe. |
| Target sub-registry (default |
| Target team library (e.g. |
| Repeatable. A shadcn dep by bare name, URL, or |
| Visibility (default |
npx @21st-dev/cli add @<handle>/<slug>--slug--public:root.dark21st publish-theme ./my-theme.css --name "Midnight" [--tags dark,minimal]21st-design-syncdraft21st publish-template "SaaS Starter" \
--site https://demo.example.com \
--preview https://example.com/thumb.png \
[--description "…"] [--price 49] [--buy-url https://…] [--video https://…] [--tags 1,2]# Update YOUR OWN item (owner-only; 404 otherwise).
21st edit <slug> --type component --visibility public|unlisted|private \
[--description "…"] [--tags a,b]
21st edit <theme-id> --type theme [--visibility public|private] [--name "New Name"] [--tags a,b]
21st edit <template-id> --type template [--name N] [--description D] [--tags 1,2]
# Remove an item. ALWAYS requires --yes. Semantics differ by type:
# component -> unpublished (visibility set to private; reversible via edit/re-publish)
# theme -> unpublished (removed from the marketplace; reversible)
# template -> PERMANENT hard delete
21st delete <id|slug> --type component|theme|template --yes--visibility--namepublic|privatehttps://21st.dev/studio/<username>21st.dev/@youset--tagsedit21st profile get [--json] # read your current board (as blocks)
21st profile set --file board.json # replace it (JSON array, or pipe it via stdin)
21st profile set --clear # revert to the classic (non-bento) profile
21st profile upload ./cover.png # upload a png/jpg/gif/webp, prints a urlboard.json[
{ "type": "component", "demoId": 143 },
{ "type": "social", "url": "https://x.com/you" },
{ "type": "note", "text": "Building UI for 21st.dev" },
{ "type": "hire", "headline": "Work with me", "url": "https://cal.com/you" },
{ "type": "divider" },
{ "type": "image", "mediaUrl": "<url from `profile upload`>" }
]component21st search --mine21st getsocialnotehireprosupportimagemediaUrlprofile uploaddividerwh21st teams # your teams
21st team <teamId> # a team's libraries
21st team-lists <teamId> # a team's shared bookmark lists
21st team-components <teamId> [--library <id>]
21st init --client cursor|claude|codex|vscode|windsurf [--write] # write MCP config