mirror of
https://github.com/shadcn-ui/ui.git
synced 2026-06-23 20:55:47 +00:00
174 lines
6.2 KiB
Plaintext
174 lines
6.2 KiB
Plaintext
---
|
|
title: Getting Started
|
|
description: Learn how to get setup and run your own component registry.
|
|
---
|
|
|
|
This guide will walk you through the process of setting up your own component registry. It assumes you already have a project with components and would like to turn it into a registry.
|
|
|
|
If you're starting a new registry project, you can use the [registry template](https://github.com/shadcn-ui/registry-template) as a starting point. We have already configured it for you.
|
|
|
|
## Requirements
|
|
|
|
You are free to design and host your custom registry as you see fit. The only requirement is that your registry items must be valid JSON files that conform to the [registry-item schema specification](/docs/registry/registry-item-json).
|
|
|
|
If you'd like to see an example of a registry, we have a [template project](https://github.com/shadcn-ui/registry-template) for you to use as a starting point.
|
|
|
|
## registry.json
|
|
|
|
The `registry.json` is the entry point for the registry. It contains the registry's name, homepage, and defines all the items present in the registry.
|
|
|
|
Your registry must have this file (or JSON payload) present at the root of the registry endpoint. The registry endpoint is the URL where your registry is hosted.
|
|
|
|
The `shadcn` CLI will automatically generate this file for you when you run the `build` command.
|
|
|
|
## Add a registry.json file
|
|
|
|
Create a `registry.json` file in the root of your project. Your project can be a Next.js, Vite, Vue, Svelte, PHP or any other framework as long as it supports serving JSON over HTTP.
|
|
|
|
```json title="registry.json" showLineNumbers
|
|
{
|
|
"$schema": "https://ui.shadcn.com/schema/registry.json",
|
|
"name": "acme",
|
|
"homepage": "https://acme.com",
|
|
"items": [
|
|
// ...
|
|
]
|
|
}
|
|
```
|
|
|
|
This `registry.json` file must conform to the [registry schema specification](/docs/registry/registry-json).
|
|
|
|
## Add a registry item
|
|
|
|
### Create your component
|
|
|
|
Add your first component. Here's an example of a simple `<HelloWorld />` component:
|
|
|
|
```tsx title="registry/new-york/hello-world/hello-world.tsx" showLineNumbers
|
|
import { Button } from "@/components/ui/button"
|
|
|
|
export function HelloWorld() {
|
|
return <Button>Hello World</Button>
|
|
}
|
|
```
|
|
|
|
<Callout className="mt-6">
|
|
**Note:** This example places the component in the `registry/new-york`
|
|
directory. You can place it anywhere in your project as long as you set the
|
|
correct path in the `registry.json` file and you follow the `registry/[NAME]`
|
|
directory structure.
|
|
</Callout>
|
|
|
|
```txt
|
|
registry
|
|
└── new-york
|
|
└── hello-world
|
|
└── hello-world.tsx
|
|
```
|
|
|
|
### Add your component to the registry
|
|
|
|
To add your component to the registry, you need to add your component definition to `registry.json`.
|
|
|
|
```json title="registry.json" showLineNumbers {6-17}
|
|
{
|
|
"$schema": "https://ui.shadcn.com/schema/registry.json",
|
|
"name": "acme",
|
|
"homepage": "https://acme.com",
|
|
"items": [
|
|
{
|
|
"name": "hello-world",
|
|
"type": "registry:block",
|
|
"title": "Hello World",
|
|
"description": "A simple hello world component.",
|
|
"files": [
|
|
{
|
|
"path": "registry/new-york/hello-world/hello-world.tsx",
|
|
"type": "registry:component"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
You define your registry item by adding a `name`, `type`, `title`, `description` and `files`.
|
|
|
|
For every file you add, you must specify the `path` and `type` of the file. The `path` is the relative path to the file from the root of your project. The `type` is the type of the file.
|
|
|
|
You can read more about the registry item schema and file types in the [registry item schema docs](/docs/registry/registry-item-json).
|
|
|
|
## Build your registry
|
|
|
|
### Install the shadcn CLI
|
|
|
|
```bash
|
|
npm install shadcn@canary
|
|
```
|
|
|
|
### Add a build script
|
|
|
|
Add a `registry:build` script to your `package.json` file.
|
|
|
|
```json title="package.json" showLineNumbers
|
|
{
|
|
"scripts": {
|
|
"registry:build": "shadcn build"
|
|
}
|
|
}
|
|
```
|
|
|
|
### Run the build script
|
|
|
|
Run the build script to generate the registry JSON files.
|
|
|
|
```bash
|
|
npm run registry:build
|
|
```
|
|
|
|
<Callout className="mt-6">
|
|
**Note:** By default, the build script will generate the registry JSON files
|
|
in `public/r` e.g `public/r/hello-world.json`.
|
|
|
|
You can change the output directory by passing the `--output` option. See the [shadcn build command](/docs/cli#build) for more information.
|
|
|
|
</Callout>
|
|
|
|
## Serve your registry
|
|
|
|
If you're running your registry on Next.js, you can now serve your registry by running the `next` server. The command might differ for other frameworks.
|
|
|
|
```bash
|
|
npm run dev
|
|
```
|
|
|
|
Your files will now be served at `http://localhost:3000/r/[NAME].json` eg. `http://localhost:3000/r/hello-world.json`.
|
|
|
|
## Publish your registry
|
|
|
|
To make your registry available to other developers, you can publish it by deploying your project to a public URL.
|
|
|
|
## Guidelines
|
|
|
|
Here are some guidelines to follow when building components for a registry.
|
|
|
|
- Place your registry item in the `registry/[STYLE]/[NAME]` directory. I'm using `new-york` as an example. It can be anything you want as long as it's nested under the `registry` directory.
|
|
- The following properties are required for the block definition: `name`, `description`, `type` and `files`.
|
|
- It is recommended to add a proper name and description to your registry item. This helps LLMs understand the component and its purpose.
|
|
- Make sure to list all registry dependencies in `registryDependencies`. A registry dependency is the name of the component in the registry eg. `input`, `button`, `card`, etc or a URL to a registry item eg. `http://localhost:3000/r/editor.json`.
|
|
- Make sure to list all dependencies in `dependencies`. A dependency is the name of the package in the registry eg. `zod`, `sonner`, etc. To set a version, you can use the `name@version` format eg. `zod@^3.20.0`.
|
|
- **Imports should always use the `@/registry` path.** eg. `import { HelloWorld } from "@/registry/new-york/hello-world/hello-world"`
|
|
- Ideally, place your files within a registry item in `components`, `hooks`, `lib` directories.
|
|
|
|
## Install using the CLI
|
|
|
|
To install a registry item using the `shadcn` CLI, use the `add` command followed by the URL of the registry item.
|
|
|
|
```bash
|
|
npx shadcn@latest add http://localhost:3000/r/hello-world.json
|
|
```
|
|
|
|
See the [Namespaced
|
|
Registries](/docs/registry/namespace) docs for more information on
|
|
how to install registry items from a namespaced registry.
|