Before your first deploy, create these Cloudflare resources and paste IDs into wrangler.jsonc.
pnpm wrangler login
D1 Database
pnpm wrangler d1 create tanstackship
Copy the database_id into:
"d1_databases": [{
"binding": "DB",
"database_name": "tanstackship",
"database_id": "YOUR_ID",
"migrations_dir": "migrations"
}]
Remote migrations (production, after each migrations/ change):
pnpm db:migrate:remote
R2 Object Storage
- Dashboard → R2 → Create bucket
- Note the bucket name →
wrangler.jsonc→r2_buckets - Optional: Settings → Public access → custom domain →
R2_PUBLIC_URL - Manage R2 API Tokens → create Read/Write token →
R2_ACCESS_KEY_ID/R2_SECRET_ACCESS_KEY
Good to know
The R2 binding in
wrangler.jsoncis for in-Worker access. Admin S3 signed uploads still need API token env vars.
KV Namespace (Short Links)
pnpm wrangler kv namespace create LINKS
"kv_namespaces": [{ "binding": "LINKS", "id": "YOUR_KV_ID" }]
Queues (Email & Workflows)
pnpm wrangler queues create email-campaign-queue
pnpm wrangler queues create workflow-queue
Names must match queues.producers / consumers in wrangler.jsonc.
Custom Domain
- Workers & Pages → your Worker → Domains & Routes
- Add
example.com,www.example.com - Update env vars:
BETTER_AUTH_URLSERVER_URLVITE_SITE_URL
- Short-link subdomain (e.g.
go.example.com) needs separate DNS andVITE_SHORT_LINK_BASE_URL
Cron
The project includes a monthly Cron (wrangler.jsonc → triggers.crons). After deploy, confirm triggers in the Dashboard.