Fast, free planning poker for agile teams
- No login required — jump in with a name or get a random emoji identity
- Real-time WebSocket sync — votes and round state update instantly for all players
- Mobile-friendly reconnects — brief network drops preserve identity and votes for 30 seconds
- Idle cleanup — sessions expire after one hour without a join or successful round action
- Strict round flow — start, vote, reveal, select a final vote, and begin the next round
- Fresh rounds — every new round clears the previous votes
- Final vote selection — pick the agreed estimate after reveal
- Shared controls — every participant can advance the round
- Dark mode — automatic via
prefers-color-scheme - Hibernate-safe — player state survives Durable Object hibernation
pnpm install
pnpm types
pnpm test
pnpm devpnpm run typecheck
pnpm test
pnpm exec wrangler deploy --dry-run
pnpm run deployDeploying the SQLite-backed PokerSessionSqlite class resets active session state from the legacy Durable Object class. This is acceptable for Pointr because sessions are ephemeral and do not represent durable business records.
CI/CD is configured via GitHub Actions — pushes to main automatically deploy when source files change.
- Node.js 18+
- Wrangler CLI 4+
- A Cloudflare account (free tier works)
src/
index.ts — Hono app, routes, and Durable Object export
browser/
home.ts — browser behavior served as /home.js
session.ts — session behavior served as /client.js
session/
durable-object.ts — WebSocket command orchestration
protocol.ts — validated commands and shared round types
round.ts — pure round lifecycle and validation rules
players.ts — identity, votes, sockets, and reconnect state
persistence.ts — Durable Object storage and alarm scheduling
identity.ts — canonical participant naming
id.ts — public session ID validation and normalization
pages/
home.ts — Home page template (create/join)
session.ts — Session page template (poker table)
docs/
plans/ — Design and implementation docs
.github/
workflows/
deploy.yml — GitHub Actions deploy to Cloudflare Workers
Each session is backed by a Cloudflare Durable Object that persists the current round, restores connected players from WebSocket attachments, and manages the shared state machine. Disconnected players remain eligible to reconnect for 30 seconds, with an alarm removing them after the grace period. The same alarm expires and deletes a session after one hour without a join or successful round action. Every participant has the same controls. The server validates each command and broadcasts the resulting session state — no polling or client-owned lifecycle state.
| Route | Description |
|---|---|
GET / |
Home page — create or join a session |
POST /create |
Creates a session with a random 5-char lowercase alphanumeric ID |
GET /:id |
Session page for a valid 5-char alphanumeric ID; invalid IDs redirect to /, mixed-case IDs normalize to lowercase |
GET /ws/:id |
WebSocket upgrade for a valid 5-char alphanumeric ID; invalid IDs are rejected before Durable Object routing |
See CONTRIBUTING.md.
See SECURITY.md.
Distributed under the GNU General Public License v3.0. See LICENSE for details.
- Hono — lightweight web framework for Cloudflare Workers
- Cloudflare Workers — edge runtime and Durable Objects
- Claude Code — development assistance
Chris Butler — github.com/notchrisbutler