Die shadcn Registry, erklärt

Eine shadcn Registry wird meist als Weg zur Distribution von Komponenten erklärt. Sie ist jedoch auch der sauberste Weg, ein Designsystem zu distribuieren – und über diesen zweiten Anwendungsfall wird fast nichts geschrieben. Hier wird beides erläutert, inklusive eines realen Theme-Elements zur Inspektion.

Aktualisiert 2026-07-27

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 istWer es liest
registry.jsonDer Index: ein Name, eine Homepage und die Liste der publizierten ElementeDer Build-Schritt, der die Elementdateien erzeugt; Registry-Explorer und die CLI bei der Auflösung eines Namespaces
registry-item.jsonEine installierbare Einheit: ihre Dateien, Abhängigkeiten sowie zugehöriges CSS, Tailwind oder FontsDie CLI bei jedem Aufruf von shadcn add
Die zwei Schemata und wofür jedes einzelne zuständig ist.

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 registryDependencies verwendet wird.
  • `type` — die Art des Elements: registry:ui für eine Komponente, registry:block für einen zusammengesetzten Block aus mehreren Dateien, registry:theme für einen Satz an Design-Tokens, registry:style für einen kompletten Basis-Style sowie Varianten für Hooks, Libs, Pages und Files.
  • `files` — der zu schreibende Quellcode, jeweils mit eigenem type und optionalem target-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, light und dark.
  • `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."
}
Ein Registry:theme Item. 27 Theme-Variablen, 28 light, 28 dark — das vollständige Item finden Sie unter /r/ambient-sage.json.

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 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
Dasselbe Item, gerendert. Jeder oben genannte Wert ist ein echter Token in einem Live-Registry-Item, keine Illustration.

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.json
Eine einzige URL transportiert das gesamte System.

Die minimale Veröffentlichung eines eigenen Items

  1. 1

    Eine Item-Datei schreiben

    Beginnen Sie mit einer einzigen registry-item.json. Sie benötigen keine registry.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. 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. 3

    Richtigen Content-Type und CORS setzen

    Stellen Sie application/json bereit. 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. 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.