On-demand video capture of physical locations. A two-sided marketplace where Customers request video of a place and Capturers (mobile creators) fulfill those requests, plus a Twitch-style Live mode where capturers broadcast publicly and viewers tip / subscribe.
| Layer | Tech |
|---|---|
| Frontend | Jekyll → GitHub Pages (site/) |
| API | Cloudflare Workers (Hono router) (workers/api/) |
| Database | Cloudflare D1 (SQLite) |
| Storage | Cloudflare R2 |
| Video | Cloudflare Stream (live + VOD) |
| Sessions | Cloudflare KV |
| Real-time | Durable Objects (workers/matching-do/, workers/live-channel-do/) |
| Background | Cloudflare Queues |
| Payments | Stripe Connect (Express) |
GitHub Pages serves zero dynamic content. Every dynamic interaction is
fetch() from the static page to a Worker endpoint that returns JSON.
flickbolt/
├── site/ # Jekyll site → GitHub Pages
├── workers/
│ ├── api/ # main API worker (Hono)
│ ├── matching-do/ # Durable Object for matching (Phase 6)
│ ├── live-channel-do/ # Durable Object for live chat (Phase 9)
│ ├── shared/ # cross-worker helpers
│ └── migrations/ # D1 SQL migrations
└── .github/workflows/ # CI: jekyll.yml + workers-deploy.yml
cd site
bundle install
bundle exec jekyll serve --host 0.0.0.0 --port 5000 --livereload
cd workers/api
npm install
echo 'JWT_SECRET="dev-secret-change-me"' > .dev.vars
npx wrangler d1 migrations apply flickbolt_db --local
npx wrangler dev
attached_assets/Pasted--FlickBolt-Build-Specification-...txt.flickbolt and push.flickbolt.com) — optional but recommended for cookie-based auth.wrangler loginwrangler d1 create flickbolt_db → paste database_id into workers/api/wrangler.tomlwrangler kv:namespace create flickbolt-sessions → paste id into wrangler.tomlwrangler r2 bucket create flickbolt-mediawrangler secret put JWT_SECRET (use a long random string)CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID.main. The two workflows deploy independently.Acceptance for Sprint 1 (per spec):
flickbolt.com shows the FlickBolt landing page. ✅ (locally on Replit)curl https://flickbolt-api.guillaumelauzier.workers.dev/health returns {"ok":true}. ✅ (live)
api.flickbolt.com is optional and waiting on DNS.