Real-time planning poker for agile teams
Translation pending
BusinessGitHub @scottwmacleodOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Real-time planning poker for agile teams. Create a room, share the link, and everyone votes on an estimate at the same time. Votes stay hidden until everyone has voted (or someone reveals them), then everyone sees the cards, a tally of each value, and any outlier votes highlighted. Supports Fibonacci and T-shirt-size decks, spectators, and renaming yourself mid-session. There are no accounts and nothing to install for players.
Live site: https://planning-poker.scottmacleod.co
app/, components/, lib/).room-server/server.ts, configured in wrangler.jsonc). Each room is one Durable Object; browsers connect to it over a WebSocket on the path /parties/main/<room id>, and it keeps the room's state and broadcasts every change to everyone in the room.See docs/adr/0001-partyserver-on-cloudflare.md for why the room server runs on Cloudflare.
You need Node.js 24 (the version in .nvmrc, which CI uses) and npm. No Cloudflare or Vercel account is needed.
git clone https://github.com/scottwmacleod/planning-poker.git
cd planning-poker
npm install
npm run dev
npm run dev starts two servers side by side:
localhost:1999, run locally by wrangler devTo check it works, open http://localhost:3000, click Create Room, enter your name and click Enter Room, then paste the room URL into a second browser window (or a private window) and join with another name. Votes in one window show up in the other.
To run the two servers in separate terminals, use npm run dev:next and npm run dev:room-server.
The only setting is where the frontend finds the room server. Copy .env.example to .env.local if you need to change it.
| Variable | Default | What it does |
|---|---|---|
NEXT_PUBLIC_ROOM_SERVER_HOST | localhost:1999 | Host of the room server, with no https://. In production this is the Cloudflare Worker host, planning-poker.square-poetry-83d1.workers.dev. |
NEXT_PUBLIC_* values are baked into the frontend at build time, so after changing one in Vercel you must redeploy.
| Command | What it does |
|---|---|
npm run dev | Start the app and the room server together |
npm test | Run the test suite once (Vitest) |
npm run test:watch | Run tests in watch mode |
npm run typecheck | Type-check the app and the room server |
npm run lint | Lint with ESLint |
npm run build | Production build of the Next.js app |
npm run cf-typegen | Regenerate room-server/worker-configuration.d.ts after changing wrangler.jsonc |
CI runs typecheck, lint, test and build, plus a dry run of the room server bundle, on every pull request. All of them must pass before a PR can merge.
main automatically, and builds a preview for each pull request. NEXT_PUBLIC_ROOM_SERVER_HOST is set in the Vercel project's environment variables.deploy-worker job in .github/workflows/ci.yml runs wrangler deploy on every push to main, after CI passes. It needs the CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID repository secrets. The Worker is served at https://planning-poker.square-poetry-83d1.workers.dev.Bug reports, feature requests and pull requests are welcome. See CONTRIBUTING.md for how to raise them, and SECURITY.md for reporting a vulnerability privately.