{"id":49817695,"url":"https://github.com/jakejarvis/_cn","last_synced_at":"2026-05-13T08:15:14.448Z","repository":{"id":352106519,"uuid":"1212690263","full_name":"jakejarvis/_cn","owner":"jakejarvis","description":"👨‍🎨 Plug-and-play shadcn/ui registry template, powered by TanStack Start","archived":false,"fork":false,"pushed_at":"2026-04-29T20:20:31.000Z","size":1285,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-29T22:09:38.874Z","etag":null,"topics":["component-library","shadcn","shadcn-registry","shadcn-ui","tanstack-start","template","vite","vite-plus"],"latest_commit_sha":null,"homepage":"https://underscore-cn.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jakejarvis.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-04-16T16:23:21.000Z","updated_at":"2026-04-27T18:17:43.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jakejarvis/_cn","commit_stats":null,"previous_names":["jakejarvis/_cn"],"tags_count":0,"template":true,"template_full_name":null,"purl":"pkg:github/jakejarvis/_cn","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jakejarvis%2F_cn","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jakejarvis%2F_cn/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jakejarvis%2F_cn/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jakejarvis%2F_cn/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jakejarvis","download_url":"https://codeload.github.com/jakejarvis/_cn/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jakejarvis%2F_cn/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32973562,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T06:31:55.726Z","status":"ssl_error","status_checked_at":"2026-05-13T06:31:51.336Z","response_time":115,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["component-library","shadcn","shadcn-registry","shadcn-ui","tanstack-start","template","vite","vite-plus"],"created_at":"2026-05-13T08:15:13.523Z","updated_at":"2026-05-13T08:15:14.440Z","avatar_url":"https://github.com/jakejarvis.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# \\_cn\n\n\u003cp align=\"center\"\u003e\u003ca href=\"https://underscore-cn.vercel.app\"\u003e\u003cimg width=\"2776\" height=\"1596\" alt=\"underscorecn\" src=\"https://github.com/user-attachments/assets/04bbb481-9ca8-49c3-bc83-b7d9a72e4b61\" /\u003e\u003c/a\u003e\u003c/p\u003e\n\nAn intentionally minimal [TanStack Start](https://tanstack.com/start/latest) + [Vite+](https://viteplus.dev/) starter template for publishing a [shadcn-compatible registry](https://ui.shadcn.com/docs/registry) without writing the documentation site and registry plumbing from scratch.\n\nThe scaffold contains a typed registry authoring layer, authored docs, live preview pages, syntax-highlighted source snippets, schema validation, package-manager install commands, and TanStack Start server routes. [See a demo here.](https://ui.jarv.is)\n\n\u003e [!TIP]\n\u003e `_cn` is pronounced \"underscore-cn\".\n\n## Quick Start\n\nYou can either [create a new repository](https://github.com/new?template_name=_cn\u0026template_owner=jakejarvis) based on this template directly in your GitHub account/organization, or use a tool like [`degit`](https://github.com/Rich-Harris/degit) to scaffold a fresh repo locally with the latest \\_cn code.\n\n```bash\nnpx degit jakejarvis/_cn\n\n# or use the \"Use this template\" button and then clone:\ngit clone https://github.com/your-username/my-cn.git\n```\n\nOnce cloned, ensure you have [Vite+](https://viteplus.dev/guide/) (`vp`) installed on your system; this will ensure all other requirements are taken care of for you.\n\n```bash\n# Install Vite+\ncurl -fsSL https://vite.plus | bash\n\n# Setup and start local server\nvp install\nvp dev\n```\n\nOpen the localhost URL from the Vite+ output and browse the starter docs, component, block, and utility pages. A good place to start customizing is the [`config.ts`](registry/config.ts) file.\n\n## Agent Skill\n\nThis repository includes an installable Agent Skill for authoring `_cn` registry items. Install it into your harness from the upstream template using the [Skills CLI](https://skills.sh/):\n\n```bash\nnpx skills add jakejarvis/_cn --skill shadcn-registry\n```\n\nAfter installing the skill, ask your agent for registry authoring work directly:\n\n- \"add a button component to the registry\"\n- \"adapt this modal from my app to make it reusable via this shadcn registry\"\n- \"add a reusable hook to the registry\"\n- \"turn this dashboard section into a registry block\"\n\n## Deploy\n\n[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fjakejarvis%2F_cn\u0026project-name=my-registry\u0026repository-name=my-registry\u0026demo-title=_cn%20Registry\u0026demo-url=https%3A%2F%2Funderscore-cn.vercel.app)\n\nAbove is a one-click button to fork the template and deploy it to Vercel as a platform-agnostic [Nitro server](https://nitro.build/).\n\nYou can just as easily use any other platform (Cloudflare Workers, Netlify, etc.) by following the [TanStack Start docs](https://tanstack.com/start/latest/docs/framework/react/guide/hosting#deployment) to make a few adjustments to your `vite.config.ts` file (agents are usually pretty good at this too).\n\n## Usage\n\n### Configuration\n\nEdit `registry/config.ts`.\n\n```ts\nexport const registryConfig = {\n  name: \"_cn\",\n  registryName: \"_cn\",\n  namespace: \"@_cn\",\n  description: \"Installable components for your project.\",\n  homepage: \"https://underscore-cn.vercel.app\",\n  repositoryUrl: \"https://github.com/jakejarvis/_cn\",\n} as const;\n```\n\nSet `homepage` before deploying. Install commands and local registry dependency URLs are built from this value.\n\n### Author Docs\n\nCreate public documentation pages under `registry/docs/`.\n\n```text\nregistry/docs/\n  index.mdx\n  installation.mdx\n  registry.mdx\n```\n\nDocs render under `/docs`: `registry/docs/index.mdx` becomes `/docs`, and `registry/docs/installation.mdx` becomes `/docs/installation`. Keep docs files directly under `registry/docs` for now; nested docs pages are not supported yet.\n\n```mdx\n---\ntitle: Installation\ndescription: Install and run this registry.\norder: 1\ngroup: Getting Started\n---\n\n# Installation\n\nUse Markdown or MDX with the built-in docs components.\n```\n\n### Add A Registry Item\n\n#### Automatic\n\nRun `bun --bun ./scripts/new.ts` to interactively scaffold new registry items under `registry/items/**`.\n\nIt's always a good idea to also run `bun --bun ./scripts/doctor.ts` after making changes in the `registry` directory; this validates registry metadata and reports ignored or suspicious files within the directory.\n\n#### Manual\n\nCreate a folder under `registry/items/\u003csection\u003e/\u003citem-name\u003e/`.\n\n```text\nregistry/items/components/example-card/\n  _registry.mdx\n  _preview.tsx\n  example-card.tsx\n```\n\nWrite metadata and usage docs in `_registry.mdx`.\n\n````mdx\n---\nname: example-card\ntype: registry:ui\ntitle: Example Card\ndescription: A compact card component.\nregistryDependencies:\n  - card\nlocalRegistryDependencies:\n  - other-local-item\n---\n\nUse the component anywhere you need a compact content summary.\n\n```tsx\nimport { ExampleCard } from \"@/components/ui/example-card\";\n\nexport function Example() {\n  return \u003cExampleCard /\u003e;\n}\n```\n````\n\nPut the interactive preview in `_preview.tsx`.\n\n```tsx\n\"use client\";\n\nimport { ExampleCard } from \"./example-card\";\n\nexport function Preview() {\n  return \u003cExampleCard /\u003e;\n}\n```\n\nFor a one-file component, the catalog infers the source file from the item root and `name`, then emits a shadcn target placeholder such as `@ui/example-card.tsx`. List `files` explicitly in frontmatter for hooks, libs, blocks, pages, custom target paths, or any item with multiple published files; file paths are relative to the item `_registry.mdx` file. Metadata-only styles, themes, fonts, bases, and universal items can omit `files`. Do not publish `_registry.mdx`, `_preview.tsx`, or other authoring-only files.\n\nThe MDX body renders as the optional Usage section on the docs page. Fenced code blocks are syntax highlighted and keep the docs site's copy button. `_preview.tsx` is authoring-only and can use local state or events behind its `\"use client\"` boundary, but server-only logic should stay out of previews. Use `localRegistryDependencies` for dependencies on other local registry items; they are converted into canonical registry URLs in the public JSON.\n\n## Server\n\nThe public registry index is available at both the root and `/r` paths, while installable item JSON lives under `/r`:\n\n- `/registry.json` serves the registry index.\n- `/r/registry.json` serves the same registry index.\n- `/r/\u003cname\u003e.json` serves an item JSON file.\n- `/llms.txt` and `/llms-full.txt` are generated from the same Markdown docs and registry item pages used by the site.\n\n\u003e [!TIP]\n\u003e \\_cn validates authored registry metadata against schemas directly from [`shadcn/schema`](https://github.com/shadcn-ui/ui/blob/main/packages/shadcn/src/registry/schema.ts) to ensure compatibility.\n\n### Content Negotiation\n\nHuman-facing registry URLs support the shadcn CLI's request headers. CLI requests with `Accept: application/vnd.shadcn.v1+json` or `User-Agent: shadcn` receive the shadcn-compliant JSON from the same URL as the human-readable docs page:\n\n- `/registry` returns the registry index JSON.\n- `/registry/\u003cname\u003e` and section item pages like `/components/\u003cname\u003e` return item JSON.\n\nAll pages also support Markdown content negotiation (inspired by [Fumadocs](https://www.fumadocs.dev/docs/headless/utils/negotiation)). AI clients that request `text/markdown`, `text/x-markdown`, or `text/plain` in the `Accept` header receive the Markdown version of the current page directly, while normal browser requests still receive HTML.\n\n## Checklist\n\n- [ ] Choose a registry name, namespace, domain, and repository URL in `registry/config.ts`.\n- [ ] Update or replace the starter docs under `registry/docs`.\n- [ ] Update or replace the starter registry items in `registry/items`; use `bun --bun ./scripts/new.ts` to generate new stubs.\n- [ ] Run `bun --bun ./scripts/doctor.ts` to verify changes.\n- [ ] Run `vp check` and `vp build`.\n- [ ] Deploy!\n- [ ] Test the install commands with npm, pnpm, yarn, bun, vite+, and deno.\n- [ ] Optionally submit your registry to shadcn's [official directory](https://ui.shadcn.com/docs/directory).\n\n## Gotchas\n\n\u003e [!WARNING]\n\u003e The docs site uses the local shadcn UI configuration in [`components.json`](components.json); that styling is for this app shell and does **not** affect the published registry items in any way.\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjakejarvis%2F_cn","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjakejarvis%2F_cn","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjakejarvis%2F_cn/lists"}