new-project
Skill1 starsChanged 25 days agoMITView on GitHub
Scaffolds a new project — an OpenTeams React+TypeScript frontend (Vite, Tailwind v4, Nebari design system), a Python FastAPI backend (PostgreSQL, async SQLAlchemy, Alembic, pytest, uv), a full-stack monorepo with both wired together, or a vibe project (jbouder's personal Cloudflare app stack, built like holocron and datapad — Vite + React 19 + stock shadcn base-lyra on a Cloudflare Worker, bun, Biome, Vitest in workerd, Playwright + axe, pinned CI with deploy, PR previews and releases, and the docs, accessibility, security and motion rules). Not for static pages deployed through the Nebari Apps Pack — use new-nebari-app for those. Triggers on /new-project, "scaffold a new frontend", "create a React project", "new React app", "scaffold a new backend", "create a FastAPI project", "new FastAPI app", "bootstrap a frontend/backend app", "scaffold a monorepo", "create a full-stack project", "new full-stack app", "new vibe project", "start a vibe project", "new Cloudflare app like holocron/datapad".
- Pipes a download into a shell
- Reads credentials
- Installs packages
51 other projects use a version of this.
Adopted by
Most recently taken up by
- Walsworth-Group/physkittheir own version, first seen Nov 8, 2026
- cperler/soustheir own version, first seen Nov 8, 2026
- Mark-Life/agent-skillstheir own version, first seen Nov 6, 2026
- pche-broken-artist/forge-of-thoughttheir own version, first seen Nov 6, 2026
- danielrosehill/Claude-Image-Production-Plugintheir own version, first seen Nov 5, 2026
- buildomator/buildomatortheir own version, first seen Nov 4, 2026
Used with
Projects with it also use checkpoint, prd and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
genomewalkerSkillcheckpoint
Save a checkpoint of task status, decisions, active files, and next steps
Also in 3 projects that use this
GitHubSkillprd
Generate high-quality Product Requirements Documents (PRDs) for software systems and AI-powered features. Includes executive summaries, user stories, technical specifications, and risk analysis.
Also in 3 projects that use this
sunnyclinches44Skillexplain
Explains code using real-world analogies and ASCII diagrams
Also in 3 projects that use this
SentrySkillspec
Produce a verified spec — problem, desired outcome, and acceptance criteria — before building. Use when given a GitHub/Linear issue link, when starting from a fuzzy in-conversation idea, or asked to "figure out what to do" / "scope this" / "what should I build" — whenever the *what* isn't yet pinned down. Grills the ambiguities, checks the premise against the code, and produces acceptance criteria you sign off on — then hands to design-first.
Also in 3 projects that use this
GoogleSkilldomain-modeling
Build and sharpen a project's domain model. Use when the user wants to pin down domain terminology or a ubiquitous language, record an architectural decision, or when another skill needs to maintain the domain model.
Also in 4 projects that use this
SentrySkillreview
Fixture review skill.
Also in 5 projects that use this
- +1 more from getsentry
Other versions51 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 51
- hsantanna88/clo-author★ 262same name
- hugosantanna/clo-author★ 262same name
- buildomator/buildomator★ 102same name
- sneg55/agent-starter★ 76same name
- dtiger1889-ops/claude-harness-toolbox★ 31same name
- 5throck/ai-workspace-standards★ 25same name
- jcottam/agent-resources★ 25same name
- danielrosehill/Claude-Image-Production-Plugin★ 21same name
- pche-broken-artist/forge-of-thought★ 12same name
- ice-lfernandes/claude-spring-architect★ 11same name
41 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository12 other files it gives its agents.
- a11y-auditSkill
- backend-conventionsSkill
- decision-deckSkill
- frontend-conventionsSkill
- github-issueSkill
- k8s-conventionsSkill
- new-nebari-appSkill
- pr-reviewSkill
- start-devSkill
- talk-deckSkill
- tool-evalSkill
- web-app-auditSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
18 rules. 0 are common, 8 are distinctive, and 10 are very specific to this project.
0
Common
Most of the 48 edited versions we read keep these.
8
Distinctive
This author's own choices. Worth a look.
10
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 21
All paths to references/ and assets/ are relative to this skill's directory.
- Very specific: line 26
If PROJECT_NAME is empty, stop and tell the user: "Please provide a project name: /new-project <project-name> [--frontend | --backend | …
- Very specific: line 28
If a directory named $PROJECT_NAME already exists in the current working directory, stop and tell the user: "Directory '$PROJECT_NAME' …
- Very specific: line 53
Only these {{UPPER_CASE}} tokens are placeholders.
- Very specific: line 70
Read references/monorepo-root.md.
- Very specific: line 82
Read ALL of references/frontend-structure.md before writing.
- Distinctive: line 185
If it fails (e.g. network error), note the failure and continue.
- Very specific: line 193
If it fails, note the failure and continue — the app will not build until @nebari/theme has been added, since src/index.css references its …
- Very specific: line 349
All paths below are relative to $TARGET_DIR.
- Distinctive: line 359
Read ALL of each reference before writing its files, and write every file it lists, exactly as given (they were generated from a scaffold …
- Distinctive: line 395
If an install step fails (network), note it and continue.
- Very specific: line 399
Run CI's check job locally, in order, and fix anything that fails before reporting (a failure here is a scaffold bug, not the user's …
- Distinctive: line 422
If Chromium cannot be installed here, skip it and say so in the report.
- Distinctive: line 430
Do not create a GitHub repository, push, or deploy: those are the user's calls, listed in the report.
- Distinctive: line 479
Read references before writing: Read the full reference and template files for each part before writing any of its files.
- Distinctive: line 484
Installs run unconditionally: after the files for that part are written.
- Distinctive: line 487
Do not add extra files: only create the files listed above.
- Very specific: line 488
Vibe placeholders: only the {{UPPER_CASE}} tokens in Pre-flight item 7 are placeholders.
“Common” is measured: kept by at least 6 in 10 of the 48 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
You are scaffolding a new project in one of four layouts. Follow every step below exactly and in order. Do not skip steps. Do not ask for confirmation between steps — execute everything autonomously.
| Layout | What it creates |
--frontend | $PROJECT_NAME/ — React 19 + TS + Vite + Tailwind v4 + Nebari + React Router + TanStack Query + Jotai + Vitest + Biome |
--backend | $PROJECT_NAME/ — Python 3.12 + FastAPI + async SQLAlchemy 2 + Alembic + Pydantic v2 + pytest + Ruff + uv |
--monorepo | $PROJECT_NAME/frontend/ + $PROJECT_NAME/backend/ + a root Makefile, with the frontend's /api dev proxy pointed at the backend |
--vibe | $PROJECT_NAME/ — a personal Cloudflare app built like holocron and datapad: React 19 + TS + Vite + Tailwind v4 + stock shadcn base-lyra (Base UI, Oxanium, square, System/Light/Dark) on one Worker, bun, Biome, knip, Vitest in workerd, Playwright + axe (desktop and phone), pinned CI, deploy, PR previews, releases, and the docs. Follow Pre-flight, then Vibe Layout instead of Steps 1–7. |
All paths to references/ and assets/ are relative to this skill's directory.
Pre-flight Checks
- Parse
$ARGUMENTS: the first non-flag token isPROJECT_NAME;--frontend,--backend,--monorepoor--vibesetsLAYOUT. - If
PROJECT_NAMEis empty, stop and tell the user: "Please provide a project name: /new-project<project-name>[--frontend | --backend | --monorepo | --vibe]" - If no flag was given, infer
LAYOUTfrom the request: React / frontend / Vite →frontend; FastAPI / backend / API service →backend; full-stack / monorepo / "frontend and backend" →monorepo; vibe project / a personal or side project on Cloudflare / "like holocron" or "like datapad" →vibe. If the request doesn't say, ask which layout — this is the one question allowed before scaffolding. - If a directory named
$PROJECT_NAMEalready exists in the current working directory, stop and tell the user: "Directory '$PROJECT_NAME' already exists. Choose a different name or remove the existing directory first." - For
backendandmonorepo: runuv --version. If it fails, stop and tell the user: "uv is required. Install it with: curl -LsSf https://astral.sh/uv/install.sh | sh" Forvibe: runbun --version. If it fails, stop and tell the user: "bun is required. Install it with: curl -fsSL https://bun.sh/install | bash". Then checkPROJECT_NAMEis a valid Worker name (^[a-z][a-z0-9-]{0,53}$: lowercase letters, digits and dashes, room for a-pr-<n>preview suffix); if not, stop and suggest the nearest valid one. - Set
TARGET_DIR = <cwd>/$PROJECT_NAMEand the sub-project roots:
| Layout | FRONTEND_DIR | FRONTEND_NAME | BACKEND_DIR |
frontend | $TARGET_DIR | $PROJECT_NAME | — |
backend | — | — | $TARGET_DIR |
monorepo | $TARGET_DIR/frontend | $PROJECT_NAME-frontend | $TARGET_DIR/backend |
vibe | $TARGET_DIR (see Vibe Layout) | — | — |
- For
vibeonly, work out the placeholder values the vibe references use:
| Placeholder | Value |
{{PROJECT_NAME}} | PROJECT_NAME (also the Worker's name and the localStorage prefix) |
{{PROJECT_TITLE}} | Its display name: the request's if it gives one, else PROJECT_NAME with dashes as spaces, each word capitalized (tide-pool → Tide Pool). No quotes or apostrophes: it lands in TS string literals. |
{{DESCRIPTION}} | One plain sentence, ending in a period, saying what the app is, from the request (Tide tables for the bay.). If the request gives nothing to go on: {{PROJECT_TITLE}} runs on Cloudflare. No quotes. |
{{GITHUB_OWNER}} | gh api user --jq .login; else git config github.user; else the literal OWNER, and say so in the report |
{{AUTHOR}} | git config user.name |
{{YEAR}} | date +%Y |
{{BUN_VERSION}} | bun --version |
{{THEME_SCRIPT_HASH}} | Left in place while writing; Step V3 computes it |
Only these {{UPPER_CASE}} tokens are placeholders. Leave every other double brace alone: GitHub expressions (${{ github.ref }}) and JSX objects (route={{ name: 'home' }}, style={{ … }}) are part of the files.
Step 1 — Initialize the Repository
mkdir -p "$TARGET_DIR"
cd "$TARGET_DIR" && git initOne git init only, at $TARGET_DIR. In a monorepo, never git-init frontend/ or backend/.
Step 2 — Monorepo Root Files (monorepo only)
Read references/monorepo-root.md. Replace every {{PROJECT_NAME}} with $PROJECT_NAME and write to $TARGET_DIR/:
.gitignoreREADME.mdMakefileAGENTS.md— fromassets/agents-monorepo.mdACCESSIBILITY.md— fromassets/accessibility.md. At the root, so GitHub shows it as an Accessibility tab beside the README.
Step 3 — Frontend Files (frontend and monorepo)
Read ALL of references/frontend-structure.md before writing. Replace every {{PROJECT_NAME}} with $FRONTEND_NAME. Write into $FRONTEND_DIR/, creating parent directories as needed.
Root files:
.gitignoreREADME.mdAGENTS.md— fromassets/agents-frontend.mdACCESSIBILITY.md— fromassets/accessibility.md.frontendlayout only: a monorepo has it at its root (Step 2), not infrontend/.package.jsontsconfig.jsontsconfig.node.jsonvite.config.tscomponents.json— includes the@nebariregistry mappingbiome.json.env.exampleindex.html
Tailwind v4 needs no
tailwind.config.tsorpostcss.config.js(configured insrc/index.cssvia@import "tailwindcss"), and Biome replaceseslint.config.js. Do not create those files.
Source files:
src/main.tsxsrc/App.tsxsrc/index.csssrc/lib/utils.tssrc/lib/api.tssrc/test/setup.tssrc/store/appAtoms.tssrc/providers/ThemeProvider/ThemeProvider.tsxsrc/providers/ThemeProvider/ThemeProvider.test.tsxsrc/providers/ThemeProvider/index.tssrc/pages/Home/Home.tsxsrc/pages/Home/Home.test.tsxsrc/pages/Home/index.tssrc/pages/NotFound/NotFound.tsxsrc/pages/NotFound/NotFound.test.tsxsrc/pages/NotFound/index.tssrc/components/ui/.gitkeep— empty filesrc/hooks/.gitkeep— empty file
Step 4 — Backend Files (backend and monorepo)
Read ALL of references/backend-structure.md before writing. Replace every {{PROJECT_NAME}} with $PROJECT_NAME. Write into $BACKEND_DIR/, creating parent directories as needed.
Root and config files:
.gitignore.python-versionREADME.mdAGENTS.md— fromassets/agents-backend.md.env.env.exampledocker-compose.ymlpyproject.tomlalembic.ini
App source files:
app/__init__.py— empty fileapp/main.pyapp/config.pyapp/database.pyapp/deps.pyapp/models/__init__.py— empty fileapp/models/base.pyapp/schemas/__init__.py— empty fileapp/schemas/health.pyapp/routers/__init__.py— empty fileapp/routers/health.pyapp/services/__init__.py— empty fileapp/repositories/__init__.py— empty file
Migration files:
migrations/env.pymigrations/script.py.makomigrations/versions/.gitkeep— empty file
Test files:
tests/__init__.py— empty filetests/conftest.pytests/test_health.pytests/factories/__init__.py— empty file
Step 5 — Install Frontend Dependencies and Nebari (frontend and monorepo)
cd "$FRONTEND_DIR" && npm installThis may take 30–60 seconds. Wait for it to complete before continuing.
Then install the Nebari design-system consumer skill. The @nebari registry is already wired into components.json, so npx shadcn add @nebari/<name> resolves without extra setup. This pulls the nebari-ui skill into ~/.claude/skills/nebari-ui/, which auto-activates when you ask to add or use Nebari components:
cd "$FRONTEND_DIR" && npx shadcn@latest add @nebari/claude-skill --yesIf it fails (e.g. network error), note the failure and continue.
Then add the theme first (it writes the Nebari brand tokens — :root + .dark CSS variables — into src/index.css), then the base components. shadcn pulls each component's registryDependencies (the utils helper, the theme) and npm dependencies (Base UI, class-variance-authority, lucide-react) automatically:
cd "$FRONTEND_DIR" && npx shadcn@latest add @nebari/theme @nebari/button @nebari/card @nebari/input @nebari/badge @nebari/dialog @nebari/select @nebari/alert @nebari/tabs --yesIf it fails, note the failure and continue — the app will not build until @nebari/theme has been added, since src/index.css references its tokens.
Step 6 — Install Backend Dependencies (backend and monorepo)
cd "$BACKEND_DIR" && uv syncThis may take 30–60 seconds. Wait for it to complete before continuing.
Step 7 — Verify and Report
Run:
find "$TARGET_DIR" -type f \
| grep -v node_modules | grep -v ".git/" | grep -v ".venv/" | grep -v __pycache__ \
| sortThen print the success message for the layout, with actual values substituted. If any install step failed, say so above the message.
frontend
✓ Scaffolded $PROJECT_NAME
Stack:
React 19 + TypeScript + Vite
Tailwind CSS v4 + @nebari/design (Base UI, light/dark mode)
React Router v6
TanStack Query v5
Jotai (global state)
Vitest + Testing Library + Biome
Next steps:
cd $PROJECT_NAME
npm run dev → http://localhost:5173
npm run test → run unit tests
npm run check → format + lint + organize imports
npm run build → production build
Add more Nebari components:
npx shadcn add @nebari/<component> (e.g. spinner, field, label, checkbox, switch, radio-group, textarea)
npx shadcn view @nebari/<component> (inspect variants/props before installing)
curl -s https://nebari-dev.github.io/nebari-design/r/registry.json (list the catalog)
Add a new page:
src/pages/PageName/PageName.tsx
src/pages/PageName/PageName.test.tsx
src/pages/PageName/index.ts
Then add a <Route> in src/App.tsx
Add an API hook:
src/hooks/use-<resource>.ts
(see AGENTS.md for the TanStack Query pattern)
Accessibility:
ACCESSIBILITY.md → the WCAG 2.2 AA target, how it's checked, known exceptions
/a11y-audit <url> → audit the running app; then update ACCESSIBILITY.md's statusbackend
✓ Scaffolded $PROJECT_NAME
Stack:
Python 3.12 + FastAPI + Uvicorn
PostgreSQL + SQLAlchemy 2 (async) + asyncpg
Alembic (migrations)
Pydantic v2 + pydantic-settings
pytest + pytest-asyncio + httpx
Ruff (lint + format)
uv (package manager)
Next steps:
cd $PROJECT_NAME
docker-compose up -d → start Postgres (dev: 5432, test: 5433)
uv run alembic upgrade head → run migrations
uv run uvicorn app.main:app --reload --port 8000
uv run pytest → run tests (requires docker-compose up -d)
Add a migration after editing models:
uv run alembic revision --autogenerate -m "describe change"
uv run alembic upgrade head
Add a new resource:
app/models/thing.py → SQLAlchemy model (import in app/models/__init__.py)
app/schemas/thing.py → Pydantic request/response schemas
app/repositories/thing.py → DB queries (ThingRepository)
app/services/thing.py → business logic (ThingService)
app/routers/thing.py → route handlers (include in app/main.py)
See AGENTS.md for full conventions and coding standards.monorepo
✓ Scaffolded $PROJECT_NAME (full-stack monorepo)
Structure:
$PROJECT_NAME/
├── frontend/ React 19 + TypeScript + Vite + Tailwind v4 + @nebari/design (Base UI)
└── backend/ Python 3.12 + FastAPI + PostgreSQL + Alembic
Stack:
Frontend: React 19 · TypeScript · Vite · Tailwind CSS v4 · @nebari/design (Base UI) · React Router v6 · TanStack Query v5 · Jotai · Vitest
Backend: FastAPI · SQLAlchemy 2 (async) · asyncpg · Alembic · Pydantic v2 · pytest-asyncio · httpx · Ruff · uv
Next steps:
cd $PROJECT_NAME
# Start databases
make db-up
# Run migrations
make db-migrate
# Start both servers (frontend: 5173, backend: 8000)
make dev
# Or start individually
make dev-frontend
make dev-backend
# Run all tests
make test
# Build frontend for production
make build
Frontend API calls: already proxied — fetch("/api/...") in the browser hits http://localhost:8000
Add more Nebari components:
cd frontend && npx shadcn add @nebari/<component> (e.g. spinner, field, label, checkbox, switch, radio-group, textarea)
cd frontend && npx shadcn view @nebari/<component> (inspect variants/props before installing)
curl -s https://nebari-dev.github.io/nebari-design/r/registry.json (list the catalog)
Accessibility:
ACCESSIBILITY.md → the WCAG 2.2 AA target, how it's checked, known exceptions
/a11y-audit <url> → audit the running app; then update ACCESSIBILITY.md's status
See AGENTS.md (root), frontend/AGENTS.md, and backend/AGENTS.md for full conventions.Vibe Layout (--vibe)
A vibe project is one of jbouder's personal apps on Cloudflare, built the way holocron, datapad and pulse are: the same stack, look, motion, accessibility bar, security headers, CI and release process from the first commit. assets/agents-vibe.md (written as the project's AGENTS.md) is the rulebook it ships with; references/vibe-recipes.md is what to add later (a Durable Object, Cloudflare Access, rate limits, WebLLM, MCP, more navigation, a collector, a docs site) — read it when the request already asks for one of those, and mention it in the report either way.
All paths below are relative to $TARGET_DIR. Replace the placeholders from Pre-flight item 7 in every file.
Step V1 — Initialize the repository
mkdir -p "$TARGET_DIR" && cd "$TARGET_DIR" && git init -qStep V2 — Write the files
Read ALL of each reference before writing its files, and write every file it lists, exactly as given (they were generated from a scaffold that passed every check):
references/vibe-config.md—.gitignore,package.json,biome.json,components.json, the fourtsconfig*.json,vite.config.ts,vitest.config.ts,playwright.config.ts,knip.jsonc,wrangler.jsonc,build-info.ts,index.html,public/_headers,public/favicon.svg,public/site.webmanifestreferences/vibe-app.md—shared/,worker/, andsrc/(exceptsrc/components/ui/, which Step V3 installs)references/vibe-tests.md—test/ande2e/references/vibe-ci.md—.github/(workflows,scripts/preview-comment.sh,dependabot.yml, the PR template) andscripts/references/vibe-docs.md—README.md,CONTRIBUTING.md,CHANGELOG.md,SECURITY.md,ACCESSIBILITY.md,LICENSE,CLAUDE.mdanddocs/AGENTS.md— fromassets/agents-vibe.md
No
tailwind.config.ts,postcss.config.js, ESLint or Prettier config: Tailwind v4 is configured insrc/index.css, Biome is the linter and formatter. Do not add files the references don't list.
Step V3 — Install, add the components, pin the CSP hash
cd "$TARGET_DIR" && bun installThen the stock shadcn components, through the CLI (they are CLI-managed in this stack: never hand-written, never hand-edited). components.json already selects base-lyra with Phosphor icons:
cd "$TARGET_DIR" && bunx --bun shadcn@latest add button card dropdown-menu tooltip dialog input label --yesThen fill {{THEME_SCRIPT_HASH}} in public/_headers with the SHA-256 of the inline theme script in index.html (the CSP allows that one script by hash):
cd "$TARGET_DIR" && HASH=$(python3 -I -c "import re,hashlib,base64; s=re.search(r'<script>([\s\S]*?)</script>', open('index.html').read()).group(1); print(base64.b64encode(hashlib.sha256(s.encode()).digest()).decode())") \
&& sed -i.bak "s|{{THEME_SCRIPT_HASH}}|$HASH|" public/_headers && rm public/_headers.bakThen align Biome's schema with the installed CLI and format what the shadcn CLI wrote:
cd "$TARGET_DIR" && bunx biome migrate --write; bunx biome check --write .If an install step fails (network), note it and continue; the checks in V4 will say what is missing.
Step V4 — Verify
Run CI's check job locally, in order, and fix anything that fails before reporting (a failure here is a scaffold bug, not the user's problem):
cd "$TARGET_DIR" \
&& bunx wrangler types \
&& bunx biome ci . \
&& bunx knip \
&& bunx tsc -b \
&& bun run licenses \
&& bunx vite build \
&& bun run budget \
&& bunx vitest runbudgetfails only if dependencies drifted heavier than when the references were made: setBUDGET_KBinscripts/budget.tsto the measured value plus about 5%, and update its comment.test/headers.test.tsfailing on the script hash meansindex.htmlchanged after V3: recompute the hash.
Then the browser suite (about a minute; the first run needs Chromium):
cd "$TARGET_DIR" && bunx playwright install chromium && bunx playwright testIf Chromium cannot be installed here, skip it and say so in the report.
Step V5 — First commit
cd "$TARGET_DIR" && git add -A && git commit -q -m "Scaffold $PROJECT_NAME"Do not create a GitHub repository, push, or deploy: those are the user's calls, listed in the report.
Step V6 — Report
Print the file list (as in Step 7, also excluding dist/, .wrangler/, test-results/), say which checks ran and passed (and anything skipped or failed), then:
✓ Scaffolded $PROJECT_NAME (vibe project)
Stack:
React 19 + TypeScript + Vite · Tailwind CSS v4 · stock shadcn base-lyra (Base UI)
Oxanium + JetBrains Mono · Phosphor icons · System / Light / Dark · square corners
One Cloudflare Worker (static assets + /api) via @cloudflare/vite-plugin
bun · Biome · knip · Vitest in workerd · Playwright + axe (desktop + phone)
Run it:
cd $PROJECT_NAME
npm run dev → http://localhost:5173 (the Worker runs locally too)
npm test → Vitest in workerd: API, headers/CSP, theme contrast, motion tokens, workflow pins
npm run e2e → Playwright + axe, desktop and phone
npm run check → Biome
npm run deploy → build + wrangler deploy (after `npx wrangler login`)
Put it on GitHub (your call):
gh repo create $GITHUB_OWNER/$PROJECT_NAME --public --source . --push
Secrets CLOUDFLARE_API_TOKEN + CLOUDFLARE_ACCOUNT_ID → deploy on green main, a preview Worker per PR
A ruleset on main requiring: check, e2e, codeql (javascript-typescript), codeql (actions)
(docs/self-hosting.md has every step)
Release:
CHANGELOG.md's [Unreleased] → a version section, bump package.json, merge, tag vX.Y.Z (CONTRIBUTING.md)
Make it yours:
The mark: public/favicon.svg and src/components/Mark.tsx (same shape)
Pages: src/lib/router.ts (Route, parse, pathFor) + src/pages/ + a line in e2e/a11y.spec.ts
API: an entry in ROUTES (worker/index.ts), its types in shared/, a test in test/api.test.ts
More components: bunx --bun shadcn@latest add <name>
When it needs more (references/vibe-recipes.md in the new-project skill):
saved or live state → a Durable Object · private → Cloudflare Access (and delete preview.yml)
public create forms → Turnstile + rate limits · on-device AI → WebLLM · Claude → MCP
Rules: AGENTS.md (CLAUDE.md points at it), CONTRIBUTING.md, docs/design.md, ACCESSIBILITY.mdImportant Notes
- Read references before writing: Read the full reference and template files for each part before writing any of its files. Never guess at file contents.
- Name substitution:
{{PROJECT_NAME}}becomes$FRONTEND_NAMEin frontend files (so<name>-frontendin a monorepo) and$PROJECT_NAMEeverywhere else. - Placement: in a monorepo, frontend files go in
frontend/, backend files inbackend/, and only the root.gitignore,README.md,Makefile,AGENTS.mdandACCESSIBILITY.mdsit at$TARGET_DIR/. ACCESSIBILITY.mdonly where there is a UI:frontendandmonorepoget one at$TARGET_DIR/; abackendproject, an API with no UI, gets none.- Empty files:
__init__.py,.gitkeep, andfactories/__init__.pyfiles must be written as empty files. - Installs run unconditionally after the files for that part are written.
- Nebari components are upstream-managed:
npx shadcn add @nebari/<name>copies component source intosrc/components/ui/. Treat those files as managed — never hand-edit them (they are overwritten on upgrade). Extend at the call site viaclassName(merged withcn()) or the Base UIrenderprop. See thenebari-uiskill. - Theme via CLI, not hand-copied: the
:root/.darkbrand tokens come fromnpx shadcn add @nebari/theme.src/index.cssintentionally ships only the Tailwind import, font imports, and base layer — do not paste token values into it. - Do not add extra files: only create the files listed above.
- Vibe placeholders: only the
{{UPPER_CASE}}tokens in Pre-flight item 7 are placeholders;${{ … }}in workflows and{{ … }}in JSX are code.{{THEME_SCRIPT_HASH}}is the one filled after writing (Step V3). - Vibe components are stock shadcn, not Nebari:
src/components/ui/comes frombunx --bun shadcn@latest addwith thebase-lyrastyle. Do not install@nebari/*or thenebari-uiskill in a vibe project. - Vibe templates are generated, not hand-kept: the
vibe-*.mdreferences (exceptvibe-recipes.md) andassets/agents-vibe.mdwere generated from a scaffold that passed lint, knip, types, build, budget, Vitest and the Playwright + axe suite. To change them, never edit the Markdown by hand:python3 -I scripts/vibe_refs.py scaffold <dir>writes a project from them, change it there, run Steps V3 and V4 on it, thenpython3 -I scripts/vibe_refs.py extract <dir>regenerates them (the script's docstring has the loop).
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

