TanStack Ship is built on TanStack Start. Production runs on Cloudflare Workers, with data and async work handled by Cloudflare-native services.
Important
Pushing to GitHub does not deploy production. Release locally with
pnpm run deploy(notpnpm deploy).
Platform Architecture
| Component | Role | Config |
|---|---|---|
| Workers | SSR, API, Cron | wrangler.jsonc |
| D1 | Users, billing, blog, attribution | d1_databases |
| R2 | Uploads, media assets | r2_buckets + env vars |
| KV | Short-link slug mapping | kv_namespaces |
| Queues | Email campaigns, workflows | queues |
Prerequisites
| Tool | Version |
|---|---|
| Node.js | 20+ |
| pnpm | 10+ |
| Wrangler | 4.x |
| Cloudflare account | Workers, D1, R2, KV, Queues enabled |
One-time login:
pnpm wrangler login
Recommended Reading Order
- Local Development — install,
.dev.vars, local D1 - Cloudflare Resources — create D1/R2/KV/Queues
- Environment Variables — full reference
- Secrets & API Keys — OAuth, Stripe, etc.
- Integrations — Resend step-by-step
- Production Deploy — build and release
- Verify & Troubleshoot — launch checklist
Local vs Production
| Dimension | Local | Production |
|---|---|---|
| Env file | .dev.vars | wrangler secret + vars |
| Database | pnpm db:migrate:local | pnpm db:migrate:remote |
Client VITE_* | .dev.vars / shell | Injected at build; redeploy after changes |
| Bindings | Vite mocks cloudflare:workers | wrangler.jsonc bindings |
Good to know
During local dev, Vite reads
.dev.varsand mocks the Workers environment (Stripe, R2, PostHog, etc.) so you don't need remote Cloudflare on every run.