How to Set Up a Puck League Server (Competitive Mode, 2026)
Run Puck league games and scrims on your own server: competitive mode, teamAssignments, whitelist, passwords, period rules, admins and how many slots a 5v5 or 6v6 needs.
Updated Oct 1, 2026 · 5 min read
On this page
Puck leagues, clubs and scrim groups need a server that does three things the public lobbies do not: keep the right players on the right teams, keep everyone else out or in spectator, and run the same rules every game. A Puck dedicated server does all of it with competitive mode, teamAssignments, a whitelist and the game mode config. This guide sets up a league server from scratch, with examples for 5v5 and 6v6.
Public vs competitive mode
The server runs one of two game modes, set by gameMode in server_config.json:
| Public | Competitive | |
|---|---|---|
| Who plays | Anyone picks Blue or Red | Only Steam IDs listed under Blue and Red |
| Everyone else | Plays too | Spectates |
| Votekick | On, decided by a majority of the whole lobby | Off, only admins can kick |
| Rules file | public_game_mode_config.json |
competitive_game_mode_config.json |
| Best for | Pickup games, open club nights | League games, scrims, tournaments |
Pickup nights run fine in public mode with a password. Switch to competitive when teams must be fixed, for example a league game with a caster and a few spectators on the server.
How many slots do you need?
Every connected player counts toward maxPlayers, spectators included.
| Format | Players on the ice | Suggested slots |
|---|---|---|
| 3v3 with goalies | 8 | 12 |
| 5v5 with goalies | 12 | 12 to 16 |
| 6v6 (5 skaters and a goalie each) | 12 | 12, more for subs |
| League night with subs, referee and caster | 12 plus extras | 20 |
Admins can join a full server, so a league admin can always get in to sort things out. Memory is not the limit here: one Puck server uses about 300 MB. A fast CPU core matters more, because it has to hold the tick rate with every player on the ice.
Step 1: Lock the server down
Pick one or both:
- Password: set
"password": "YourPassword"inserver_config.json. Simple, and easy to rotate each season. - Whitelist: set
"useWhitelist": trueand list every rostered player's SteamID64 inwhitelisted_steam_ids.json:
["76561198000000000", "76561198000000001", "76561198000000002"]
The whitelist reloads as soon as you save it, so adding a new signing does not need a restart. For a league that wants the server hidden, also set "isPublic": false. Players then join with Direct Connect, see how to join a Puck server.
Step 2: Add your league admins
List admins in admin_steam_ids.json in the same format. Admins can /pause for a disconnect, /resume, /skip a phase, /start the game, send it back to /warmup, and /kick or /ban anyone. Pauses and skips are announced in chat with the admin's name, which keeps things transparent in a league game. Full list: Puck admin commands.
Step 3: Set the teams
Switch the mode in server_config.json:
"gameMode": "competitive"
Then fill in competitive_game_mode_config.json. A 6v6 example with placeholder IDs, replace them with your players' real SteamID64s:
{
"teamAssignments": {
"Blue": [
"76561198000000001", "76561198000000002", "76561198000000003",
"76561198000000004", "76561198000000005", "76561198000000006"
],
"Red": [
"76561198000000011", "76561198000000012", "76561198000000013",
"76561198000000014", "76561198000000015", "76561198000000016"
]
},
"phaseDurationMap": {
"None": 0,
"Warmup": 120,
"PreGame": 10,
"FaceOff": 4,
"Play": 600,
"BlueScore": 4,
"RedScore": 4,
"Replay": 9,
"Intermission": 60,
"GameOver": 30,
"PostGame": 10
},
"spawnDelay": 10,
"maxPeriods": 3,
"goalSlowMotion": false,
"goalieCreaseProtection": true
}
Anyone not listed joins as a spectator, which suits casters and referees. Restart the server after editing this file. Between games, swap in the next matchup's IDs and restart again.
Tips for the team lists:
- Keep the full
phaseDurationMapin the file. It replaces the built in map, so leaving phases out is asking for trouble. - Use the exact keys
BlueandRed. - Every ID is text in quotes, separated by commas, with no comma after the last one.
- If the file has an error, the server falls back to default rules and logs it. Check the log after each edit.
Step 4: Agree on the rules
These keys in the game mode file are what leagues usually standardise:
| Rule | Key | Typical league choice |
|---|---|---|
| Period length | phaseDurationMap.Play |
300 (default) to 600 seconds |
| Periods | maxPeriods |
3 |
| Warmup | phaseDurationMap.Warmup |
60 to 180 seconds |
| Intermission | phaseDurationMap.Intermission |
10 (default), longer for streamed games |
| Goal slow motion | goalSlowMotion |
Off to keep the game moving, on for streams |
| Crease protection | goalieCreaseProtection |
On, so goalies are not run over |
Write the rules down in your league's Discord, and keep the server's file matching them for every game.
Step 5: Tick rate and location
For competitive play, how the game feels comes down to the server's tick rate and its distance from players. Keep tickRate at 200, which is what Puck's own ranked servers use, and host the server in a region central to both teams. A server halfway across the world from one team is the biggest unfairness a league can introduce.
Ranked style without matchmaking
Puck's ranked matchmaking with MMR runs on the developer's own servers and cannot be run on a private server. What leagues do instead is recreate the conditions: fixed teams with teamAssignments, 200 Hz, standard periods, votekick off and admins on hand. Results and standings live in your league's own spreadsheet or bot.
The easy way
On a GamezServers Puck server, game mode, period length, periods, warmup, crease protection, goal slow motion, the whitelist, admins and the password are settings in the panel, and you edit teamAssignments in Files between games. Plans start at 2.99 USD a month for 12 slots, and a league can split the bill between up to 10 people. See the quick start guide.
Skip the setup. Your own Puck server.
Then $2.99/mo. Just trying it? $0.75 for 3 days