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
MatchZy Enhanced Configurationยถ
Automatic Match Configurationยถ
The platform automatically applies MatchZy Enhanced v1.3.0 configuration (11 cvars) based on tournament type, providing enhanced match control without manual configuration.
Configuration Profiles:
| Tournament Type | Profile | Auto-Ready | Pauses | Forfeit (.gg) | FFW |
|---|---|---|---|---|---|
| Single Elimination | Official | โ Manual | 2 per team (5 min) | โ Disabled | โ 4 min |
| Double Elimination | Official | โ Manual | 2 per team (5 min) | โ Disabled | โ 4 min |
| Swiss | Official | โ Manual | 2 per team (5 min) | โ Disabled | โ 4 min |
| Round Robin | Official | โ Manual | 2 per team (5 min) | โ Disabled | โ 4 min |
| Shuffle Tournament | Shuffle | โ Auto | 1 per team (3 min) | โ Disabled | โ Disabled |
| Manual Matches | Default | โ Manual | โพ๏ธ Unlimited | โ Disabled | โ Disabled |
Features:
- Auto-Ready System โ Players automatically marked ready on connect
- Enhanced Pause Controls โ Limit pauses per team, duration, unpause requirements
- Side Selection Timer โ Enforce time limit after knife round
- Match Forfeit (.gg) โ Team surrender via vote (disabled in competitive)
- Forfeit/Walkover (FFW) โ Auto-forfeit timer when team disconnects
- Demo Recording โ Control demo recording for performance tuning
Official Profile (Competitive Tournaments):
{
"matchzy_autoready_enabled": 0, // Manual ready
"matchzy_both_teams_unpause_required": 1, // Both teams must unpause
"matchzy_max_pauses_per_team": 2, // 2 pauses per team
"matchzy_pause_duration": 300, // 5 minute limit
"matchzy_side_selection_time": 60, // 60 seconds
"matchzy_gg_enabled": 0, // No forfeits
"matchzy_ffw_enabled": 1, // Handle disconnects
"matchzy_ffw_time": 240 // 4 minutes
}
Shuffle Profile (Fast-Paced):
{
"matchzy_autoready_enabled": 1, // Auto-ready
"matchzy_max_pauses_per_team": 1, // 1 pause
"matchzy_pause_duration": 180, // 3 minutes
"matchzy_side_selection_time": 30, // Quick (30s)
"matchzy_ffw_enabled": 0 // No FFW for temp teams
}
Default Profile (Manual Matches):
{
"matchzy_autoready_enabled": 0, // Manual ready
"matchzy_max_pauses_per_team": 0, // Unlimited
"matchzy_pause_duration": 0, // No limit
"matchzy_gg_enabled": 0, // No forfeits
"matchzy_ffw_enabled": 0 // No FFW
}
Manual matches can override these defaults by providing custom cvars in the match configuration.
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