Overview
A login-free weekly venue picker for a group of friends: vote during the week, the winner is announced automatically on a schedule, and everyone rates it afterwards. The repository ships as a neutral, self-deployable template — venues, branding, and history live in each deploy's own Cloudflare D1 database, so anyone can stand up their own instance without touching the code.
How It Works
- No accounts — each phone gets a random device ID in local storage
- One vote per week, one rating per round, and one veto per month, enforced server-side
- Scheduled triggers announce the winner, open ratings, and close the round automatically
- An onboarding wizard provisions the database, writes the Worker config, and converts a local schedule into UTC crons
- Browser admin panel for venue management and per-deploy branding, behind password auth with HttpOnly session cookies
Architecture
React, TypeScript, and Vite on the front end; a TypeScript Cloudflare Worker serving the API and cron handlers; Cloudflare D1 (SQLite) for storage; and Workers Static Assets for hosting. Public endpoints cover status, branding, venues, votes, and ratings, with a separate token-authenticated admin API for scripted control. Production deploys run from a manual GitHub Actions workflow, and all instance-specific config stays gitignored so no deployment IDs or hostnames land in the repo.
