Core Keeper's dedicated server is deliberately thin. There are only a handful of real settings, they live in two different places, and half the confusion online comes from people editing the wrong one.
ServerConfig.json, written automatically the first time the server boots. The password, port, and bind IP are not in that file, they go on the launch command. Stop the server, edit the file, restart. Our config generator builds both the JSON and the launch line for you.Which world the server loads and how it plays. Difficulty and seed are locked in when a world is first generated, so these only bite on a fresh slot.
| Setting | What it does | Default | Recommended |
|---|---|---|---|
| gameId | The world's unique join code. Core Keeper connects players through a relay keyed to this string rather than to a raw IP, which is why most people join a server without touching their router. Leave it empty in the file and the server mints a valid one on first launch and writes it to GameID.txt in the server folder. If you set it yourself it has to be at least 28 characters, contain no zeros, and use no punctuation, so letting the server generate it is the sane path. This is the value you hand to players for Join Game then Join With Game ID. | (auto-generated on first launch) | Leave empty, let the server generate it |
| worldName | The label attached to the world save and shown when players are in it. It does not affect gameplay and it is not how anyone finds your server, that is the game ID. Its only real job is stopping your world from being the fiftieth save literally called Core Keeper when you run more than one. | Core Keeper | Anything that identifies the world |
| world | The save slot number, 0 through 29. Each slot is a completely separate world with its own seed, difficulty, and progress. You only care about this if you keep multiple worlds on one server and want to switch which one loads. Point the server at an empty slot and it generates a new world there; point it at a used slot and it loads what is already saved. | 0 | 0 unless you run multiple worlds |
| worldSeed | The seed that decides the map layout. 0 means the server rolls a random seed at generation time. Set a specific number and you reproduce a known layout, useful if you found a seed with a great spawn or a convenient biome arrangement. This value is read exactly once, when the world on that slot is first created. Changing it later does nothing to an existing world because the seed is already baked into the save. To use a new seed you generate a fresh world. | 0 | 0 for random, or a fixed number to reproduce a layout |
| worldMode | The difficulty the world runs at. 0 is Normal, the standard survival experience. 1 is Hard, tougher enemies and more punishing combat. 2 is Creative, everything unlocked and free building with no survival pressure. 4 is Casual, softened penalties for a relaxed run. Two catches: like the seed, the mode is set at world creation and does not change on an existing save, and you cannot convert a world between Creative and non-Creative at all. If you want both a Creative and a survival world, use separate slots. | 0 | 0 (Normal) for a standard co-op server |
| seasonOverride | Forces a holiday event on regardless of the calendar. -1 is auto, the event follows the real-world date the way the base game does. 0 turns events off entirely. 1 through 6 pin a specific one: Easter, Halloween, Christmas, Valentine's Day, Anniversary, and Cherry Blossom in that order. Handy if you want a Halloween server in July or want to guarantee no seasonal decorations show up. Sources disagree on the shipped default, so verify against your own generated file if the exact starting value matters to you. | 0 | -1 (auto) to follow the calendar, 0 to keep events off |
The slot count and a single network knob. The player number lies to you, and almost nobody should touch the network one.
| Setting | What it does | Default | Recommended |
|---|---|---|---|
| maxNumberPlayers | Reads like the server's capacity and ships at 100, which is misleading. Core Keeper's co-op session cap is 8 on the current build, and raising this number does not create usable slots past that. The generator keeps 100 because that is what the server itself writes, but treat 8 as the ceiling when you plan a server. Setting it to 8 does no harm and makes the file honest. | 100 | Leave at 100 or set 8, the real cap is 8 either way |
| maxNumberPacketsSentPerFrame | A network throttle: how many packets the server pushes out per frame. The default of 1 is correct for essentially every server. This is a knob for someone chasing a specific sync problem who understands their network path. If that is not you, do not touch it. | 1 | 1, leave it alone |
These are NOT in ServerConfig.json. Core Keeper reads the password, port, and bind IP from command-line arguments. Put a password in the JSON and it does nothing, which is the single most common cause of 'my password isn't working'.
| Setting | What it does | Default | Recommended |
|---|---|---|---|
| -port | The UDP port the server listens on, default 27015. Core Keeper actually uses a UDP pair, so if you are port-forwarding or running behind a firewall, open both 27015 and 27016. Passing -port also enables Direct Connect, which is what crossplay joins and Join With IP need. The relay-based game ID join works without any of this, so a port only matters when you want direct connections. | 27015 | 27015, forward 27015-27016 UDP for direct joins |
| -password | The join password, up to 28 characters, passed on the launch line. This is the correct place for it, not the JSON file. Leave it off and the server is open to anyone with the game ID. Quote it if it contains spaces. | (none) | Set one if the game ID could leak |
| -ip | The address the server binds to, default 0.0.0.0, meaning all interfaces. You almost never change this. The only time it matters is a machine with multiple network interfaces where you need to pin the server to a specific one. | 0.0.0.0 | 0.0.0.0 unless you have a specific reason |
| -allowonlyplatform | Restricts who can join by store platform: 1 Steam, 2 Epic, 3 Microsoft/Xbox, 4 GOG. Omit it and any platform can connect, which is usually what you want for a crossplay server. Set it only if you deliberately want to lock the server to one storefront's players. | (any platform) | Omit it for open crossplay |
A normal-difficulty crossplay server for a small group. These are the values that matter; everything else stays at its default.
| Setting | Value | Why |
|---|---|---|
| gameId | (auto) | Let the server generate a valid join code and read it from GameID.txt |
| worldName | Your world name | So the save is identifiable, not another generic 'Core Keeper' |
| worldMode | 0 (Normal) | Standard survival, the default most groups want |
| seasonOverride | -1 (auto) | Events follow the real calendar instead of being forced or hidden |
| maxNumberPlayers | 8 | Matches the real co-op cap so the number isn't a fiction |
| -port | 27015 | Default port, enables Direct Connect; forward 27015-27016 UDP |
| -password | Set one | Passed on the launch line, the only place a password actually works |
ServerConfig.json plus a GameID.txt. Stop the server, edit the JSON for world, difficulty, and seasons, put your port and password on the launch command, then start it again. Our generator builds the file and the launch line so you are not counting braces by hand.~/.config/unity3d/Pugstorm/Core Keeper/DedicatedServer/ServerConfig.json. On Windows it is at %USERPROFILE%\AppData\LocalLow\Pugstorm\Core Keeper\DedicatedServer\ServerConfig.json. Managed hosts usually surface it as DedicatedServer/ServerConfig.json in their file manager. The server only writes it after its first launch, so boot once before you go looking.-password "yourpassword", and the same goes for the port and bind IP. Anything you type into the JSON file for a password is ignored. Put it on the start command, host panel launch-parameters box, or systemd ExecStart line instead. The generator's launch section assembles the exact arguments.GameID.txt (or the server console log on boot) and have players use Join Game then Join With Game ID. If you launched with -port, Direct Connect is also available via Join With IP for crossplay or port-forwarded setups. Default port is UDP 27015, and the game uses a pair, so open 27015-27016 UDP for direct joins.maxNumberPlayers key ships at 100 and looks like a big-server setting, but Core Keeper's co-op session cap is 8 on the current build and raising the number does not add usable slots. Plan for up to 8 and, if you like a tidy file, set the value to 8 so it reflects reality.worldMode and worldSeed are read once, when a world is first generated on that slot, and then baked into the save. Editing them afterward does nothing to an existing world. To actually apply a new difficulty or seed, generate a fresh world: use a new save slot or delete the old save for that slot first. On top of that, you cannot convert a world between Creative and non-Creative at all, so use separate slots if you want both.-1 and events follow the real-world calendar the way the base game does. Set it to 0 to switch events off entirely. Values 1 through 6 force a specific one: Easter, Halloween, Christmas, Valentine's Day, Anniversary, and Cherry Blossom. It is how you run a Halloween server in the middle of summer, or keep seasonal decorations off a build server year-round.