Feature Overview¶
A comprehensive look at everything MatchZy Auto Tournament can do.
Tournament Management¶
Bracket Generation¶
Supported Formats:
| Format | Teams/Players | Matches | Description |
|---|---|---|---|
| Single Elimination | 2-128 teams | ~N | One loss = eliminated |
| Double Elimination | 2-128 teams | ~2N | Two losses = eliminated |
| Round Robin | 2-32 teams | N(N-1)/2 | Everyone plays everyone |
| Swiss | 4-64 teams | ~log₂(N) rounds | Similar records face off |
| Shuffle Tournament | 10+ players | Dynamic | Individual competition, teams reshuffled each round |
Features:
- ✅ Automatic bye handling for non-power-of-two team counts
- ✅ Smart seeding (random or manual)
- ✅ Walkover support (missing team advances opponent)
- ✅ Third-place match (optional)
- ✅ Bracket regeneration without losing tournament
Tournament Lifecycle¶
States:
-
Setup → Configuring tournament and teams
-
Add teams
- Select format and map pool
-
Can modify teams
-
Ready → Bracket generated, waiting to start
- Bracket preview available
- Can regenerate bracket
- In Progress → Tournament active, matches running
- Matches automatically progress
-
Real-time updates
-
Tournament title can be renamed (settings remain locked)
-
Completed → All matches finished
- Final results available
- Demos ready for download
Match System¶
Match Statuses¶
Pending → Match created but tournament not started
Ready → Tournament started, waiting for veto or server
Loaded → On server, warmup mode, players connecting
Live → Match in progress, rounds being played
Completed → Winner determined, bracket updated
Shuffle tournaments (no veto)
Shuffle tournaments skip the map veto phase entirely. Matches are still created with statuspending, but once the tournament is started they behave like the “waiting for server” cases below (no "VETO PENDING" or veto-related messaging).
Intelligent Match Status Messages¶
The system shows context-aware status messages:
| Status | Condition | Message |
|---|---|---|
| Pending | Tournament not started | "Waiting for tournament to start..." |
| Pending | Veto not complete | "VETO PENDING" / "Waiting for map veto to begin..." |
| Pending/Ready | Veto complete, no server | "WAITING FOR SERVER" / "Veto complete - Waiting for server assignment..." |
| Ready | Server assigned, not loaded | "READY" |
| Loaded | 0 players | "WARMUP" / "Server ready - Waiting for players (0/10)" |
| Loaded | Some players | "WARMUP" / "Waiting for players (3/10)" |
| Loaded | All players | "WARMUP" / "All players connected - Waiting for ready up" |
| Live | - | "LIVE" / "Match in progress" |
For shuffle tournaments, the system automatically treats veto as completed (since there is no voting step), so once the tournament is started and no server is assigned yet, pending/ready matches go straight to the “WAITING FOR SERVER” variants rather than showing any veto-related messages.
Real-Time Features¶
WebSocket Events¶
Frontend automatically updates when:
- 🔄 Match status changes (pending → ready → loaded → live → completed)
- 🔄 Players connect/disconnect
- 🔄 Players ready/unready
- 🔄 Veto actions happen (ban, pick, side selection)
- 🔄 Tournament state changes (starts, completes)
- 🔄 Bracket updates (winners determined)
No page refresh required!
Player Connection Tracking¶
Shows live roster of all 10 players with status:
- ✅ Offline — Player not connected (gray)
- ⚠️ Connected — Player joined, not ready (yellow)
- ✅ Ready — Player typed
.ready(green)
Tracked via events:
player_connect→ Add to rosterplayer_disconnect→ Remove from rosterplayer_ready→ Mark as readyplayer_unready→ Mark as not ready
Server Management¶
Auto Server Allocation¶
When tournament starts or veto completes:
- System attempts to find available servers (online + not in use)
- If server available: Allocates immediately
- If no server available: Backend polls every 10 seconds for available servers
- Allocates server to match when found
- Generates match config with teams and maps
- Sends RCON:
matchzy_loadmatch_url "http://api/matches/{slug}.json" - Configures webhook:
matchzy_remote_log_url "http://api/events/{slug}" - Configures demo upload
- Match goes to warmup
- Updates sent via WebSocket — teams see server info automatically
Waiting for Server
If all servers are busy, matches show "WAITING FOR SERVER" status. The system automatically checks every 10 seconds and assigns servers as they become available. No manual intervention needed!
All automatic!
Server Status Monitoring¶
- RCON Heartbeat: Periodic status checks
- Match Tracking: Which match is on which server
- Auto-Config: Webhook configured on status check
- Health Indicators: Online/offline status with colors
Event Processing¶
25+ MatchZy Events Processed¶
Player Events:
player_connect,player_disconnectplayer_ready,player_unreadyplayer_death,round_mvp
Match Phase Events:
series_start,series_endgoing_live,warmup_endedknife_round_started,knife_round_endedhalftime_started,overtime_started
Round Events:
round_started,round_endbomb_planted,bomb_defused,bomb_exploded
Pause Events:
match_paused,unpause_requested,match_unpaused
Admin Events:
side_swap,backup_loaded
All events:
- ✅ Logged to console
- ✅ Stored in database (
match_eventstable) - ✅ Logged to files (
data/logs/events/) - ✅ Broadcast via WebSocket
- ✅ Trigger appropriate service updates
Admin Controls¶
Live Match Controls¶
Available during warmup/live:
- ▶️ Start match (force start)
- 🔄 Restart match
- ⏸️ Pause match (admin pause - players can't unpause)
- ▶️ Unpause match
- 💬 Broadcast message
- 🔄 Restore backup (specific round)
- 🗺️ Change map
- 🔀 Swap teams
- ⏭️ Skip veto
- 🔪 Toggle knife round
- ⏱️ Add time
- 🏁 End match
- 👥 Add backup player (new!)
Backup Player System¶
How it works:
- Admin opens match modal
- Scrolls to "Add Backup Player"
- Types player name in autocomplete search
- Selects player from dropdown (shows all tournament players)
- Chooses target team (Team 1 or Team 2)
- Clicks "Add Player to Match"
Backend sends RCON:
Features:
- ✅ Searches across all teams in tournament
- ✅ Filters out players already in match
- ✅ Shows player's original team
- ✅ Real-time autocomplete
- ✅ Requires player to reconnect after adding
Demo Recording¶
Automatic Demo Upload¶
MatchZy automatically uploads demos when matches complete:
Backend endpoint: POST /api/demos/{matchSlug}/upload
Features:
- ✅ Streaming upload (doesn't load entire file into memory)
- ✅ Match-specific folders (
demos/{matchSlug}/) - ✅ Original filename preserved
- ✅ Metadata from headers (map number, match ID)
Demo Download¶
Admins can download demos from:
- Match Details modal
- Match History page
- API:
GET /api/demos/{matchSlug}/download
Team Experience¶
Public Team Pages¶
URL Format: /team/{team-id}/match
No login required — teams access via shared link
Features:
- 🎮 Current match info (opponent, round, status)
- 🗺️ Map veto interface (BO1/BO3/BO5)
- 🖥️ Server connection details (IP, port, connect command)
- 📊 Live player status (who's connected, who's ready)
- 📈 Team statistics (wins, losses, win rate)
- 📜 Match history (past opponents and scores)
- 🔊 Sound notifications (customizable)
Sound Notifications¶
8 Available Sounds:
- Notification (default)
- Alert
- Bell
- Chime
- Ding
- Ping
- Pop
- Success
Controls:
- 🔊 Volume slider
- 🔇 Mute toggle
- 🎵 Sound preview
- 💾 Persists per browser
Plays when: Match status changes to "loaded" or "live"
Monitoring & Debugging¶
Server Events Monitor¶
Admin Tools → Server Events Monitor
Shows unfiltered stream of all MatchZy events from all servers:
- ✅ Last 100 events buffered
- ✅ Real-time WebSocket updates
- ✅ Color-coded by event type
- ✅ Full JSON payload display
- ✅ Pause/resume streaming
- ✅ Server filter (optional)
Perfect for debugging:
- Verify events are being sent
- Check player Steam IDs
- Monitor match progression
- Identify configuration issues
Event File Logging¶
All events logged to: data/logs/events/{serverId}/{date}.log
Retention: 30 days
Format: JSON lines
Use case: Historical analysis, debugging, recovery
Maps & Map Pools¶
Custom Map Management¶
Features:
- ✅ Automatic map import - Latest maps imported from GitHub on first start
- ✅ Add custom maps with Map ID and display name
- ✅ Upload map images or fetch from GitHub automatically
- ✅ Edit map details (display name, image)
- ✅ Delete unused maps
Automatic Import:
- Fetches maps from CS2 Server Manager repository
- Imports all
de_,cs_, andar_maps automatically - Creates map pools by type (Defusal, Hostage, Arms Race)
- Runs on first start or when maps table is empty
Map Pool System¶
Create Reusable Pools:
- ✅ Build custom map pools for different tournament types
- ✅ Active Duty pool (7 competitive maps) always available
- ✅ Automatic pools - Defusal only, Hostage only, and Arms Race only pools created automatically
- ✅ Select pools during tournament creation
- ✅ Save custom selections as new pools
Tournament Integration:
- Select from Active Duty, custom pools, or create custom selection
- System validates 7 maps required for veto formats (BO1/BO3/BO5)
- Map pools used in Round Robin/Swiss for rotation
📖 Managing Maps — Complete guide to maps and map pools
Players, Ratings & Shuffle Tournaments¶
Global Player System¶
- ✅ Players page – Central directory of all players with name, avatar, Steam ID, and current ELO
- ✅ Team integration – Team import and team editing automatically create/link players (single source of truth)
- ✅ Public player pages –
/player/:steamIdwith ELO history, match history, performance metrics, and current/next match info including server connect details - ✅ Find Player flow –
/playersearch by Steam URL/ID
OpenSkill-Based Rating Engine¶
- ✅ OpenSkill-backed ratings – Bayesian rating with FaceIT-style ELO scale for all tournament types
- ✅ Global Skill Rating system – Single Skill Rating per player (default ~1500 from OpenSkill), shared across all tournaments and matches
- ✅ Per-match rating updates – Ratings update automatically when matches complete
- ✅ Rating history –
player_rating_historytracks before/after ELO and OpenSkill values per match
ℹ️ Background reading
- OpenSkill: modern Bayesian rating system for teams and games – see the official docs at openskill.me.
- ELO-style ratings: classic chess-inspired rating model; we present OpenSkill results as an ELO-like number so it feels familiar.
- Bayesian ratings vs. simple ELO: Bayesian systems (like TrueSkill/OpenSkill) handle uncertainty and team games better than naive win–loss ELO.
ELO Calculation Templates¶
- ✅ ELO templates – Define how stats (ADR, K/D, assists, utility, MVPs, etc.) adjust base ELO
- ✅ Per-tournament configuration – Select template per tournament or use pure win/loss mode
- ✅ Stat storage – Detailed per-match stats stored in
player_match_statsand surfaced on player pages
Shuffle Tournament Mode¶
- ✅ Shuffle tournament format – Individual player competition with teams reshuffled every round
- ✅ Automatic team balancing – Greedy + optimization algorithm balances teams by updated ELO each round
- ✅ Automatic rounds – System generates matches, detects round completion, reshuffles teams, and advances
- ✅ Player leaderboard – Tournament-specific leaderboard sorted by wins → ELO → ADR with public leaderboard page
- ✅ Player-centric match access – Players can keep their
/player/:steamIdpage open to always see their current/next shuffle match and server connect info (no per-round team links needed)
Next Steps¶
- 🗺️ Managing Maps — Maps and map pools guide
- 🎮 Map Veto System — Interactive pick/ban flow
- 📖 Running Matches — Match management guide
- 🎯 First Tournament — Step-by-step tutorial