Was eine Registry ist
Eine shadcn Registry ist JSON, das über HTTP bereitgestellt wird. Das ist die gesamte Idee. Es gibt kein Paket zum Publizieren, keine Runtime, keinen Dienst, für den man sich registrieren muss: Man hostet Dateien unter URLs, und die shadcn CLI ruft eine davon ab, liest die Deklarationen und schreibt das Ergebnis in das Zielprojekt.
Das ist der Unterschied zu einer Komponentenbibliothek. Eine Bibliothek ist eine Abhängigkeit – man installiert sie, importiert daraus, und der Code lebt hinter einer Versionsnummer in node_modules. Eine Registry liefert Quellcode. Nach shadcn add gehören die Dateien einem selbst: sie liegen im eigenen Repo, erscheinen im Diff und sind ohne Fork editierbar. Der Preis dafür ist der übliche – man übernimmt die Wartung und verliert automatische Updates – und genau auf diesem Kompromiss basiert der gesamte shadcn-Ansatz.
"Registry" bedeutet im Gespräch zwei verschiedene Dinge
Der Begriff wird sowohl für den *Index* (eine Sammlung mit Namespace, auf die die CLI verwiesen wird) als auch für ein einzelnes *Item* (eine installierbare Einheit unter einer URL) verwendet. Die Dokumentation trennt diese – registry.json für ersteres, registry-item.json für letzteres – und diese Vermischung führt dazu, dass Setup-Guides sich oft widersprüchlich erscheinen.
Die zwei Dateien
| Was es ist | Wer es liest | |
|---|---|---|
registry.json | Der Index: ein Name, eine Homepage und die Liste der publizierten Elemente | Der Build-Schritt, der die Elementdateien erzeugt; Registry-Explorer und die CLI bei der Auflösung eines Namespaces |
registry-item.json | Eine installierbare Einheit: ihre Dateien, Abhängigkeiten sowie zugehöriges CSS, Tailwind oder Fonts | Die CLI bei jedem Aufruf von shadcn add |
Man kann ein einzelnes Element publizieren, ohne jemals einen Index zu erstellen. Das ist der schnellste Weg, eine Registry sinnvoll zu nutzen, und darauf baut der Rest dieses Guides auf – dennoch lohnt es sich, die Felder vorab zu kennen.
Die relevanten Felder von registry-item.json
- `name` — der Bezeichner, der in Installationsbefehlen und in
registryDependenciesverwendet wird. - `type` — die Art des Elements:
registry:uifür eine Komponente,registry:blockfür einen zusammengesetzten Block aus mehreren Dateien,registry:themefür einen Satz an Design-Tokens,registry:stylefür einen kompletten Basis-Style sowie Varianten für Hooks, Libs, Pages und Files. - `files` — der zu schreibende Quellcode, jeweils mit eigenem
typeund optionalemtarget-Pfad. - `dependencies` — npm-Pakete, die das Element benötigt und die automatisch installiert werden.
- `registryDependencies` — andere Registry-Elemente, die dieses Element benötigt, referenziert per Name oder URL. Die CLI löst diese auf, weshalb sich die Installationsreihenfolge automatisch sortiert.
- `cssVars` — CSS-Custom-Properties, aufgeteilt in
theme,lightunddark. - `css` — beliebige CSS-Regeln für alles, was nicht über Variablen ausgedrückt werden kann.
- `font` — benötigte Schriftarten, damit die Typografie kein separater manueller Schritt ist.
- `categories`, `docs`, `meta` — Metadaten für Explorer, Anweisungen nach der Installation und eigene benutzerdefinierte Daten.
Die drei am häufigsten übersehenen Felder sind cssVars, css und font, da fast jedes Tutorial eine Komponente demonstriert. Genau diese drei machen aus einer Registry einen Mechanismus zur Distribution von Designsystemen statt nur zur Distribution von Komponenten.
Ein Registry-Item muss keine Komponente enthalten. Es kann ein Designsystem enthalten.
Ein ganzes Theme als ein einziges Item bereitstellen
Hier ist ein reales Beispiel, das aktuell live ist — das Item hinter dem kostenlosen Ambient Sage Kit, gekürzt zur besseren Übersicht. Es enthält keine einzige Komponente:
{
"$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."
}Drei Dinge sind bemerkenswert: cssVars.theme enthält den nicht farblichen Teil eines Designsystems — Radien, Schatten, Motion-Timing, Schriftarten — genau dort, wo die meisten „Theme-Generatoren“ aufhören und das Design verloren geht. light und dark sind separate Objekte und keine einzelne Palette mit einer Invertierung. Und docs enthält eine schriftliche Anweisung, die das CLI nach der Installation ausgibt und die ein Coding-Agent lesen kann.
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
Die Installation erfolgt mit einem einzigen Befehl und übermalt ein bestehendes Projekt, anstatt es nur zu ergänzen: Jede Komponente, die bereits auf bg-primary oder text-muted-foreground verweist, übernimmt die neuen Werte, ohne bearbeitet werden zu müssen.
npx shadcn add https://identityforge.io/r/ambient-sage.jsonDie minimale Veröffentlichung eines eigenen Items
- 1
Eine Item-Datei schreiben
Beginnen Sie mit einer einzigen
registry-item.json. Sie benötigen keineregistry.json, keinen Build-Schritt und kein Monorepo, um nützlich zu sein — ein Index wird erst wichtig, wenn Sie mehrere Items haben und einen Namespace wünschen. - 2
Unter einer stabilen URL bereitstellen
Jeder statische Host ist geeignet. Entscheidend ist, dass die URL stabil bleibt: Sie ist der Installationsbefehl und landet somit in READMEs, Prompts und Agent-Konfigurationen.
https://identityforge.io/r/<slug>.json - 3
Richtigen Content-Type und CORS setzen
Stellen Sie
application/jsonbereit. Falls das Item im Browser abgerufen werden soll — durch einen Registry-Explorer oder ein Preview-Tool —, senden Sie zusätzlich permissive CORS-Header. Dies ist der häufigste Grund, warum ein korrekt aussehendes Item nicht installiert werden kann. - 4
Mit dem echten CLI testen
Installieren Sie das Item in einem Testprojekt, bevor Sie die URL veröffentlichen. Ein Schema-Fehler fällt hier innerhalb von Sekunden auf; in einem Bug-Report erst nach Wochen.
npx shadcn add https://example.com/r/thing.json
Die URL versionieren, nicht die Datei
Da die URL der Vertrag ist, ändert eine Änderung des Rückgabewerts das, was jeder Nutzer als Nächstes installiert. Wenn eine Breaking Change erforderlich ist, veröffentlichen Sie einen neuen Pfad und lassen Sie den alten Pfad aktiv. Das stille Editieren eines Items an Ort und Stelle ist das Registry-Äquivalent zu einem Force-Push.
Namespaces und private Registries
Eine einfache URL reicht für ein einzelnes Item aus. Sobald Sie mehrere veröffentlichen, ist ein Namespace vorteilhafter: Konfigurieren Sie die Registry einmal in der components.json und installieren Sie über Kurznamen, wobei mehrere Registries nebeneinander existieren können.
Private Registries werden unterstützt, und das CLI akzeptiert vier Authentifizierungsformen: einen Bearer-Token (OAuth 2.0), einen API-Key, Basic-Authentication und einen Query-Parameter. Die Wahl hängt von der Hosting-Entscheidung ab, nicht von shadcn/ui.
Die Option des Query-Parameters sollte kritisch hinterfragt werden
Ein Token in einer URL landet im Shell-Verlauf, in CI-Logs, in der components.json, die jemand committet, und in jedem Proxy-Log auf dem Weg. Bevorzugen Sie einen Bearer-Token oder einen API-Key-Header. Falls Sie einen Query-Parameter nutzen müssen, betrachten Sie diesen Token ab dem Moment der Nutzung als kompromittiert und rotieren Sie ihn regelmäßig.
Auflösung der Installationsreihenfolge
registryDependencies ermöglicht es einem Item, von anderen Items abzuhängen, auch über Registry-Grenzen hinweg. Das CLI löst den Graphen auf und installiert in Abhängigkeitsreihenfolge. So erhält ein Block, der einen Button benötigt, zuerst den Button, unabhängig davon, ob dieser explizit angefordert wurde.
Ein bekanntes Fehlerbild ist der Zyklus: zwei Items, die sich gegenseitig als Abhängigkeit deklarieren. Nichts wird aufgelöst, und die Fehlermeldung weist auf den Auflösungsschritt statt auf Ihr JSON hin. Wenn eine Installation bei einem korrekt aussehenden Item hängen bleibt oder fehlschlägt, zeichnen Sie die Abhängigkeitspfeile auf Papier, bevor Sie weitere Fehleranalysen durchführen.
Wo man öffentliche Registries findet
Dies ist die am häufigsten gestellte und am seltensten beantwortete Frage zu Registries, und es gibt drei echte Antworten: shadcn/ui pflegt einen Open-Source-Registry-Index mit Registries, die sofort verfügbar sind. registry.directory ist ein unabhängiger Explorer, mit dem Items vor der Installation durchsucht und in der Vorschau angezeigt werden können. Und eine wachsende Zahl einzelner Projekte — einschließlich dieser Seite — veröffentlichen eine stabile Item-URL und dokumentieren diese einfach.
Die dritte Kategorie wird leicht übersehen, ist aber die erste, die man prüfen sollte: Wenn ein Projekt, das Ihnen gefällt, ein Theme oder einen Komponentensatz besitzt, den Sie möchten, suchen Sie nach einem /r/-Pfad, bevor Sie annehmen, dass Sie CSS manuell kopieren müssen.
Warum dies für Agent-generierte UIs wichtig ist
Ein Coding-Agent, dem drei Markenfarben gegeben werden, hat drei Werte und etwa fünfundzwanzig undefinierte: Hover- und Active-Zustände, gedämpfter Text, Rahmen, Ringe, destruktive Elemente, Chart-Serien und all das noch einmal im Dark Mode. Der Agent füllt diese kompetent, aber jedes Mal anders aus — genau das ist der Drift, den ein Designsystem verhindern soll.
Ein Registry-Item schließt diese Lücke mit einem einzigen Befehl und ist in einer Weise portabel, wie es sonst nichts in diesem Bereich ist: v0 akzeptiert eine Registry als Designsystem-Quelle, Bolt kann eine über das In-Browser-Terminal installieren, und Cursor oder Claude Code können denselben Befehl in Ihrem Repo ausführen. Eine URL, vier Tools, keine toolspezifische Integration. Der schriftliche Teil — was niemals zu tun ist, welche Variante eine destruktive Aktion erhält — gehört daneben in eine DESIGN.md, denn cssVars beantwortet die Frage *welche Farbe*, aber nur Prosa beantwortet die Frage *was niemals*.
Ein reales Theme-Registry-Item untersuchen
Jedes öffentliche Kit hier veröffentlicht eine stabile registry-item.json mit 27 Theme-Variablen und 28 semantischen Rollen für Light und Dark. Installieren Sie eines oder lesen Sie das JSON, um zu sehen, wie ein Theme-Item aufgebaut ist.
FAQ
Was ist eine shadcn Registry?
Ein Satz von JSON-Dateien, die über HTTP bereitgestellt werden und von denen die shadcn CLI installieren kann. registry.json ist der Index der veröffentlichten Inhalte; jede registry-item.json beschreibt ein einzelnes installierbares Item – seine Dateien, Abhängigkeiten und optional CSS-Variablen, Tailwind-Konfigurationen und Fonts. Es gibt kein Paket zu veröffentlichen und keinen Dienst, bei dem man sich registrieren muss.
Kann ein Registry-Item ein Theme anstelle einer Komponente installieren?
Ja. Verwenden Sie type: registry:theme und platzieren Sie die Tokens in cssVars, unterteilt in theme, light und dark. Fügen Sie font für Schriftarten und css für alles hinzu, was Variablen nicht ausdrücken können. Das Item gestaltet dann ein bestehendes Projekt neu, anstatt Dateien hinzuzufügen, da Komponenten, die bereits auf semantische Tokens verweisen, die neuen Werte übernehmen.
Muss ich auf npm veröffentlichen?
Nein. Eine Registry wird über HTTP bereitgestellt, sodass jeder statische Host funktioniert. npm ist ein anderes Distributionsmodell mit anderen Vor- und Nachteilen – eine versionierte Abhängigkeit in node_modules anstelle von Quellcode, der direkt in das Repository geschrieben wird.
Wo finde ich öffentlich verfügbare shadcn Registries?
An drei Stellen: dem Open-Source-Registry-Index von shadcn für direkt verfügbare Registries, registry.directory als unabhängiger Explorer zum Durchsuchen und Vorschauen von Items sowie in einzelnen Projekten, die eine stabile Item-URL veröffentlichen und dokumentieren. Prüfen Sie Letzteres, bevor Sie annehmen, dass CSS manuell kopiert werden muss.
Wie entscheidet die CLI über die Installationsreihenfolge?
registryDependencies gibt an, welche anderen Items ein Item benötigt; die CLI löst diesen Graphen auf und installiert in der Reihenfolge der Abhängigkeiten. Der Fehlerfall ist ein Zyklus – zwei Items, die sich gegenseitig als Abhängigkeit deklarieren –, was als Auflösungsfehler und nicht als JSON-Fehler erscheint. Prüfen Sie daher zuerst die Abhängigkeitspfeile.
Kann eine Registry privat sein?
Ja. Die CLI unterstützt einen Bearer-Token (OAuth 2.0), einen API-Key, Basic-Authentifizierung und einen Query-Parameter. Bevorzugen Sie eine headerbasierte Methode: Ein Token in einem Query-String landet im Shell-Verlauf, in CI-Logs und in jedem dazwischenliegenden Proxy-Log.
Warum lässt sich mein Registry-Item nicht installieren?
Meistens wird die Antwort nicht als application/json ausgeliefert oder ein browserbasiertes Tool wird durch fehlende CORS-Header blockiert. Prüfen Sie danach das Item gegen das registry-item.json-Schema und testen Sie es mit npx shadcn add <url> in einem Testprojekt, bevor Sie die URL irgendwo veröffentlichen.