A mobile-first, real-time approval-voting app for deciding what to do together. Create a room with any URL path, share it or its QR code, add ideas, and vote.
Live app: lets-pick-together.adamholter.chatgpt.site
- Any URL path becomes its own room
- Exact-URL sharing and QR codes
- Live room presence with conflict-free character avatars
- Optional profile-photo uploads
- Shared room types: thing, song, question, person, or place
- Mobile-first ballot UI
- Cloudflare D1 persistence and R2 image storage
Requires Node.js 22.19 or newer.
npm install
npm run devThen open the local URL printed by the development server. Use any path, such
as /friday-night, to create a room.
Useful commands:
npm run build
npm test
npm run db:generateLocal D1 and R2 bindings are simulated by the Cloudflare Vite plugin. Database
migrations live in drizzle/.
The app is built with Next.js, vinext, Cloudflare Workers, D1, and R2. The
included .openai/hosting.json uses logical bindings only; connect it to your
own Sites project before deploying.
The app uses anonymous browser-generated IDs for presence. Uploaded profile
pictures are limited to JPG, PNG, or WebP files under 2 MB. Do not commit
deployment credentials or environment files; .env* is ignored.
Please report vulnerabilities according to SECURITY.md.