Anonymous live votes for community talks. The audience votes on phones. The co-chairs see the totals and cue the applause.
![]() |
![]() |
![]() |
![]() |
| Join | Vote | Applause | Co-chair |
![]() |
![]() |
| Home page | Applause on the stage screen |
- Click Deploy to Cloudflare. Cloudflare copies this repository to your GitHub account and deploys it to your Cloudflare account.
- Set
ADMIN_PASSPHRASEwhen Cloudflare asks for it. Use a long random value. Co-chairs need it to create a room. - Open
https://<worker>.<subdomain>.workers.dev/admin.
If the build fails at the install step, add the build variable PNPM_VERSION = 12.4.1 in Settings > Build, then retry the build.
To change the passphrase, set a new value for the ADMIN_PASSPHRASE secret in Settings > Variables and Secrets. Rooms that exist continue to work.
The app runs on the Workers Free plan. A large event can exceed the free daily limits. If that is a risk, use the Workers Paid plan.
- Open
/adminon a phone. Enter an event name (optional) and the passphrase. Tap Create room. - Open the stage link on the projector. It shows the QR code, the event code, and the next speaker.
- Tap Share co-chair link to give control to the other co-chairs.
- For each talk: type the speaker name, tap Start talk, then Cue applause, then Next talk.
A talk lasts 10 minutes. Voting opens at 05:00 for 5 minutes. Change these values in Timing, or tap Open voting now.
- Each phone votes Keep going or Wrap it up, and can change the vote until voting closes.
- Only the co-chairs see the totals.
- The first vote from each phone shows a 👍 or 👎 reaction on the phones and the stage screen.
- One browser is one participant. There is no ticket check.
- The co-chair link gives full control. Do not show it on the projector.
- A person who guesses an 8-digit room code can open its stage screen and vote.
- Each talk accepts votes from up to 2000 phones.
- Room creation allows 10 attempts per minute from one network address.
Fork the repository, edit the value, and deploy your fork.
| Default | File |
|---|---|
| Votes per talk: 2000 | src/worker/room.ts, voteLimit |
| Room creation attempts: 10 per minute | wrangler.jsonc, ratelimits |
| Talk length and voting window | src/shared/session.ts, initialSession |
| Participant cookie life: 1 day | src/worker/http.ts, setCookie |
React and Vite on the phones. Cloudflare Workers, Durable Objects, and PartyServer on the server. TypeScript, Vitest, oxlint, and pnpm for the tooling.
Read CONTRIBUTING.md.






