Nuxt 4 documentation site with a built-in shadcn-vue component registry for distributing custom blocks.
pnpm dev— dev serverpnpm lint— ESLint (@nuxt/eslint-based, stylistic enabled: double quotes, semi)pnpm lint:fix— auto-fixpnpm typecheck—nuxt typecheckpnpm registry:build— generate registry JSON files intopublic/r/pnpm registry:verify— verify generated registry dependency metadata afterregistry:build
CI order: lint → typecheck (no tests)
- Nuxt 4 compat mode (
future.compatibilityVersion: 4) — app code lives underapp/ app/components/ui/— shadcn-vue UI primitives (shadcn-nuxtmodule, no prefix)app/components/content/— global MDC components (pathPrefix: false)app/components/_internal/,app/components/examples/— excluded from Nuxt auto-importsapp/registry/blocks/— distributable components; each block = directory withindex.ts+.vuecontent/docs/— Markdown docs (@nuxt/contentv3, D1 database)public/r/— generated output fromregistry:build(should be gitignored)
pnpm registry:build runs scripts/registry-build.ts:
shadcn-vue-registrygenerates registry.json fromapp/registry/shadcn-vue buildoutputs per-item JSON topublic/r/*.json- Intermediate file
app/registry/registry.jsonis auto-deleted
Run pnpm registry:verify after pnpm registry:build when registry dependencies change.
Config: registry.config.ts and components.json registries field.
- ESLint stylistic: double quotes, semicolons
- Tailwind v4 via
@tailwindcss/viteplugin — notailwind.configfile - shadcn-vue style:
new-york, baseColor:neutral, CSS variables enabled - Icons:
lucide-vue-nextfor app and local shadcn primitives; registry-distributed items targeting shadcn-vue Create may use@lucide/vuewhen freshshadcn-vue addverification requires it
- Use commitizen/czg-style Conventional Commits:
<type>(<scope>): <Subject>. - Keep
typeandscopelowercase; capitalize the first letter ofSubject. - Use imperative mood and omit trailing periods, e.g.
feat(registry): Add pricing plans block.
content.config.tsdefines the docs collection withcategoryfield:form | content | marketing | chat | overview@nuxt/contentv3 with D1 database (content.database.type: "d1")- Markdown highlight disabled;
nuxt-shikimodule handles syntax highlighting instead
- NuxtHub (
@nuxthub/core) — Cloudflare D1/SQLite bindings hub.db: "sqlite"— uses SQLite for local development