O que é um registry
Um registry do shadcn é um JSON servido via HTTP. Essa é a ideia central. Não há pacote para publicar, nem runtime, nem serviço para se cadastrar: você hospeda arquivos em URLs, e a CLI do shadcn busca um deles, lê o que ele declara e escreve o resultado no projeto de destino.
É isso que o torna diferente de uma biblioteca de componentes. Uma biblioteca é uma dependência — você a instala, importa dela e o código reside atrás de um número de versão no node_modules. Um registry entrega o código-fonte. Após o shadcn add, os arquivos são seus: no seu repo, no seu diff, editáveis sem a necessidade de um fork. A troca é a habitual — você assume a manutenção e perde as atualizações automáticas — e é nessa troca que toda a abordagem do shadcn é construída.
"Registry" significa duas coisas em conversas técnicas
As pessoas usam o termo tanto para o *índice* (uma coleção para a qual você aponta a CLI, com um namespace) quanto para um único *item* (uma coisa instalável em uma URL). A documentação os mantém separados — registry.json para o primeiro, registry-item.json para o segundo — e confundi-los é o motivo pelo qual os guias de configuração parecem se contradizer.
Os dois arquivos
| O que é | Quem o lê | |
|---|---|---|
registry.json | O índice: um nome, uma homepage e a lista de itens que você publica | A etapa de build que gera os arquivos de itens; exploradores de registry e a CLI ao resolver um namespace |
registry-item.json | Um item instalável: seus arquivos, dependências e qualquer CSS, Tailwind ou fonte que ele traga | A CLI, em cada shadcn add |
Você pode publicar um único item e nunca escrever um índice. Essa é a maneira mais rápida e útil de usar um registry, e é para isso que o restante deste guia converge — mas vale a pena conhecer os campos primeiro.
Os campos do registry-item.json que importam
- `name` — o identificador usado nos comandos de instalação e em
registryDependencies. - `type` — que tipo de coisa é esta:
registry:uipara um componente,registry:blockpara um bloco composto de vários arquivos,registry:themepara um conjunto de tokens,registry:stylepara um estilo inicial completo, além de variantes de hook, lib, page e file. - `files` — o código-fonte que será escrito, cada um com seu próprio
typee caminhotargetopcional. - `dependencies` — pacotes npm que o item necessita, instalados automaticamente para você.
- `registryDependencies` — outros itens de registry que este requer, por nome ou URL. A CLI os resolve, e é por isso que a ordem de instalação se organiza sozinha.
- `cssVars` — propriedades customizadas de CSS, divididas em
theme,lightedark. - `css` — regras de CSS arbitrárias, para tudo que as variáveis não conseguem expressar.
- `font` — fontes que o item necessita, para que a tipografia não seja uma etapa manual separada.
- `categories`, `docs`, `meta` — metadados para exploradores, instruções pós-instalação e quaisquer informações personalizadas.
As três que costumam ser ignoradas são cssVars, css e font, porque quase todo tutorial demonstra um componente. Essas três são o que transformam um registry de um mecanismo de distribuição de componentes em um mecanismo de distribuição de design system.
Um item de registry não precisa conter um componente. Ele pode conter um design system.
Enviando um tema completo como um único item
Aqui está um exemplo real, ativo agora — o item por trás do kit gratuito Ambient Sage, resumido por questões de espaço. Nada nele é um componente:
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "ambient-sage",
"type": "registry:theme",
"title": "Ambient Sage",
"description": "A warm-sage neutral-surface kit with a single vivid yellow accent.",
"categories": ["minimal", "warm-neutral", "flat", "calm", "yellow-accent"],
"cssVars": {
"theme": {
"font-heading": "'Plus Jakarta Sans', sans-serif",
"font-mono": "'JetBrains Mono', monospace",
"radius-button": "0.75rem",
"radius-card": "1.25rem",
"shadow-sm": "none",
"duration": "180ms",
"ease": "cubic-bezier(0.4,0,0.2,1)"
},
"light": {
"background": "72 19% 95%",
"foreground": "84 10% 10%",
"card": "70 11% 89%",
"primary": "54 98% 66%"
},
"dark": {
"background": "84 10% 10%",
"foreground": "68 13% 88%",
"card": "80 9% 14%"
}
},
"font": { "heading": "Plus Jakarta Sans", "mono": "JetBrains Mono" },
"docs": "Use the semantic tokens; do not add a second accent."
}Três coisas merecem atenção. cssVars.theme carrega a metade não relacionada a cores de um design system — radii, sombras, timing de animação, tipografias — que é onde a maioria dos "geradores de temas" para e começa a perder o design. light e dark são objetos separados, em vez de uma única paleta e uma inversão. E docs carrega uma instrução escrita, que a CLI exibe após a instalação e que um agente de código pode ler.
Token specimen · real values
Ambient Sage
Live renderAmbient Sage's actual tokens — the same values its exports use.
Color tokens
Ambient Sage
Core
background
H 72 · C0, 0, 2, 4
foreground
H 84 · C7, 0, 18, 89
card
H 70 · C0, 0, 3, 10
muted
H 80 · C1, 0, 3, 7
border
H 69 · C0, 0, 3, 15
Brand
primary
H 53 · C0, 8, 68, 0
primary-fg
H 84 · C7, 0, 18, 89
secondary
H 70 · C0, 0, 3, 10
accent
H 52 · C0, 8, 60, 3
ring
H 53 · C0, 8, 68, 0
Semantic
destructive
H 6 · C0, 70, 78, 25
destructive-fg
H 0 · C0, 0, 0, 0
success
H 130 · C61, 0, 51, 55
warning
H 35 · C0, 38, 91, 21
muted-fg
H 84 · C2, 0, 6, 66
Charts
chart-1
H 53 · C0, 8, 68, 0
chart-2
H 210 · C65, 33, 0, 17
chart-3
H 142 · C44, 0, 28, 25
chart-4
H 340 · C0, 48, 32, 12
chart-5
H 33 · C0, 30, 68, 9
Typography
Ambient Sage
Scale: compact-product
Density: balanced
Heading · Plus Jakarta Sans · 1.875rem
Sample headline
Subheading · Plus Jakarta Sans · 1.375rem
A warm-sage neutral-surface mobile kit with a single vivid yellow accent, flat tonal cards, and oversized display numerals.
Body · Plus Jakarta Sans · 1rem
Ambient Sage uses a near-white warm-sage canvas (#f3f4ef) with card panels distinguished only by a tonal shift to #e5e6e0, never by shadows or borders. A single vivid yellow (#fee951) is the only saturated color and appears sparingly at component scale as orbs, button fills, and focus rings. Primary data values render as oversized bold hero numerals with a small superscript unit. Typography is a friendly rounded geometric (Plus Jakarta Sans) with no uppercase and no tight tracking, while JetBrains Mono is reserved for hex codes and technical strings. Generous rounding and luminance-only contrast give the whole system a calm, minimal feel.
Mono · JetBrains Mono · 0.8125rem
npx shadcn add ambientsage.json
Aa
Plus Jakarta Sans · Heading
Aa
Plus Jakarta Sans · Body
ABCDEFGHIJKLM NOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789 & @ # % →
Tokens
Ambient Sage primitives
Radius scale
Component radius
Elevation
Spacing · base 4px
Instalá-lo requer um único comando, e ele repinta um projeto existente em vez de apenas adicionar a ele: cada componente que já referencia bg-primary ou text-muted-foreground assume os novos valores sem precisar ser editado.
npx shadcn add https://identityforge.io/r/ambient-sage.jsonPublicando o seu próprio, de forma minimalista
- 1
Escreva um arquivo de item
Comece com um único
registry-item.json. Você não precisa de umregistry.json, de uma etapa de build ou de um monorepo para ser útil — um índice só importa quando você tem vários itens e deseja um namespace. - 2
Hospede-o em uma URL estável
Qualquer host estático funciona. O importante é que a URL não mude: ela é o comando de instalação, portanto, acaba colada em READMEs, prompts e configurações de agentes.
https://identityforge.io/r/<slug>.json - 3
Configure o content type e o CORS corretamente
Sirva como
application/json. Se algo em um navegador for buscá-lo — um explorador de registry, uma ferramenta de preview — envie também headers de CORS permissivos. Este é o motivo mais comum para um item que parece correto não ser instalado. - 4
Teste com a CLI real
Instale em um projeto de teste antes de publicar a URL em qualquer lugar. Um erro de schema aparece aqui em segundos, mas em um relatório de bug levaria semanas.
npx shadcn add https://example.com/r/thing.json
Versione a URL, não o arquivo
Como a URL é o contrato, alterar o que ela retorna altera o que todos instalarão a seguir. Se você precisar de uma mudança disruptiva (breaking change), publique um novo caminho e mantenha o antigo ativo. Editar silenciosamente um item no local é o equivalente a um force-push no registry.
Namespaces e registries privados
Uma URL bruta serve para um único item. Quando você publica vários, um namespace é melhor: configure o registry uma vez no components.json e instale por nome curto, com múltiplos registries lado a lado.
Registries privados são suportados e a CLI aceita quatro formas de autenticação: um bearer token (OAuth 2.0), uma API key, autenticação básica e um parâmetro de query. Qual você usará é uma decisão de hospedagem, não do shadcn.
A opção de parâmetro de query é a que exige cautela
Um token em uma URL acaba no histórico do shell, em logs de CI, no components.json que alguém commita e em qualquer log de proxy no caminho. Prefira um bearer token ou um header de API key e, se precisar usar um parâmetro de query, trate esse token como comprometido no momento em que for usado e rotacione-o periodicamente.
Como a ordem de instalação é resolvida
registryDependencies permite que um item dependa de outros itens, inclusive entre registries diferentes. A CLI resolve o grafo e instala na ordem de dependência, portanto, um bloco que precisa de um botão recebe o botão primeiro, quer você tenha solicitado ou não.
O modo de falha que você deve conhecer é o ciclo: dois itens que declaram um ao outro. Nada é resolvido, e o erro aponta para a etapa de resolução em vez de para o seu JSON. Se uma instalação travar ou falhar em um item que parece correto, desenhe as setas de dependência no papel antes de depurar qualquer outra coisa.
Onde encontrar registries públicos
Esta é a pergunta mais feita e menos respondida sobre registries, e ela tem três respostas reais. O shadcn mantém um índice de registry open-source de registries disponíveis nativamente. O registry.directory é um explorador independente que permite navegar e visualizar itens antes de instalá-los. E um número crescente de projetos individuais — incluindo este site — publica uma URL de item estável e simplesmente a documenta.
A terceira categoria é fácil de ignorar e vale a pena checar primeiro: se um projeto que você já gosta possui um tema ou um conjunto de componentes que você deseja, procure por um caminho /r/ antes de assumir que terá que copiar o CSS manualmente.
Por que isso importa para UIs construídas por agentes
Um agente de código que recebe três cores de marca tem três valores e aproximadamente vinte e cinco indefinidos: estados de hover e active, texto muted, bordas, ring, destructive, séries de gráficos e cada um desses novamente no modo dark. Ele os preenche de forma competente, mas diferente a cada vez, que é exatamente o desvio (drift) que um design system deve evitar.
Um item de registry fecha essa lacuna em um único comando, e é portátil de uma forma que nada mais neste espaço é: o v0 aceita um registry como fonte de design system, o Bolt pode instalar um a partir de seu terminal no navegador, e o Cursor ou Claude Code podem executar o mesmo comando no seu repo. Uma URL, quatro ferramentas, sem integração por ferramenta. A parte escrita — o que nunca fazer, qual variante uma ação destrutiva recebe — deve estar ao lado disso em um DESIGN.md, porque cssVars responde *qual cor* e apenas a prosa responde *o que nunca*.
Inspecione um item de registry de tema real
Cada kit público aqui publica um registry-item.json estável com 27 variáveis de tema e 28 funções semânticas em light e dark. Instale um ou leia o JSON para ver como um item de tema é estruturado.
FAQ
O que é um shadcn registry?
Um conjunto de arquivos JSON servidos via HTTP dos quais a CLI do shadcn pode realizar a instalação. O registry.json é o índice do que você publica; cada registry-item.json descreve um item instalável — seus arquivos, dependências e, opcionalmente, variáveis CSS, config do Tailwind e fontes. Não há pacote para publicar nem serviço para se cadastrar.
Um item de registry pode instalar um tema em vez de um componente?
Sim. Use type: registry:theme e coloque seus design tokens em cssVars, divididos em theme, light e dark. Adicione font para tipografias e css para qualquer coisa que as variáveis não consigam expressar. O item então repinta um projeto existente em vez de adicionar arquivos a ele, pois os componentes que já referenciam tokens semânticos assumem os novos valores.
Preciso publicar no npm?
Não. Um registry é servido via HTTP, então qualquer host estático funciona. O npm é um modelo de distribuição diferente com trade-offs distintos — uma dependência versionada em node_modules em vez de código-fonte escrito no seu repo.
Onde posso encontrar shadcn registries públicos?
Em três lugares: o índice de registries open-source do shadcn com registries disponíveis nativamente, o registry.directory como um explorador independente para navegar e visualizar itens, e projetos individuais que publicam uma URL de item estável e a documentam. Verifique a terceira opção antes de assumir que terá que copiar o CSS manualmente.
Como a CLI decide a ordem de instalação das coisas?
O registryDependencies declara de quais outros itens um item precisa, e a CLI resolve esse grafo e instala na ordem de dependência. O caso de falha é um ciclo — dois itens declarando um ao outro — que surge como um erro de resolução em vez de um erro de JSON, portanto, verifique as setas de dependência primeiro.
Um registry pode ser privado?
Sim. A CLI suporta bearer token (OAuth 2.0), API key, autenticação básica e parâmetro de query. Prefira um método baseado em header: um token em uma query string acaba no histórico do shell, logs de CI e em qualquer log de proxy no caminho.
Por que meu item de registry não instala?
Na maioria das vezes, a resposta não é servida como application/json, ou uma ferramenta baseada em navegador é bloqueada por falta de headers de CORS. Depois disso, valide o item contra o schema do registry-item.json e teste com npx shadcn add <url> em um projeto de teste antes de publicar a URL em qualquer lugar.