Scaffold
Your Claude Code setup that builds, launches, and learns — across the whole product lifecycle. Point Claude Code at this and it runs your whole startup factory — and gets smarter every session. Works with Cursor, Codex & Windsurf too.
npx -y skills add hamza-ali-shahjahan/hamzaish --skill scaffoldAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 5 stars5 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
One-shot a new product — folders, Next.js starter, product.config.json, CLAUDE.md, scope.md, PRD skeleton, SETUP.md checklist. The Lovable-like ignition.
SKILL.md
9.1 KB, ~2.3k tokens by cl100k_base, as published. Nobody here has run it
/scaffold
Usage: /scaffold "<slug>" "<one-liner>"
Example: /scaffold "formpad" "A form builder for indie SaaS founders that auto-generates schema from prompts."
What this does
Creates a complete starting point for a new product:
-
Folder structure at
products/<slug>/:products/<slug>/ ├── product.config.json ├── CLAUDE.md ├── scope.md ├── prd.md ├── metrics.md (skeleton, fill in via metric-framework-designer later) ├── SETUP.md (the one-time setup checklist) ├── README.md ├── decisions/ │ └── 0001-scaffold.md ├── validation/ │ └── README.md (the validation ledger — gates `bun run check-validation`) ├── interviews/ │ └── README.md ├── launch/ │ └── README.md ├── analytics/ │ └── README.md └── (NO code/ here — see step 2: product code lives in its OWN sibling repo)Layout rule (hard):
products/<slug>/in Hamzaish is metadata only (markdown +product.config.json+ the folders above). A product's actual code lives in its own repo outside Hamzaish, registered in gitignoredcode-paths.local.json. Never createproducts/<slug>/code/(orsrc/,app/,dist/…) with real source — Hamzaish is always public and nothing excludes it from commits.bun run check-product-layoutenforces this; seebrain/anti-patterns/product-code-inside-factory-repo.md. -
Code repo — a SIBLING repo, NOT inside Hamzaish. Create the product's code in its own directory outside this repo (e.g.
~/Claude/<Name>),git initit there (no remote yet if held local → add a.no-auto-pushmarker), then register it: add"<slug>": "/abs/path/to/<Name>"tocode-paths.local.json(gitignored) and keepcode_path: nullinproduct.config.json(path-portability rule). For a web product, seed that sibling repo fromtemplates/product-starter-nextjs/with the name, slug, and one-liner substituted into:package.json(name).env.example(NEXT_PUBLIC_APP_NAME)src/app/(marketing)/page.tsx(hero copy)src/app/layout.tsx(default metadata)next.config.mjs(if needed)README.md.gitleaks.toml,SETUP.md({{PRODUCT_NAME}} / {{PRODUCT_SLUG}} placeholders).devcontainer/devcontainer.json({{PRODUCT_NAME}} placeholder)
The starter is secure-by-default — the copy already brings
.gitignore(.env*ignored,!.env.exampletracked), the committed.env.exampleplaceholder, thesecret-scan.ymlgitleaks workflow,.gitleaks.toml, the.githooks/pre-commithook, and a.devcontainer/(Node + Bun) so builds run in an isolated container instead of on the bare host. See "Secure-by-default" below for the scaffold-time steps the template can't carry on its own. -
product.config.json — the dashboard registry entry:
{ "slug": "<slug>", "name": "<Title Case Name>", "one_liner": "<one-liner>", "created": "<ISO date>", "stage": "idea", "status": "scaffolded", "code_path": null, "aliases": [], "analytics": { "stripe_account_id": null, "posthog_project_id": null, "ga4_measurement_id": null, "plausible_domain": null, "sentry_org": null, "sentry_project": null, "gsc_property": null, "ahrefs_target": null }, "links": { "github": null, "prod_url": null, "staging_url": null } } -
CLAUDE.md in the product folder — uses
templates/claude-md-template.mdwith substitutions. -
scope.md — uses
templates/scope-doc-template.md, with Claude's first-pass fill from the one-liner. User edits in next session. -
PRD skeleton — uses
templates/prd-template.md, Claude pre-fills sections that can be inferred from the one-liner; rest are clearly marked TODO. -
SETUP.md — the exact 11-step setup checklist from
stack/analytics-stack.md, with the product's specific URLs for service signups pre-filled. -
First decision log entry in
decisions/0001-scaffold.md:## YYYY-MM-DD — Scaffolded Created via /scaffold. One-liner: "<one-liner>". Stage: idea. Stack: default per stack/tech-stack.md. Next: complete SETUP.md, run /validate <slug>.
What you do as the assistant when this is invoked
- Parse
<slug>and<one-liner>from the user's invocation. - Validate slug: lowercase, hyphens only, no spaces. If invalid, ask for correction.
- Validate uniqueness: error if
products/<slug>/exists. - VALIDATION GATE: Seed
products/<slug>/validation/README.mdfromproducts/_template/validation/README.md, then runbun run check-validation <slug>. If it exits non-zero (stateunvalidated), tell the user: "No validation evidence for this product. Run/validate <slug>first, or — if you're choosing to build first — I'll set the ledger todebt-acceptedand record why." Building first is allowed; building first silently is not. Only proceed once the ledger reflects reality (validated,in-progress, ordebt-accepted). - If user proceeds: create folder structure, copy template, do the substitutions.
- Generate the doc skeletons by reading the templates and filling from the one-liner.
- Apply the secure-by-default steps (section below).
- Print the local-first promise: the scaffold runs with ZERO config — no accounts, no env vars.
bun install && bun devboots it in local mode (dev-auth stub, SQLite-ready, integrations off). SETUP.md is the go-live checklist for later, not a prerequisite — surface it as "when you're ready to ship," never as "do this first." - Print "next: open the product's code repo (the path you registered in
code-paths.local.json) in its devcontainer — VS Code → 'Reopen in Container' (ordevcontainer up). The container installs deps and runs the dev server in isolation; the landing page boots at localhost:3000 (port-forwarded out of the container) with zero accounts — build first, wire your stack when you deploy. Building on the bare host instead is at your own risk."
Secure-by-default
Every scaffolded product ships secure from commit zero. Most of this rides in via the template copy; a few steps must run at scaffold time.
- Secrets gitignored — verify the copied
.gitignoreignores.env,.env.*,*.env.localand re-includes!.env.example. Only the placeholder.env.exampleis tracked; real secrets go in.env.local(local) or Vercel project settings (prod), never the repo. - Conversations gitignored — verify the copied
.gitignorecarries the "Conversations / chat transcripts / strategy & discussion notes" block (prose.md/.txtpatterns). Our conversations/strategy/discussion never belong in a product repo — that context lives in local memory. The block is a backstop; the guarantee is discipline. (A machine-wide~/.config/git/ignorenet mirrors it.) - Secret-scan CI included —
.github/workflows/secret-scan.yml(gitleaks, pinned action,permissions: contents: read) +.gitleaks.tomlcome with the template. Confirm they landed in the product's code repo. - Devcontainer ships in the template —
.devcontainer/devcontainer.json+Dockerfile(Node + Bun, non-root, workspace-only mount, no host secret/SSH passthrough) ride in via the copy. Confirm they landed, and tell the user to open the product in the container ("Reopen in Container" in VS Code, ordevcontainer up) so the agent and all build/install commands run isolated from the host. Running on the bare host is at the operator's own risk. .no-auto-pushmarker — create it at scaffold time so wip auto-commits stay local until/ship:touch <code-repo>/.no-auto-push(in the sibling code repo). (It's gitignored by design — operator-local discipline — so the template can't carry it across a fresh clone; the scaffold step must add it.)- Production-branch deploy — note in the product's
SETUP.md/ decision log: Vercel Production Branch must be set toproduction(Project → Settings → Git). Deploys happen only via/ship(promote reviewed commits toproduction).main/working-branch pushes should be Preview, not Production. - RLS-on reminder — surface it: every Supabase table holding user data needs
enable row level security+ a policy insupabase/migrations/. The starter migration is the place to set the habit; flag it in the final message. - Tell the user they can run
/security-check <slug>any time to audit all of the above, and that/shipruns it as a gate before every deploy.
Edge cases
- If
templates/product-starter-nextjs/doesn't exist yet, scaffold the doc files only and tell the user to wait for the starter (Phase C of this build pass). - If user provides only
<slug>without<one-liner>, ask for the one-liner once. Don't proceed without it.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.