Le registre shadcn, expliqué

Un registre shadcn est généralement présenté comme un moyen de distribuer des composants. C'est aussi la manière la plus propre de distribuer un design system, et c'est de cet usage dont on parle le moins. Voici les deux approches, avec un exemple concret d'élément de thème que vous pouvez inspecter.

Mis à jour 2026-07-27

Qu'est-ce qu'un registre

Un registre shadcn est du JSON servi via HTTP. C'est tout le concept. Il n'y a pas de package à publier, pas de runtime, pas de service auquel s'inscrire : vous hébergez des fichiers à des URL, et la CLI shadcn en récupère un, lit ce qu'il déclare et écrit le résultat dans le projet de destination.

C'est ce qui le différencie d'une bibliothèque de composants. Une bibliothèque est une dépendance — vous l'installez, vous importez depuis celle-ci, et son code réside derrière un numéro de version dans node_modules. Un registre vous remet le code source. Après un shadcn add, les fichiers vous appartiennent : ils sont dans votre repo, dans votre diff, et modifiables sans fork. Le compromis est le suivant — vous assumez la maintenance et vous perdez les mises à jour automatiques — et c'est sur ce compromis que repose toute l'approche shadcn.

Le terme « Registre » a deux sens selon le contexte

On l'utilise aussi bien pour l' *index* (une collection vers laquelle on pointe la CLI, avec un namespace) que pour un *élément* unique (un objet installable à une URL précise). La documentation les distingue — registry.json pour le premier, registry-item.json pour le second — et c'est cette confusion qui donne l'impression que les guides de configuration se contredisent.

Les deux fichiers

Ce que c'estQui le lit
registry.jsonL'index : un nom, une page d'accueil et la liste des éléments que vous publiezL'étape de build qui génère vos fichiers d'éléments ; les explorateurs de registres et la CLI lors de la résolution d'un namespace
registry-item.jsonUn objet installable : ses fichiers, ses dépendances, ainsi que tout CSS, Tailwind ou police qu'il apporteLa CLI, à chaque shadcn add
Les deux schémas et la responsabilité de chacun.

Vous pouvez publier un seul élément sans jamais écrire d'index. C'est l'utilisation la plus rapide et la plus utile d'un registre, et c'est l'objectif final de ce guide — mais il est important d'en connaître les champs au préalable.

Les champs essentiels de registry-item.json

  • `name` — l'identifiant utilisé dans les commandes d'installation et dans registryDependencies.
  • `type` — la nature de l'élément : registry:ui pour un composant, registry:block pour un bloc composé de plusieurs fichiers, registry:theme pour un ensemble de tokens, registry:style pour un style de base complet, ainsi que des variantes pour les hooks, libs, pages et fichiers.
  • `files` — le code source qui sera écrit, chacun avec son propre type et un chemin target optionnel.
  • `dependencies` — les packages npm dont l'élément a besoin, installés automatiquement pour vous.
  • `registryDependencies` — les autres éléments de registre requis par celui-ci, par nom ou par URL. La CLI les résout, ce qui permet de gérer automatiquement l'ordre d'installation.
  • `cssVars` — propriétés personnalisées CSS, divisées en theme, light et dark.
  • `css` — règles CSS arbitraires, pour tout ce que les variables ne peuvent exprimer.
  • `font` — polices requises par l'élément, afin que la typographie ne soit pas une étape manuelle distincte.
  • `categories`, `docs`, `meta` — métadonnées pour les explorateurs, instructions post-installation et toute information personnalisée.

Les trois éléments souvent négligés sont cssVars, css et font, car presque tous les tutoriels présentent un composant. Ce sont pourtant ces trois-là qui transforment un registre, d'un simple mécanisme de distribution de composants en un mécanisme de distribution de design system.

Un élément de registre n'a pas obligatoirement besoin de contenir un composant. Il peut contenir un design system.

Livrer un thème complet comme un seul élément

En voici un exemple concret, actuellement en ligne — l'élément derrière le kit gratuit Ambient Sage, raccourci pour la lisibilité. Aucun de ses composants n'est un composant au sens strict :

{
  "$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."
}
Un élément registry:theme. 27 variables de thème, 28 light, 28 dark — l'élément complet est disponible sur /r/ambient-sage.json.

Trois points sont à noter. cssVars.theme contient la partie non colorimétrique d'un design system — rayons (radii), ombres, timing d'animation, polices — là où la plupart des « générateurs de thèmes » s'arrêtent et commencent à dénaturer le design. light et dark sont des objets distincts plutôt qu'une seule palette avec une inversion. Enfin, docs contient une instruction écrite, que le CLI affiche après l'installation et qu'un agent de code peut lire.

Token specimen · real values

Ambient Sage

Live render

Ambient Sage's actual tokens — the same values its exports use.

Color tokensSemantic roles with HEX / HSL / CMYK

Color tokens

Ambient Sage

light · HEX · HSL · CMYK

Core

#F3F4EF

background

H 72 · C0, 0, 2, 4

#1A1C17

foreground

H 84 · C7, 0, 18, 89

#E5E6E0

card

H 70 · C0, 0, 3, 10

#ECEEE8

muted

H 80 · C1, 0, 3, 7

#D8D9D2

border

H 69 · C0, 0, 3, 15

Brand

#FEE951

primary

H 53 · C0, 8, 68, 0

#1A1C17

primary-fg

H 84 · C7, 0, 18, 89

#E5E6E0

secondary

H 70 · C0, 0, 3, 10

#F7E464

accent

H 52 · C0, 8, 60, 3

#FEE951

ring

H 53 · C0, 8, 68, 0

Semantic

#C0392B

destructive

H 6 · C0, 70, 78, 25

#FFFFFF

destructive-fg

H 0 · C0, 0, 0, 0

#2D7238

success

H 130 · C61, 0, 51, 55

#C97D12

warning

H 35 · C0, 38, 91, 21

#545651

muted-fg

H 84 · C2, 0, 6, 66

Charts

#FEE951

chart-1

H 53 · C0, 8, 68, 0

#4A8FD4

chart-2

H 210 · C65, 33, 0, 17

#6BBF8A

chart-3

H 142 · C44, 0, 28, 25

#E07498

chart-4

H 340 · C0, 48, 32, 12

#E8A24B

chart-5

H 33 · C0, 30, 68, 9

Type scaleHeading, body, and mono in the kit's fonts

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

400500600700

Aa

Plus Jakarta Sans · Body

400500600700

ABCDEFGHIJKLM NOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789 & @ # % →

Radius & spacingCorner radius, elevation, and spacing steps

Tokens

Ambient Sage primitives

density: balanced

Radius scale

sm · 0.375rem
md · 0.75rem
lg · 1.25rem
xl · 1.75rem

Component radius

button
card
input

Elevation

level 1
level 2
level 3
level 4

Spacing · base 4px

1x
2x
3x
4x
6x
8x
Le même élément, rendu. Chaque valeur ci-dessus est un véritable token dans un élément de registre actif, et non une illustration.

L'installation se fait en une seule commande et elle repeint un projet existant plutôt que d'y ajouter des éléments : chaque composant référençant déjà bg-primary ou text-muted-foreground adopte les nouvelles valeurs sans modification manuelle.

npx shadcn add https://identityforge.io/r/ambient-sage.json
Une seule URL transporte l'intégralité du système.

Publier le vôtre, au minimum

  1. 1

    Rédiger un fichier d'élément

    Commencez par un seul fichier registry-item.json. Vous n'avez pas besoin de registry.json, d'une étape de build ou d'un monorepo pour être utile — un index n'est pertinent que lorsque vous avez plusieurs éléments et que vous souhaitez un espace de noms (namespace).

  2. 2

    L'héberger sur une URL stable

    N'importe quel hébergeur statique convient. L'important est que l'URL ne change pas : c'est la commande d'installation, elle se retrouve donc copiée dans des README, des prompts et des configurations d'agents.

    https://identityforge.io/r/<slug>.json
  3. 3

    Configurer le type de contenu et le CORS

    Servez le fichier en application/json. Si un navigateur doit le récupérer — via un explorateur de registre ou un outil de prévisualisation — envoyez également des headers CORS permissifs. C'est la raison la plus courante pour laquelle un élément qui semble correct ne s'installe pas.

  4. 4

    Tester avec le CLI réel

    Installez-le dans un projet de test avant de publier l'URL. Une erreur de schéma se manifeste ici en quelques secondes, alors qu'elle n'apparaîtra que dans un rapport de bug après plusieurs semaines.

    npx shadcn add https://example.com/r/thing.json

Versionner l'URL, pas le fichier

L'URL étant le contrat, modifier ce qu'elle renvoie modifie ce que tout le monde installera ensuite. Si vous devez effectuer un changement majeur (breaking change), publiez un nouveau chemin et laissez l'ancien actif. Modifier silencieusement un élément en place est l'équivalent, pour un registre, d'un force-push.

Espaces de noms et registres privés

Une URL brute suffit pour un seul élément. Dès que vous en publiez plusieurs, un espace de noms est préférable : configurez le registre une fois dans components.json et installez par nom court, avec plusieurs registres côte à côte.

Les registres privés sont supportés et le CLI accepte quatre modes d'authentification : un token bearer (OAuth 2.0), une clé API, l'authentification basic et un paramètre de requête. Le choix dépend de votre hébergement, et non de shadcn.

L'option du paramètre de requête est celle à considérer avec prudence

Un token dans une URL finit dans l'historique du shell, dans les logs de la CI, dans le components.json qu'un utilisateur commit, et dans tous les logs de proxy intermédiaires. Privilégiez un token bearer ou un header de clé API. Si vous devez utiliser un paramètre de requête, considérez ce token comme compromis dès son utilisation et renouvelez-le régulièrement.

Résolution de l'ordre d'installation

registryDependencies permet à un élément de dépendre d'autres éléments, même à travers différents registres. Le CLI résout le graphe et installe les éléments dans l'ordre des dépendances : ainsi, un bloc nécessitant un bouton recevra le bouton en premier, que vous l'ayez demandé ou non.

Le mode de panne à connaître est la boucle : deux éléments qui se déclarent mutuellement comme dépendances. Rien ne se résout, et l'erreur pointe vers l'étape de résolution plutôt que vers votre JSON. Si une installation freeze ou échoue sur un élément qui semble correct, dessinez les flèches de dépendance sur papier avant toute autre tentative de débogage.

Où trouver des registres publics

C'est la question la plus posée et la moins traitée concernant les registres, et elle a trois réponses. shadcn maintient un index de registres open-source disponibles nativement. registry.directory est un explorateur indépendant qui permet de parcourir et de prévisualiser les éléments avant l'installation. Enfin, un nombre croissant de projets individuels — ce site inclus — publient une URL d'élément stable et se contentent de la documenter.

Cette troisième catégorie est facile à négliger et mérite d'être vérifiée en priorité : si un projet que vous appréciez possède un thème ou un ensemble de composants qui vous intéresse, cherchez un chemin /r/ avant de supposer que vous devez copier le CSS à la main.

Pourquoi c'est crucial pour les UI générées par agent

Un agent de code à qui l'on donne trois couleurs de marque dispose de trois valeurs et d'environ vingt-cinq autres non définies : états hover et active, texte atténué, bordures, ring, destructive, séries de graphiques, et tout cela à nouveau pour le mode sombre. L'agent les complète avec compétence, mais différemment à chaque fois, ce qui crée précisément la dérive qu'un design system est censé empêcher.

Un élément de registre comble ce fossé en une seule commande, et il est portable d'une manière unique dans cet écosystème : v0 accepte un registre comme source de design system, Bolt peut en installer un depuis son terminal intégré, et Cursor ou Claude Code peuvent exécuter la même commande dans votre repo. Une URL, quatre outils, aucune intégration spécifique par outil. La partie rédactionnelle — ce qu'il ne faut jamais faire, quelle variante attribuer à une action destructive — doit figurer à côté dans un DESIGN.md, car cssVars répond à la question *quelle couleur* et seule la prose répond à la question *quoi ne jamais faire*.

Inspecter un élément de registre de thème réel

Chaque kit public ici publie un fichier registry-item.json stable avec 27 variables de thème et 28 rôles sémantiques en light et dark. Installez-en un, ou lisez le JSON pour voir comment un élément de thème est structuré.

FAQ

Qu'est-ce qu'un registry shadcn ?

Un ensemble de fichiers JSON servis via HTTP depuis lesquels la CLI shadcn peut effectuer des installations. registry.json est l'index de ce que vous publiez ; chaque registry-item.json décrit un item installable — ses fichiers, ses dépendances et, optionnellement, ses variables CSS, sa config Tailwind et ses polices. Il n'y a aucun package à publier ni aucun service auquel s'inscrire.

Un item de registry peut-il installer un thème plutôt qu'un composant ?

Oui. Utilisez type: registry:theme et placez vos tokens dans cssVars, répartis entre theme, light et dark. Ajoutez font pour les polices et css pour tout ce que les variables ne peuvent exprimer. L'item redéfinit alors l'apparence d'un projet existant plutôt que d'y ajouter des fichiers, car les composants référençant déjà des tokens sémantiques adoptent les nouvelles valeurs.

Dois-je publier sur npm ?

Non. Un registry est servi via HTTP, donc n'importe quel hébergeur statique convient. npm est un modèle de distribution différent avec des compromis distincts — une dépendance versionnée dans node_modules plutôt que du code source écrit directement dans votre repo.

Où trouver des registries shadcn publics ?

À trois endroits : l'index open-source de shadcn regroupant les registries disponibles nativement, registry.directory en tant qu'explorateur indépendant pour parcourir et prévisualiser les items, et les projets individuels qui publient et documentent une URL d'item stable. Vérifiez ce dernier point avant de supposer que vous devez copier le CSS à la main.

Comment la CLI détermine-t-elle l'ordre d'installation ?

registryDependencies déclare les autres items dont un item a besoin ; la CLI résout ce graphe et installe les éléments selon l'ordre des dépendances. Le cas d'échec est le cycle — deux items se déclarant mutuellement comme dépendances — ce qui se manifeste par une erreur de résolution plutôt qu'une erreur JSON ; vérifiez donc d'abord les flèches de dépendance.

Un registry peut-il être privé ?

Oui. La CLI supporte le bearer token (OAuth 2.0), la clé API, l'authentification basic et les paramètres de requête. Privilégiez une méthode basée sur les headers : un token dans une chaîne de requête se retrouve dans l'historique du shell, les logs CI et tous les logs de proxy intermédiaires.

Pourquoi mon item de registry ne s'installe-t-il pas ?

Le plus souvent, la réponse n'est pas servie en application/json, ou un outil basé sur le navigateur est bloqué par l'absence de headers CORS. Ensuite, vérifiez la conformité de l'item avec le schéma registry-item.json, et testez avec npx shadcn add <url> sur un projet de test avant de publier l'URL.