e520ff8bc5d53a637c478f98b8196bd68d0b1748
Scrum Solitare
Enterprise-style Scrum Poker application using Go, Gin, and SSE for real-time room updates.
Highlights
- Go backend with layered architecture (
handlers,state,routes,config) - Memory-first room state with disk synchronization to JSON files
- Real-time updates via Server-Sent Events (SSE)
- Strict state sanitization: unrevealed votes from other users are never broadcast
- Backend authorization for admin-only actions (
reveal,reset) - Themeable frontend with:
- CSS architecture split into
main.css,layout.css, and/themes/* - Theme options:
win98(default),modern,No Theme - Light/Dark mode independent from active theme
- Desktop taskbar controls + mobile top controls for theme/mode switching
- Config page and card deck preview
- Drag-and-drop card ordering
- Card add/remove with animation completion handling
- Room password option
- Room interface with voting area, participants, and admin controls
- CSS architecture split into
- Username persistence through
localStorage
Project Layout
src/main.go: app bootstrapsrc/config/: environment configurationsrc/server/: Gin engine setupsrc/routes/: page/api route registrationsrc/handlers/: HTTP handlers (pages + API + SSE)src/state/: in-memory room manager, sanitization, persistencesrc/middleware/: static cache headers middlewaresrc/models/: template page data modelssrc/templates/: HTML templates (index.html,room.html)static/css/main.css: shared component primitivesstatic/css/layout.css: grids/flex/positioning/responsive layoutstatic/css/themes/: drop-in theme filesstatic/js/ui-controls.js: global theme + mode enginestatic/js/: page logic (config.js,room.js)
Environment Variables
PORT: server port (default8002)DATA_PATH: directory for room JSON files (default./data)
Run Locally
go mod tidy
go run ./src
Open http://localhost:8002.
Docker
Build:
docker build -t scrum-solitare .
Run:
docker run --rm -p 8002:8002 -e DATA_PATH=/app/data scrum-solitare
Real-Time Flow (SSE)
- Client joins room via
POST /api/rooms/:roomID/join - Client subscribes to
GET /api/rooms/:roomID/events?participantId=... - Server broadcasts sanitized room state updates on critical mutations:
- room creation
- join/leave
- vote cast
- reveal
- reset
Description
Languages
JavaScript
33%
HTML
25.6%
Go
25%
CSS
16%
Dockerfile
0.4%