Skip to content

Repository files navigation

Fast, free planning poker for agile teams

TypeScript Hono Cloudflare Workers Durable Objects License: GPL v3

Desktop view

Features

  • 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

Quick Start

pnpm install
pnpm types
pnpm test
pnpm dev

Deploy

pnpm run typecheck
pnpm test
pnpm exec wrangler deploy --dry-run
pnpm run deploy

Deploying 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.

Requirements

Project Structure

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

How It Works

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

Contributing

See CONTRIBUTING.md.

Security

See SECURITY.md.

License

Distributed under the GNU General Public License v3.0. See LICENSE for details.

Acknowledgments

Author

Chris Butler — github.com/notchrisbutler

About

Pointing session for agile teams via WebSocket. Ran on CF Workers

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages