send_email binding for transactional emails. The entire
stack fits within Cloudflare's free tier for most conference workloads.┌──────────────────────── Cloudflare Worker ────────────────────────┐ │ │ │ Spiceflow app (React Server Components) │ │ ├── Admin dashboard /org/:orgId/e/:eventId/* │ │ ├── Public CFP /submit/:eventSlug/:formSlug │ │ ├── Speaker portal /portal/:eventSlug/* │ │ ├── Embeds /embed/:eventSlug/* │ │ ├── API /api/auth/* (BetterAuth) │ │ └── Cron close forms, reminders, outbox drain │ │ │ └────────┬──────────────┬──────────────┬────────────────────────────┘ │ │ │ v v v D1 database R2 bucket send_email binding (SQLite) (files) (transactional mail)
123git clone https://github.com/remorses/opensession cd opensession pnpm install
123cd website npx wrangler d1 create opensession-db npx wrangler r2 bucket create opensession-files
wrangler.jsonc with your database ID.https://your-domain.com/api/auth/callback/google123npx wrangler secret put BETTER_AUTH_SECRET npx wrangler secret put GOOGLE_CLIENT_ID npx wrangler secret put GOOGLE_CLIENT_SECRET
BETTER_AUTH_URL to your production domain (e.g. https://opensession.dev).1pnpm db:migrate:remote
1pnpm deploy
123cd website pnpm db:migrate:local pnpm dev
.env or .dev.vars files.| Resource | Production | Preview |
| Worker | opensession-website | opensession-website-preview |
| Domain | opensession.dev | preview.opensession.dev |
| D1 | opensession-db | opensession-preview-db |
| R2 | opensession-files | Shared |
| Resource | Free tier limit |
| Worker requests | 100,000 / day |
| D1 reads | 5 million / day |
| D1 writes | 100,000 / day |
| D1 storage | 5 GB |
| R2 storage | 10 GB |
| R2 operations | 10 million reads, 1 million writes / month |
| Email sending | 100 / day (on Workers Paid, higher limits) |