New project checklist
Work through these in order — later steps assume earlier ones are done.
-
Use the GitHub template. On GitHub, “Use this template” → create a new repository. Clone it locally.
-
Rename the project.
package.json(root) —"name"field (currentlyproject-template).apps/web/package.json—"name"field (currentlyweb). If you change it, also update everypnpm --filter web ...reference (AGENTS.md,README.md) to the new name.apps/worker/package.json—"name"field (currently@template/worker). If you change this, also update every@template/workerreference (e.g. the rootdeployscript:pnpm --filter @template/worker exec wrangler deploy) andapps/worker/wrangler.toml’sname = "worker".packages/shared/package.json—"name"field (currently@template/shared), and everyworkspace:*dependency on it inapps/web/package.json,apps/worker/package.json, and the rootpackage.json.apps/web/src/seo.config.ts— update the/route’stitleanddescription(currentlyExemplar/ “A production-ready starting point for new products.”), plus every other route’s copy as it becomes real.
-
Re-token the brand. Edit only
apps/web/src/index.css— that’s where every semantic design token lives (--paper,--ink,--accent,--muted,--rule,--elev,--win,--error, in both the light:rootblock and the dark-mode overrides). Don’t add raw Tailwind colors elsewhere —apps/web/tailwind.config.tsreplaces Tailwind’s palette entirely, so only these tokens resolve. Swap the font import too if the project isn’t using Inter. The docs site mirrors the same palette inapps/docs/src/styles/theme.css; update it to match. -
Replace
content/blog/. Delete the three sample posts (getting-started-with-the-template.mdx,structured-data-without-the-headache.mdx,a-draft-post-in-progress.mdx) and add real posts, or remove the blog module entirely per the blog module page if the project doesn’t need one. -
Create Cloudflare resources and set secrets.
wrangler d1 create <db-name>— paste the returneddatabase_idintoapps/worker/wrangler.toml’s[[d1_databases]]block (replacing the00000000-...placeholder), then runwrangler d1 migrations apply DB --local(and--remoteonce deployed).- Create the KV/rate-limit bindings your modules need. The template ships
one:
AUTH_RATE_LIMITER([[unsafe.bindings]], native Workers Rate Limiting, no separate provisioning step — it’s created on first deploy). - Copy
apps/worker/.dev.vars.exampletoapps/worker/.dev.varsand fill in local values (gitignored, never commit real secrets). - Push real secrets to the deployed Worker with
scripts/push-secrets.ps1(see that script’s header for the exact list — currentlyRESEND_API_KEY,STRIPE_SECRET_KEY,STRIPE_WEBHOOK_SECRET, and optionallyTEST_LOGIN_SECRETif the deployment runs smoke tests).TEST_AUTH_TOKENis intentionally never pushed as a secret — see the account module page. - Set the
STRIPE_PRICE_IDvar inapps/worker/wrangler.tomlif the billing module is staying.
-
Create a Projektor project. Use the
mcp__projektor__create_projecttool (or the web UI) to create a project for this repo. Record the project key/ID inAGENTS.md’s<!-- TEMPLATE: fill in projectId/key -->marker under “Projektor tracker”. -
Create a Projektor feedback source for the feedback widget module (if keeping it) —
mcp__projektor__create_feedback_source. Put the returned endpoint URL and token inapps/web/.envasVITE_FEEDBACK_ENDPOINT/VITE_FEEDBACK_TOKEN(see the feedback module page). -
Point the docs site at your repo — or delete it.
apps/docsis this site. To keep it:- Edit the
TEMPLATE:marker region at the top ofapps/docs/astro.config.mjs—SITE,BASE,TITLE,DESCRIPTION. For a project Pages site athttps://<user>.github.io/<repo>/,BASEis/<repo>; for a user site or a custom domain it is/. - Match the same values in the
TEMPLATE:region ofapps/docs/scripts/gen-llms-txt.mjs. - Fix the base-prefixed links in
apps/docs/src/content/docs/index.mdx— the only file that hard-codes/project-template/. - Enable Pages by hand: repo Settings → Pages → Source → “GitHub
Actions”. The
.github/workflows/docs.ymlworkflow fails until someone does this; no workflow can do it for you. - Delete this template’s own pages (
start/,modules/,architecture/) and write your own.
To drop the site instead: delete
apps/docsand.github/workflows/docs.yml.A stamped project also inherits two Claude Code plugins from
.claude/settings.json—economist-stylefor editing docs prose anddiagram-designfor architecture diagrams. Drop either by removing its entry fromenabledPlugins(andextraKnownMarketplaces) in that file. - Edit the
-
Turn on dependency updates.
.github/dependabot.ymland.github/workflows/dependabot-auto-merge.ymlcome with the template, but the two repo settings that make auto-merge safe do not — GitHub does not copy settings into a repo made from a template. Set both:- Settings → General → Allow auto-merge.
- A branch protection rule or ruleset on
mainrequiring thecheckstatus check. This is the gate: without it there is nothing for auto-merge to wait on, and Dependabot PRs merge with CI unread.
To opt out entirely, delete both files.
-
Add the template as a remote so future template improvements can be pulled in:
git remote add template <this-template-repo-url>. The merge-conflict conventions to follow are on the staying up to date page.
Renormalize line endings once, now that the template ships a
.gitattributes: git add --renormalize . and commit the result. A repo
generated before .gitattributes landed may already have inconsistent
line endings committed (e.g. a CRLF file edited by a Windows text-mode
writer); this brings them in line without changing any content.
-
Delete unwanted modules. For each module you don’t need, follow the “Removal steps” on its page — account, billing, blog, feedback, R2 proxy — and run
pnpm checkafter each deletion. -
Deploy.
pnpm run deployfrom the repo root (builds the workspace, thenwrangler deployfromapps/worker), or connect a Cloudflare Workers Builds GitHub integration for deploy-on-push tomain(dashboard setup, not scripted here).