Puck Server Config Explained: server_config.json and Game Modes (2026)
Every key in Puck's server_config.json, public and competitive game mode configs, phaseDurationMap, period length, tick rate and the Steam ID files, with defaults.
Updated Oct 1, 2026 · 6 min read
On this page
A Puck dedicated server is configured with a handful of JSON files in its folder. server_config.json holds the server itself: name, port, player limit, password, tick rate, mods and game mode. Two game mode files hold the rules, such as period length and how many periods a game has, and three plain lists hold admins, bans and the whitelist. This guide explains every key in the current build (B1235) with its default, and the mistakes that stop a server from starting.
Older guides mention server_configuration.json, ports 7777 and 7778, adminSteamIds inside the config or a Puck.x86_64 start command. Those are from builds before the May 2026 matchmaking update and no longer apply.
The files at a glance
| File | What it holds | If it is broken |
|---|---|---|
server_config.json |
Server settings | The server refuses to start |
public_game_mode_config.json |
Rules for public games | Falls back to default rules |
competitive_game_mode_config.json |
Rules and teams for competitive games | Falls back to default rules |
admin_steam_ids.json |
Admin SteamID64s | Keeps the previous list |
banned_steam_ids.json |
Banned SteamID64s | Keeps the previous list |
banned_ip_addresses.json |
Banned IP addresses | Keeps the previous list |
whitelisted_steam_ids.json |
Players allowed when the whitelist is on | Keeps the previous list |
The three lists are watched and reload as soon as they are saved. Changes to server_config.json and the game mode files need a restart.
server_config.json
These are the server's built in defaults:
{
"port": 30609,
"name": "MY PUCK SERVER",
"maxPlayers": 12,
"password": null,
"tickRate": 200,
"isPublic": true,
"useVoip": false,
"useWhitelist": false,
"mods": [],
"gameMode": "public",
"level": "default"
}
| Key | Type | Default | What it does |
|---|---|---|---|
port |
number | 30609 | The game port. Gameplay uses UDP and the server browser ping uses TCP, both on this number. |
name |
text | MY PUCK SERVER | Name in the server browser. Unity rich text tags such as colors work, but keep it short and readable. |
maxPlayers |
number | 12 | Slots, spectators included. Admins can still join when it is full. |
password |
text or null | null | null means anyone can join. Any text makes players enter it. |
tickRate |
number | 200 | How many times per second the server simulates physics. |
isPublic |
true or false | true | Lists the server in the in game server browser. |
useVoip |
true or false | false | Voice chat on the server. The pause menu shows players whether it is on. |
useWhitelist |
true or false | false | Only Steam IDs in whitelisted_steam_ids.json can join. |
mods |
list | empty | Steam Workshop mods, see below. |
gameMode |
text | public | public or competitive. |
level |
text | default | The rink. Leave it on default, the standard rink. |
Tick rate
Puck simulates the puck, sticks and bodies on the server, then sends the result to players. A higher tick rate makes stickhandling feel tighter, a lower one makes it feel sluggish. Puck's own cloud servers and matchmaking servers run at 200, which is the right choice for almost everyone. Going higher only helps if the CPU can hold it with a full rink. If the server cannot keep up, everyone feels it.
Mods
Each mod is an object with three keys:
"mods": [
{ "id": "3721801263", "isEnabled": true, "isClientRequired": false }
]
id is the Steam Workshop id as text (in quotes). isClientRequired: true makes every player download the mod when they connect. More in how to add mods to a Puck server.
Game mode configs
public_game_mode_config.json and competitive_game_mode_config.json share the same rule keys. The server picks the file that matches gameMode.
| Key | Default | What it does |
|---|---|---|
phaseDurationMap |
see below | Seconds each game phase lasts |
spawnDelay |
10 | Seconds before players spawn at the start of a phase |
maxPeriods |
3 | Periods per game |
goalSlowMotion |
true | Slow motion replay and celebration camera after a goal |
goalieCreaseProtection |
true | Filters body to body contact inside the goalie crease. Intruding players show as a ghost. |
teamAssignments |
empty | Competitive only: SteamID64s on Blue and Red |
phaseDurationMap
| Phase | Default seconds | What it is |
|---|---|---|
None |
0 | No game running |
Warmup |
60 | Free skate before the game. If there are not enough players, warmup is extended. |
PreGame |
10 | Short lead in after warmup, before play begins |
FaceOff |
4 | The faceoff itself |
Play |
300 | Play time per period, the period length |
BlueScore |
4 | Pause after Blue scores |
RedScore |
4 | Pause after Red scores |
Replay |
9 | Goal replay |
Intermission |
10 | Break between periods |
GameOver |
30 | Final score screen |
PostGame |
10 | After the final score screen |
The game clock runs through 0:00 before a phase ends. The map you write replaces the built in one, so always include every phase, not just the ones you change. A full example with 10 minute periods:
{
"phaseDurationMap": {
"None": 0,
"Warmup": 60,
"PreGame": 10,
"FaceOff": 4,
"Play": 600,
"BlueScore": 4,
"RedScore": 4,
"Replay": 9,
"Intermission": 10,
"GameOver": 30,
"PostGame": 10
},
"spawnDelay": 10,
"maxPeriods": 3,
"goalSlowMotion": true,
"goalieCreaseProtection": true
}
teamAssignments (competitive)
"teamAssignments": {
"Blue": ["76561198000000000", "76561198000000001"],
"Red": ["76561198000000002", "76561198000000003"]
}
Listed players are put on their team, everyone else goes to spectator. That makes competitive mode the right choice for league games and scrims, and the wrong one for an open pickup server. Walkthrough: how to set up a Puck league server.
Mistakes that stop a server
The server uses a strict JSON reader:
- No comments and no trailing commas. A comma after the last item in a list or object is an error.
- Text in quotes, numbers without.
"maxPlayers": "12"fails, and so does a modidwithout quotes. - Exact key names. Keys are case sensitive:
maxPlayersworks,MaxPlayersdoes not.
When server_config.json is invalid, the log names the file, the line and the key, and the server stays off until it is fixed. A bad game mode file only logs an error and falls back to the default rules, which is easy to miss, so read the log after any edit.
Launch options
Every file path can be changed on the command line, for example to run several servers from one install: --serverConfigPath, --publicGameModeConfigPath, --competitiveGameModeConfigPath, --adminSteamIdsPath, --bannedSteamIdsPath, --bannedIpAddressesPath, --whitelistedSteamIdsPath and --logPath (default ./Logs/Puck.log). --serverConfig, --publicGameModeConfig and --competitiveGameModeConfig take the JSON inline instead of a file.
On GamezServers
On a GamezServers Puck server the common keys are settings in the panel: join password, game mode, period length, periods, warmup, crease protection, goal slow motion, public listing, voice chat, whitelist, admins and tick rate. They are written into the files on every start, and the player limit follows your plan. Anything else, like mods or team assignments, you edit in Files, and your edits are kept through updates. See the quick start guide or Puck admin commands.
Skip the setup. Your own Puck server.
Then $2.99/mo. Just trying it? $0.75 for 3 days