Qué es un registro
Un registro de shadcn es JSON servido a través de HTTP. Esa es la idea central. No hay paquetes que publicar, ni runtime, ni servicios en los que registrarse: usted aloja archivos en URLs, y el CLI de shadcn obtiene uno, lee lo que declara y escribe el resultado en el proyecto de destino.
Eso es lo que lo diferencia de una librería de componentes. Una librería es una dependencia: se instala, se importa desde ella y su código reside tras un número de versión en node_modules. Un registro le entrega el código fuente. Después de ejecutar shadcn add, los archivos son suyos: están en su repositorio, en su diff y son editables sin necesidad de un fork. El intercambio es el habitual: usted se encarga del mantenimiento y pierde las actualizaciones automáticas, y es el intercambio sobre el cual se construye todo el enfoque de shadcn.
"Registro" significa dos cosas en una conversación
La gente usa el término tanto para el *índice* (una colección a la que se apunta el CLI, con un namespace) como para un *elemento* individual (una cosa instalable en una URL). La documentación los mantiene separados —registry.json para el primero, registry-item.json para el segundo— y confundirlos es la razón por la que las guías de configuración parecen contradecirse entre sí.
Los dos archivos
| Qué es | Quién lo lee | |
|---|---|---|
registry.json | El índice: un nombre, una página de inicio y la lista de elementos que publica | El paso de compilación que genera los archivos de sus elementos; los exploradores de registros y el CLI al resolver un namespace |
registry-item.json | Una cosa instalable: sus archivos, dependencias y cualquier CSS, Tailwind o fuente que incluya | El CLI, en cada shadcn add |
Puede publicar un único elemento y no escribir nunca un índice. Es lo más rápido y útil que puede hacer con un registro, y es hacia donde se dirige el resto de esta guía, pero primero conviene conocer los campos.
Los campos de registry-item.json que importan
- `name` — el identificador utilizado en los comandos de instalación y en
registryDependencies. - `type` — qué tipo de elemento es:
registry:uipara un componente,registry:blockpara un bloque compuesto de varios archivos,registry:themepara un conjunto de design tokens,registry:stylepara un estilo inicial completo, además de variantes de hook, lib, page y file. - `files` — el código fuente que se escribe, cada uno con su propio
typey una rutatargetopcional. - `dependencies` — paquetes de npm que el elemento necesita, instalados automáticamente.
- `registryDependencies` — otros elementos del registro que este requiere, por nombre o URL. El CLI los resuelve, razón por la cual el orden de instalación se gestiona solo.
- `cssVars` — propiedades personalizadas de CSS, divididas en
theme,lightydark. - `css` — reglas de CSS arbitrarias, para cualquier cosa que las variables no puedan expresar.
- `font` — fuentes que necesita el elemento, para que la tipografía no sea un paso manual independiente.
- `categories`, `docs`, `meta` — metadatos para exploradores, instrucciones post-instalación y cualquier dato propio.
Las tres que suelen pasarse por alto son cssVars, css y font, porque casi todos los tutoriales muestran un componente. Esas tres son las que convierten un registro de un mecanismo de distribución de componentes en un mecanismo de distribución de sistemas de diseño.
Un elemento del registro no tiene por qué contener un componente. Puede contener un sistema de diseño.
Distribuir un tema completo como un único elemento
Aquí hay uno real, activo ahora mismo — el elemento detrás del kit gratuito Ambient Sage, recortado por brevedad. Nada de lo que contiene es un 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."
}Hay tres cosas que merecen atención. cssVars.theme contiene la mitad no cromática de un sistema de diseño — radios, sombras, tiempos de movimiento, tipografías — que es donde la mayoría de los "generadores de temas" se detienen y empiezan a perder el diseño. light y dark son objetos separados en lugar de una paleta y una inversión. Y docs contiene una instrucción escrita, que la CLI muestra después de la instalación y que un agente de código puede leer.
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
Instalarlo requiere un solo comando y repinta un proyecto existente en lugar de añadir contenido: cada componente que ya haga referencia a bg-primary o text-muted-foreground adopta los nuevos valores sin necesidad de ser editado.
npx shadcn add https://identityforge.io/r/ambient-sage.jsonCómo publicar el suyo propio, de forma mínima
- 1
Escriba un archivo de elemento
Comience con un único
registry-item.json. No necesitaregistry.json, un paso de compilación o un monorepo para que sea útil; un índice es importante una vez que tiene varios elementos y desea un espacio de nombres. - 2
Sírvalo en una URL estable
Cualquier host estático funciona. Lo importante es que la URL no cambie: es el comando de instalación, por lo que acabará pegada en READMEs, prompts y configuraciones de agentes.
https://identityforge.io/r/<slug>.json - 3
Configure el tipo de contenido y el CORS correctos
Sírvalo como
application/json. Si algo en un navegador va a solicitarlo —un explorador de registros, una herramienta de previsualización— envíe también encabezados CORS permisivos. Esta es la razón más común por la que un elemento que parece correcto no se instala. - 4
Pruebe con la CLI real
Instálelo en un proyecto de prueba antes de publicar la URL en cualquier lugar. Un error de esquema aparece aquí en segundos, pero en un informe de errores tardaría semanas.
npx shadcn add https://example.com/r/thing.json
Versionado de la URL, no del archivo
Dado que la URL es el contrato, cambiar lo que devuelve cambia lo que todo el mundo instalará a continuación. Si necesita un cambio disruptivo (breaking change), publique una ruta nueva y deje la antigua activa. Editar silenciosamente un elemento en su lugar es el equivalente en los registros a hacer un force-push.
Espacios de nombres y registros privados
Una URL directa es suficiente para un elemento. Una vez que publique varios, un espacio de nombres es preferible: configure el registro una vez en components.json e instale mediante el nombre corto, con múltiples registros uno al lado del otro.
Los registros privados son compatibles y la CLI acepta cuatro formas de autenticación: un token bearer (OAuth 2.0), una clave de API, autenticación básica y un parámetro de consulta. Cuál utilizar es una decisión de hosting, no de shadcn.
La opción del parámetro de consulta es la que debe pensarse dos veces
Un token en una URL acaba en el historial de la shell, en los logs de CI, en el components.json que alguien sube al repositorio y en cualquier log de proxy por el camino. Prefiera un token bearer o un encabezado de clave de API y, si debe usar un parámetro de consulta, trate ese token como comprometido en el momento en que se use y rótelo periódicamente.
Cómo se resuelve el orden de instalación
registryDependencies permite que un elemento dependa de otros, incluso entre diferentes registros. La CLI resuelve el grafo e instala en orden de dependencia, por lo que un bloque que necesita un botón recibe el botón primero, haya pedido usted el botón o no.
El modo de fallo que debe conocer es el ciclo: dos elementos que se declaran mutuamente como dependencias. Nada se resuelve y el error apunta al paso de resolución en lugar de a su JSON. Si una instalación se cuelga o falla en un elemento que parece correcto, dibuje las flechas de dependencia en papel antes de depurar cualquier otra cosa.
Dónde encontrar registros públicos
Esta es la pregunta más frecuente y menos respondida sobre los registros, y tiene tres respuestas reales. shadcn mantiene un índice de registros de código abierto de registros disponibles de serie. registry.directory es un explorador independiente que permite navegar y previsualizar elementos antes de instalarlos. Y un número creciente de proyectos individuales —incluido este sitio— publican una URL de elemento estable y simplemente la documentan.
La tercera categoría es fácil de pasar por alto y conviene revisarla primero: si un proyecto que ya le gusta tiene un tema o un conjunto de componentes que desea, busque una ruta /r/ antes de asumir que tiene que copiar el CSS a mano.
Por qué esto es importante para la UI generada por agentes
Un agente de código al que se le dan tres colores de marca tiene tres valores y aproximadamente veinticinco indefinidos: estados hover y active, texto atenuado, bordes, ring, destructive, series de gráficos, y cada uno de ellos nuevamente en modo oscuro. Los rellena de forma competente y diferente cada vez, que es exactamente la deriva que un sistema de diseño debe evitar.
Un elemento de registro cierra esa brecha con un solo comando y es portable de una manera que nada más en este espacio lo es: v0 acepta un registro como fuente de sistema de diseño, Bolt puede instalar uno desde su terminal en el navegador, y Cursor o Claude Code pueden ejecutar el mismo comando en su repositorio. Una URL, cuatro herramientas, sin integraciones específicas por herramienta. La parte escrita —qué no hacer nunca, qué variante recibe una acción destructiva— debe ir junto a ello en un DESIGN.md, porque cssVars responde a *qué color* y solo la prosa responde a *qué nunca*.
Inspeccione un elemento de registro de tema real
Cada kit público aquí publica un registry-item.json estable con 27 variables de tema y 28 roles semánticos en light y dark. Instale uno o lea el JSON para ver cómo se estructura un elemento de tema.
FAQ
¿Qué es un registro de shadcn?
Un conjunto de archivos JSON servidos a través de HTTP desde los cuales la CLI de shadcn puede realizar instalaciones. registry.json es el índice de lo que se publica; cada registry-item.json describe un elemento instalable: sus archivos, dependencias y, opcionalmente, variables CSS, configuración de Tailwind y fuentes. No hay paquetes que publicar ni servicios en los que registrarse.
¿Puede un elemento del registro instalar un tema en lugar de un componente?
Sí. Utilice type: registry:theme y coloque sus design tokens en cssVars, divididos en theme, light y dark. Añada font para las tipografías y css para cualquier cosa que las variables no puedan expresar. De este modo, el elemento rediseña un proyecto existente en lugar de añadirle archivos, ya que los componentes que ya hacen referencia a tokens semánticos adoptan los nuevos valores.
¿Necesito publicar en npm?
No. Un registro se sirve a través de HTTP, por lo que cualquier host estático funciona. npm es un modelo de distribución diferente con otras ventajas e inconvenientes: una dependencia versionada en node_modules en lugar de código fuente escrito en su repositorio.
¿Dónde puedo encontrar registros de shadcn públicos?
En tres lugares: el índice de registros de código abierto de shadcn con registros disponibles de serie, registry.directory como un explorador independiente para navegar y previsualizar elementos, y proyectos individuales que publican una URL de elemento estable y la documentan. Consulte esta última opción antes de asumir que debe copiar el CSS a mano.
¿Cómo decide la CLI el orden de instalación de los elementos?
registryDependencies declara qué otros elementos necesita un elemento; la CLI resuelve ese grafo e instala siguiendo el orden de dependencias. El caso de error es un ciclo (dos elementos que se declaran mutuamente), que se manifiesta como un error de resolución en lugar de un error de JSON, por lo que se recomienda revisar primero las flechas de dependencia.
¿Puede un registro ser privado?
Sí. La CLI admite un token bearer (OAuth 2.0), una clave de API, autenticación básica y un parámetro de consulta. Se recomienda preferir un método basado en cabeceras: un token en una cadena de consulta acaba en el historial de la shell, en los logs de CI y en cualquier log de proxy intermedio.
¿Por qué no se instala mi elemento del registro?
Lo más común es que la respuesta no se sirva como application/json, o que una herramienta basada en navegador esté bloqueada por la falta de cabeceras CORS. Después de eso, verifique el elemento frente al esquema de registry-item.json y pruébelo con npx shadcn add <url> en un proyecto de prueba antes de publicar la URL en cualquier lugar.