๐ฎ Multiplayer Scrum Poker RPG
May 16, 2026 ยท View on GitHub
A multiplayer scrum poker estimation game with a nostalgic JRPG aesthetic that gamifies story point estimation. Players create or join lobbies, select fantasy avatar classes, and estimate tickets by "battling" pixel art bosses in real-time combat scenarios.

๐ Features
๐ฏ Core Gameplay
- Multiplayer Lobbies: Support for up to 32 players with unique invite codes
- Recurring Meeting Rooms: Bookmarkable URLs for daily standups and recurring scrum sessions
- Avatar Classes: Choose from 10 classes โ Ranger, Rogue, Bard, Sorcerer, Wizard, Warrior, Paladin, Cleric, Oathbreaker, and Monk
- Boss Battles: Fight pixel art bosses that scale with ticket complexity
- Real-time Combat: Live projectile attacks with visual effects and sound
- Team-based Mechanics: Developers, QA, and Spectators with different roles
โ๏ธ Combat System
- Spectator vs Team Combat: Spectators attack developers/QA instead of bosses
- Revival Mechanics: Proximity-based player revival system
- Jumping Dodge: Invincibility frames during jump animations
- Boss Ring Attacks: Devastating area-of-effect attacks from bosses
- Health & Damage: Strategic combat with HP management
๐จ Visual & Audio
- Retro JRPG Aesthetic: Pixel art style with nostalgic animations
- 3D Avatar Models: React Three Fiber-powered character rendering
- Dynamic Audio: Background music, hit effects, and ambient sounds
- Persistent Audio Preferences: Mute settings automatically saved across sessions
- Visual Effects: Attack animations, damage numbers, and particle effects
๐ง Technical Features
- Real-time Sync: Socket.IO for instant multiplayer updates
- Cross-platform: Works on desktop and mobile devices
- TypeScript: Fully typed codebase with strict type checking
- Hot Reload: Development server with instant updates
๐ ๏ธ Technology Stack
Frontend
- React 18 - Modern UI framework with hooks and concurrent features
- TypeScript - Static type checking and enhanced developer experience
- Vite - Fast build tool with HMR and modern bundling
- Tailwind CSS - Utility-first CSS framework with custom retro theming
- React Three Fiber - 3D graphics and avatar rendering
- Zustand - Lightweight state management
- Radix UI - Accessible component primitives
Backend
- Express.js - Web application framework
- Socket.IO - Real-time bidirectional communication
- TypeScript - Server-side type safety
- Drizzle ORM - Type-safe database queries and migrations
Database & Storage
- PostgreSQL - Primary database (via postgres.js driver)
- Session Store - Express sessions with PostgreSQL backend
- In-memory Cache - Game state management for real-time performance
Development Tools
- ESBuild - Fast JavaScript bundler for production
- PostCSS - CSS processing and optimization
- Drizzle Kit - Database schema management and migrations
- ESLint - Code linting with TypeScript and React rules
- Vitest - Unit and integration testing
- Playwright - End-to-end browser testing
Infrastructure & DevOps
- Kubernetes - Container orchestration with Kustomize overlays
- ArgoCD - GitOps continuous deployment
- Prometheus + Grafana - Metrics and dashboards
- Loki + Promtail - Log aggregation
- cert-manager - Automatic TLS certificates
- Sealed Secrets - Encrypted secrets in Git
- Pino - Structured JSON logging
๐ Prerequisites
- Node.js >= 18.0.0
- npm or yarn package manager
- PostgreSQL database (optional โ defaults to in-memory storage)
๐ Installation & Setup
1. Clone the Repository
git clone <repository-url>
cd multiplayer-scrum-poker-rpg
2. Install Dependencies
npm install
3. Environment Configuration (Optional)
Create a .env file in the root directory for database features:
# Database Configuration (Optional - defaults to in-memory storage)
DATABASE_URL="postgresql://username:password@localhost:5432/scrum_poker"
# Session Configuration
SESSION_SECRET="your-super-secret-session-key"
# Server Configuration (optional)
PORT=5000
NODE_ENV=development
Note: The game works out-of-the-box with in-memory storage. PostgreSQL is only required for persistent sessions and user data.
4. Database Setup (Optional)
# Only needed if using PostgreSQL instead of in-memory storage
npm run db:push
5. Start Development Server
npm run dev
The application will be available at http://localhost:5000
๐ฎ How to Play

1. Create or Join a Lobby
- Host: Create a new lobby and receive a unique invite code
- Player: Join using a 6-character lobby code
- Teams: Choose between Developer, QA, or Spectator roles
2. Avatar Selection
- Select your fantasy class โ Ranger, Rogue, Bard, Sorcerer, Wizard, Warrior, Paladin, Cleric, Oathbreaker, or Monk
- Each class has unique projectile types and visual styles
- 3D avatar preview with character details
3. Battle Phase
- Developers & QA: Attack the boss by clicking/tapping
- Spectators: Attack nearby team members instead of the boss
- Dodging: Press Space to jump and gain invincibility frames
- Revival: Stand near downed teammates to revive them
4. Scoring & Estimation
- Submit story point estimates using Fibonacci sequence
- Teams must reach consensus to defeat the boss
- Progress through multiple tickets/levels
5. Boss Mechanics
- Health Scaling: Boss HP scales with ticket complexity
- Ring Attacks: Bosses occasionally fire circular projectile patterns
- Phase System: Multiple phases per boss encounter
๐น๏ธ Controls
| Action | Control |
|---|---|
| Move | WASD or Arrow Keys |
| Attack | Left Click / Tap |
| Jump/Dodge | Spacebar |
| Keyboard Attack | Ctrl |
| Debug Info | Tab |
| Audio Toggle | In-game controls |
๐๏ธ Project Structure
โโโ client/ # Frontend React application
โ โโโ public/ # Static assets and textures
โ โโโ src/
โ โ โโโ components/ # React components
โ โ โ โโโ game/ # Game-specific components
โ โ โ โโโ ui/ # Reusable UI components
โ โ โโโ lib/ # Utilities and stores
โ โ โ โโโ stores/ # Zustand state management
โ โ โโโ hooks/ # Custom React hooks
โ โ โโโ styles/ # CSS and styling
โโโ server/ # Backend Express application
โ โโโ gameState.ts # Core game logic and state management
โ โโโ websocket.ts # Socket.IO event handlers
โ โโโ routes.ts # REST API endpoints
โ โโโ index.ts # Server entry point
โโโ shared/ # Shared types and utilities
โ โโโ gameEvents.ts # WebSocket event definitions
โ โโโ schema.ts # Database schema
โโโ package.json # Project dependencies and scripts
๐ง API Documentation
WebSocket Events
Client โ Server
create_lobby- Create a new game lobbyjoin_lobby- Join existing lobby with codeselect_avatar- Choose character classattack_boss- Deal damage to bossattack_player- Spectator attacks on playersplayer_jump- Jumping state synchronizationsubmit_score- Submit story point estimate
Server โ Client
session:*- Fine-grained lobby/phase events (e.g.session:phase_changed,session:tickets_updated)combat:*- Boss/player combat events (e.g.combat:boss_damaged,combat:player_damaged)estimation:*- Voting and discussion events (e.g.estimation:vote_cast,estimation:votes_revealed)boss_attacked- Boss damage notificationsboss_ring_attack- Boss area-of-effect attacksplayer_attacked- Player damage eventsscores_revealed- Estimation results
REST Endpoints
GET /api/health- Server health checkPOST /api/lobbies- Create lobby via RESTGET /api/lobbies/:id- Get lobby information
๐จ Customization
Adding New Avatar Classes
- Add class definition to
shared/gameEvents.ts - Create avatar assets in
client/public/images/orclient/src/assets/ - Update avatar selection UI in
AvatarSelection.tsx - Add projectile emoji mapping in
PlayerController.tsx
Creating New Boss Types
- Add boss sprite to
client/public/textures/ - Update boss creation logic in
server/gameState.ts - Implement custom attack patterns if needed
Audio Customization
- Add sound files to
client/public/sounds/ - Update audio store in
client/src/lib/stores/useAudio.tsx - Configure audio triggers in game components
๐งช Development
Available Scripts
# Development
npm run dev # Start development server
npm run build # Build for production
npm run start # Start production server
npm run check # TypeScript type checking
# Testing
npm test # Run unit/integration tests
npm run test:watch # Watch mode
npm run test:coverage # With coverage report
npm run test:e2e # Run Playwright E2E tests
npm run test:e2e:ui # E2E tests with UI
# Code Quality
npm run lint # Run ESLint
npm run lint:fix # Fix auto-fixable issues
# Database
npm run db:push # Update database schema
# Releases
npm run release # Auto-determine version bump
npm run release:patch # Patch release (x.x.X)
npm run release:minor # Minor release (x.X.0)
npm run release:major # Major release (X.0.0)
Development Tools
- Hot Reload: Automatic browser refresh on file changes
- TypeScript: Strict type checking with immediate feedback
- Error Overlay: Runtime error display in development
- Debug Modal: In-game debug information (Tab key)
Testing
- Unit/Integration:
npm testruns Vitest suite (700+ tests) - E2E:
npm run test:e2eruns Playwright browser tests - Coverage:
npm run test:coveragegenerates coverage report
Testing the Game
- Open multiple browser tabs/windows
- Create a lobby in one tab (host)
- Join with the invite code in other tabs
- Test multiplayer interactions and combat
๐ค Contributing
We welcome contributions! See CONTRIBUTING.md for complete guidelines, including:
- Development setup and prerequisites
- Code style and commit conventions (Conventional Commits)
- Pull request process
- Asset contribution guidelines
- Developer Certificate of Origin (DCO)
๐ License
Scrum Monsters uses a dual-licensing approach:
| Component | License |
|---|---|
| Code (client, server, shared) | GNU AGPL-3.0-or-later |
| Art & Media (sprites, sounds, images) | CC BY-NC-ND 4.0 |
| Commercial Add-ons | Proprietary EULA |
See LICENSE.md for complete details, TRADEMARKS.md for trademark information, and NOTICES.md for third-party attributions.
For commercial licensing inquiries: licensing@scrummonsters.com
๐ Acknowledgments
- Retro Gaming Community - Inspiration for pixel art aesthetics
- Agile Development Teams - Real-world scrum poker insights
- Open Source Libraries - Amazing tools that made this possible
๐ Support
For questions, bug reports, or feature requests:
- Open an issue on GitHub
- Check existing documentation
- Review the troubleshooting guide
๐ข Kubernetes Deployment
Scrum Monsters includes full Kubernetes deployment support with environment overlays.
Quick Start
# Deploy to development
kubectl apply -k k8s/overlays/dev
# Deploy to staging
kubectl apply -k k8s/overlays/staging
# Deploy to production
kubectl apply -k k8s/overlays/prod
Infrastructure Components
# Install Sealed Secrets controller
kubectl apply -k k8s/infrastructure/sealed-secrets
# Install cert-manager for TLS
kubectl apply -k k8s/infrastructure/cert-manager
# Install monitoring stack (Prometheus, Grafana, Loki)
kubectl apply -k k8s/infrastructure/monitoring
# Install ArgoCD for GitOps
kubectl apply -k k8s/infrastructure/argocd
Directory Structure
k8s/
base/ # Shared manifests
overlays/
dev/ # Development (1 replica, debug logging)
staging/ # Staging (2 replicas, TLS)
prod/ # Production (3+ replicas, full TLS)
infrastructure/
sealed-secrets/ # Bitnami Sealed Secrets
cert-manager/ # Let's Encrypt certificates
monitoring/ # Prometheus + Grafana + Loki
argocd/ # GitOps deployment
argocd-apps/ # ArgoCD Application manifests
See k8s/README.md for detailed deployment instructions.
๐ Observability
Metrics Endpoint
The app exposes Prometheus metrics at /metrics:
scrumquest_active_lobbies- Current lobby countscrumquest_active_players- Current player countscrumquest_websocket_connections- WebSocket connectionsscrumquest_votes_submitted_total- Vote submissions by teamhttp_request_duration_seconds- Request latency histogram
Structured Logging
Logs are JSON-formatted in production using Pino:
{"level":"info","time":"2026-02-02T...","component":"game","lobbyCode":"ABC123","event":"player_joined"}
Set log level via LOG_LEVEL environment variable (trace, debug, info, warn, error).
Made with โค๏ธ for agile teams who love games