---
title: May 2026 - Registry Include and Validate
description: Organize and validate source registries.
date: 2026-05-20
---

This release adds two updates for registry authors:

- `include` for composing large source registries from multiple `registry.json`
  files.
- `shadcn registry validate` for checking source registries before publishing.

This makes it easier to maintain source and dynamic registries without keeping
one large `registry.json` file by hand.

Registry authors can now organize a large source registry across multiple
`registry.json` files and compose them with `shadcn build`.

```txt /registry.json/
registry.json
components
└── ui
    ├── button.tsx
    ├── input.tsx
    └── registry.json
hooks
├── registry.json
├── use-media-query.ts
└── use-toggle.ts
```

{/* prettier-ignore */}
```json title="registry.json" showLineNumbers {6-7}
{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "acme",
  "homepage": "https://acme.com",
  "include": [
    "components/ui/registry.json",
    "hooks/registry.json"
  ]
}
```

Included `registry.json` files are valid registry files for composition and may
omit `name` and `homepage`. Only the root `registry.json` must define the
registry metadata.

```json title="components/ui/registry.json" showLineNumbers
{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "items": [
    {
      "name": "button",
      "type": "registry:ui",
      "files": [
        {
          "path": "button.tsx",
          "type": "registry:ui"
        }
      ]
    }
  ]
}
```

## Build output

`shadcn build` resolves included registries and writes a flattened
`registry.json` without `include`. Item file paths are preserved from the root
registry, so a file declared in `components/ui/registry.json` is written as
`components/ui/button.tsx` in the built registry item.

## Validate your registry

You can now validate a source registry before publishing or serving it.

```bash
npx shadcn registry validate
```

Validation runs against the source registry files directly. You do not need to
run `shadcn build` first.

The command checks the root `registry.json`, included registry files, item
schema errors, duplicate item names, include rules, and local item file paths.
Validation reports all actionable errors it can find in one run.

## Registry loaders

The `shadcn/registry` package also exports `loadRegistry` and
`loadRegistryItem` for dynamic registry routes.

```ts title="app/r/registry.json/route.ts" showLineNumbers
import { loadRegistry } from "shadcn/registry"

export async function GET() {
  const registry = await loadRegistry()

  return Response.json(registry)
}
```

```ts title="app/r/[name].json/route.ts" showLineNumbers
import { loadRegistryItem } from "shadcn/registry"

export async function GET(
  _: Request,
  { params }: { params: Promise<{ name: string }> }
) {
  const { name } = await params
  const item = await loadRegistryItem(name)

  return Response.json(item)
}
```

See the [registry.json documentation](/docs/registry/registry-json#include) and
[getting started guide](/docs/registry/getting-started#structure-your-registry)
for more details.
