Start with the fire already lit.
A full-stack TypeScript starter that ships deployed on day one — an Effect v4 backend and a TanStack Start frontend on Cloudflare Workers, with passwordless auth, payments, media, and tests that run in the real runtime. In the Rails tradition: the decisions are already made.
This page is the starter pitching itself — that button runs the real flow: an emailed six-digit code, no password.
bun install
bun run dev
bun run deploy
bun run deploy --stage pr-9
Already burning
Not a roadmap. The starter ships with all of it working — deployed, wired together, and covered by tests.
- Two Workers, one stack
- A private Effect v4 backend owns D1, KV, R2, email, and every secret. The public TanStack Start Worker is the sole ingress and forwards to it over a service binding — the data plane is never exposed to the internet.
- Wrangler-zero
- There is no wrangler.jsonc. Resources, bindings, migrations, and secrets are declared in TypeScript, and one Alchemy stack deploys both Workers — D1 migrations apply on deploy.
- A stage per branch
deploy --stage pr-123mints a full isolated copy: fresh Workers, fresh data, its own minted secrets. Destroy the stage and it’s gone, cleanly.- Passwordless sign-in
- Better Auth emails a six-digit code — no passwords stored, no reset flow. The identity and the person are separate tables sharing one id, and sessions live in KV.
- Payments without the money path
- Polar is the Merchant of Record for a lifetime purchase: hosted checkout, receipts, and taxes. The Worker only records the entitlement — and previews run against the sandbox.
- Media on R2
- Avatar uploads land in R2 and serve through signed URLs, so the Worker stays out of the byte path.
- Tests in the real runtime
- Request tests boot the actual backend inside workerd, over real local D1 and KV, and sign in through the real OTP flow — no mocks pretending to be Cloudflare.
- Conventions, not configuration
- Where a file goes, what it's called, how an error becomes a status — decided once, in the Rails / 37signals tradition. Your thinking goes to the domain, not the plumbing.
The demo is the product
Sign in and you’re inside the app the starter ships: set your name, upload an avatar, buy the lifetime pass against Polar’s sandbox. Three screens, on purpose — it’s a starter, not a showcase. Everything past this page is exactly the code you’d build on.