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 descarga 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 con el CLI, con un espacio de nombres) como para un *elemento* individual (una cosa instalable en una URL). La documentación los mantiene separados: registry.json para el primero y registry-item.json para el segundo; confundirlos es la razón por la que las guías de configuración parecen contradecirse.
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 espacio de nombres |
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 conviene conocer los campos primero.
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 CSS personalizadas, divididas en
theme,lightydark. - `css`: reglas CSS arbitrarias, para cualquier cosa que las variables no puedan expresar.
- `font`: fuentes que el item necesita, para que el tipo no sea un paso manual independiente.
- `categories`, `docs`, `meta`: metadatos para exploradores, instrucciones post-instalación y cualquier otra cosa propia.
Las tres que se pasan por alto son cssVars, css y font, porque casi todos los tutoriales demuestran un componente. Esas tres son las que convierten un registry de un mecanismo de distribución de componentes en un mecanismo de distribución de sistemas de diseño.
Un item de registry no tiene por qué contener un componente. Puede contener un sistema de diseño.
Enviar un tema completo como un solo item
Aquí hay uno real, disponible ahora mismo: el item detrás del kit gratuito Ambient Sage, recortado para ahorrar espacio. Nada en él 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 vale la pena notar. cssVars.theme transporta la mitad no relacionada con el color de un sistema de diseño (radii, sombras, tiempos de movimiento, tipos de letra), 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 sola paleta y su inversión. Y docs transporta una instrucción escrita, que la CLI muestra tras 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.
Instalarlo es un solo comando, y repinta un proyecto existente en lugar de añadir elementos a él: cada componente que ya 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.jsonPublicar el propio, de forma mínima
- 1
Escribir un único archivo de item
Comience con un único
registry-item.json. No necesitaregistry.json, un paso de compilación ni un monorepo para que sea útil. Un índice importa una vez que tenga varios items y quiera un espacio de nombres. - 2
Servirlo en una URL estable
Cualquier host estático funciona. Lo que importa es que la URL no cambie: es el comando de instalación, por lo que acaba pegada en READMEs, prompts y configuraciones de agentes.
https://identityforge.io/r/<slug>.json - 3
Establecer el content type y CORS correctos
Sirva
application/json. Si algo en un navegador va a realizar una petición (un explorador de registry, una herramienta de previsualización), envíe también cabeceras CORS permisivas. Esta es la razón más común por la que un item que parece correcto no se instala. - 4
Probar con la CLI real
Instálelo en un proyecto de prueba antes de publicar la URL en cualquier lugar. Un error de esquema se detecta aquí en segundos y en un reporte de error en semanas.
npx shadcn add https://example.com/r/thing.json
Versionar la URL, no el archivo
Debido a que la URL es el contrato, cambiar lo que devuelve cambia lo que todo el mundo instalará después. Si necesita un cambio disruptivo, publique una nueva ruta y deje la antigua funcionando. Editar silenciosamente un item in situ es el equivalente en un registry al force-pushing.
Namespaces y registries privados
Una URL pura está bien para un solo item. Una vez que publique varios, un namespace es más conveniente: configure el registry una vez en components.json e instale mediante el nombre corto, con múltiples registries funcionando en paralelo.
Los registries privados son compatibles y la CLI acepta cuatro formas de autenticación: un bearer token (OAuth 2.0), una API key, autenticación básica y un parámetro de consulta. Cuál utilice es una decisión de hosting, no de shadcn.
La opción de parámetro de consulta es la que requiere pensárselo 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 en el camino. Prefiera un bearer token o una cabecera de API key, y si debe usar un parámetro de consulta, trate ese token como comprometido en el momento en que se use y rotelo periódicamente.
Cómo se resuelve el orden de instalación
registryDependencies permite que un item dependa de otros items, incluso entre diferentes registries. La CLI resuelve el grafo e instala en orden de dependencia, por lo que un bloque que necesite un botón obtiene el botón primero, le haya pedido usted el botón o no.
El modo de fallo que debe conocer es un ciclo: dos items que declaran el uno al otro. Nada se resuelve y el error apunta al paso de resolución en lugar de a su JSON. Si una instalación se queda colgada o falla en un item que parece estar bien, dibuje las flechas de dependencia en papel antes de depurar cualquier otra cosa.
Dónde encontrar registries públicos
Esta es la pregunta más frecuente y menos respondida sobre los registries, y tiene tres respuestas reales. shadcn mantiene un índice de registries de código abierto de registries disponibles de serie. registry.directory es un explorador independiente que le permite navegar y previsualizar items antes de instalarlos. Y un número creciente de proyectos individuales, incluido este sitio, publican una URL de item estable y simplemente la documentan.
La tercera categoría es fácil de pasar por alto y merece la pena consultarla 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 construida por agentes
A un agente de código al que se le dan tres colores de marca se le dan tres valores y aproximadamente veinticinco indefinidos: estados hover y active, texto atenuado, bordes, ring, destructivo, series de gráficos, y cada uno de esos de nuevo en modo oscuro. Los completa de forma competente y diferente cada vez, lo cual es exactamente la deriva que un sistema de diseño debe prevenir.
Un item de registry cierra esa brecha con un solo comando, y es portátil de una forma en la que nada más en este espacio lo es: v0 acepta un registry 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 repo. Una URL, cuatro herramientas, sin integración por herramienta. La parte escrita (qué no hacer nunca, qué variante recibe una acción destructiva) pertenece junto a él en un DESIGN.md, porque cssVars responde a *qué color* y solo la prosa responde a *qué nunca*.
Inspeccione un item de registry de un 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 compone un item de tema.
FAQ
¿Qué es un registro de shadcn?
Un conjunto de archivos JSON servidos a través de HTTP desde los cuales el 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. El elemento entonces rediseña un proyecto existente en lugar de añadir archivos a este, 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 distintas 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 disponibles públicamente?
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 el CLI el orden de instalación de los elementos?
registryDependencies declara qué otros elementos necesita un elemento; el CLI resuelve ese grafo e instala siguiendo el orden de dependencias. El caso de fallo 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í. El CLI admite un token bearer (OAuth 2.0), una clave de API, autenticación básica y un parámetro de consulta. Prefiera un método basado en cabeceras: un token en una cadena de consulta termina 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 pruebe con npx shadcn add <url> en un proyecto de prueba antes de publicar la URL en cualquier lugar.