Real-time planning poker built with Phoenix LiveView. No database required.
- Real-time voting with WebSocket sync
- Multiple card presets (Fibonacci, T-Shirt, Powers of 2, etc.)
- Player and Spectator roles
- Vote statistics (avg, min, max)
- Round history (last 10 rounds)
- Room link sharing with clipboard copy
- Results export as Markdown
- Phoenix 1.8 + LiveView 1.1 - Real-time UI without JavaScript
- GenServer - In-memory room state (no database)
- PubSub + Presence - Real-time synchronization
- Tailwind CSS + daisyUI - Modern UI components
┌─────────────────────────────────────────────────────────────┐
│ Supervision Tree │
├─────────────────────────────────────────────────────────────┤
│ Application │
│ ├── PubSub (message broadcasting) │
│ ├── Registry (room process lookup) │
│ ├── RoomSupervisor (DynamicSupervisor) │
│ │ └── RoomServer (1 GenServer per room) │
│ ├── Presence (online user tracking) │
│ └── Endpoint (HTTP/WebSocket) │
└─────────────────────────────────────────────────────────────┘
Browser ←──WebSocket──→ LiveView ←──PubSub──→ RoomServer (GenServer)
↑ │
└───── broadcast ───────┘
- LiveView handles UI events (
phx-click,phx-submit) - RoomServer manages room state (players, votes, history)
- PubSub broadcasts state changes to all connected clients
- Presence tracks online users per room
lib/
├── planning_poker/
│ ├── application.ex # Supervision tree
│ └── rooms/
│ ├── room.ex # Room state struct & logic
│ ├── room_server.ex # GenServer (1 per room)
│ └── room_supervisor.ex # DynamicSupervisor
└── planning_poker_web/
├── live/
│ ├── lobby_live.ex # Room creation/joining
│ └── room_live.ex # Main game UI
├── presence.ex # Phoenix.Presence
└── router.ex # Routes: /, /room/:id
Prerequisites: Elixir 1.16+, Erlang/OTP 26+
# Install dependencies
mix setup
# Start server
mix phx.serverVisit localhost:4000
# Run tests
mix test
# Format code
mix formatMIT License - see LICENSE file for details.