A pnpm-workspace starter for shipping a React + Vite frontend and a Hono API on Cloudflare Workers from one repo. It bundles the tooling (lint, format, typecheck, test, CI) and a set of self-contained, deletable feature modules, so new projects start from a green, working baseline instead of reassembling one from scratch.
- Account module — Drizzle/D1 users + sessions, WebCrypto PBKDF2 password hashing, HttpOnly cookie sessions, sign-up/sign-in/sign-out, email verification + password reset (with a zero-credential dev mailbox standing in for a real provider), self-serve account settings, and two-tier test auth for automated suites. See the account module page.
- Billing module — Stripe Checkout, customer-portal redirect, webhook
signature verification + event-dedup + subscription mirror to D1, a
pricing/upgrade page, a gated sample page (
/members), and a narrative story-test suite covering subscribe/trial/cancel/refund/dispute flows. See the billing module page. - Blog module — an MDX-backed blog with drafts, tags, RSS/Atom feeds, and full SEO registration (sitemap, OG image generation, prerendering). See the blog module page.
- Search — a Pagefind-powered search dialog over whatever's prerendered
into
apps/web/dist, not blog-specific. - Feedback module — a thumbs-up/down + optional comment widget, env-gated and POSTs to any HTTP endpoint (e.g. a Projektor feedback source). The reference example of a minimal, cleanly-removable module. See the feedback module page.
- R2 range-request proxy — a
/data/*worker route serving R2 objects with correctAccept-Ranges/206/Content-Range/suffix-range support, for anything that seeks into a large object (client-side analytics, media scrubbing, resumable downloads). Opt-in — 404s until a bucket is bound. See the R2 proxy module page. - SEO/sitemap registry — a single-source route registry
(
apps/web/src/seo.config.ts) that prerendering, the sitemap, and feeds all read from, plus a live SEO audit script (pnpm seo:live). - CI + hygiene — GitHub Actions running
pnpm checkon every push, Dependabot, Husky + lint-staged pre-commit hooks, and a Cloudflare Workers Builds-ready deploy setup.
Every module above documents its own touch-points and exact removal steps in the documentation site — delete what a given project doesn't need.
Full docs — quickstart, the new-project checklist, module pages and the
architecture overview — are at https://tajd.github.io/project-template/. The
source lives in apps/docs; run it locally with
pnpm --filter @template/docs dev.
See AGENTS.md for the full stack breakdown, dev commands,
and repo invariants — this README won't duplicate it.
pnpm install
pnpm --filter web dev
pnpm checkStarting a real project from this template involves renaming manifests, re-tokening the brand, provisioning Cloudflare resources, and more. Full checklist: New project checklist.
Projects stamped from this template can pull in future template improvements
by adding it as a second git remote (git remote add template <this-repo-url>)
and merging from it periodically. The merge-conflict conventions — what
downstream should never blindly accept from an upstream merge (sample
content, brand tokens, TEMPLATE: marker regions) and how to handle
deleted-module conflicts — are documented on the staying up to date page, and
per-entry in CHANGELOG.md.
Issues specific to Windows (not exercised by this template's Linux CI) are documented on the developing on Windows page.