Windrose keeps its server configuration split across two JSON files, and honestly, once you know where they live and what the format looks like, it's pretty straightforward. The tricky part is the tagged JSON structure in the world settings file – I'll walk through that in detail.
Before anything else: always stop your server before editing either config file. Windrose rewrites ServerDescription.json on shutdown, so if you edit while the server is running, your changes get overwritten the moment it stops. We get tickets about this one a lot.
You can edit these files through the LOW.MS Control Panel using either Configuration Files or File Manager in the sidebar.
ServerDescription.json
This is the simpler of the two files. It lives at:
R5/ServerDescription.json
Here's what a typical one looks like:
{
"ServerName": "My Windrose Server",
"InviteCode": "aBc123",
"IsPasswordProtected": false,
"Password": "",
"MaxPlayerCount": 10,
"Note": "",
"P2pProxyAddress": "192.168.1.100",
"PersistentServerId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"WorldIslandId": "default-island-id"
}
Most of these are self-explanatory, but a few notes:
ServerNameis what players see when they connect. Pick something descriptive if you're running a public server.InviteCodegets auto-generated on first boot. It's at least 6 characters, alphanumeric, and case-sensitive – so "aBc123" and "abc123" are different codes. Players use this to connect directly. There's a separate guide on that: How to Join Your Windrose Server Using an Invite Code.IsPasswordProtectedandPasswordwork as a pair. The password field is ignored entirely unless protection is enabled. SetIsPasswordProtectedtotruefirst, then put your password inPassword.MaxPlayerCountdepends on which plan you're on. We offer 4, 6, 8, and 10 player plans (check the Windrose page for current pricing). Don't set this higher than your plan allows.P2pProxyAddressis your server's IP for listening sockets. This is pre-configured by us. Leave it alone.PersistentServerIdis auto-generated. Do NOT edit this. Changing it can orphan your save data.WorldIslandIdties this file to a specific world. It must match theIslandIdin yourWorldDescription.json– I'll cover that next.
For most people, the only things worth touching here are ServerName, password settings, and maybe Note if you want a description. Quick and painless.
WorldDescription.json
This is where the real configuration lives. The file path is a bit of a mouthful:
R5/Saved/SaveProfiles/Default/RocksDB/<version>/Worlds/<world-id>/WorldDescription.json
The <version> and <world-id> folders vary per server. Use File Manager in the control panel to navigate there – it's easier than trying to guess the path.
The top-level structure looks like this:
{
"IslandId": "your-world-id",
"WorldName": "My World",
"WorldPresetType": "Medium",
"WorldSettings": {
"FloatParameters": { ... },
"BoolParameters": { ... },
"TagParameters": { ... }
}
}
IslandId must match the folder it sits in, and must match WorldIslandId in ServerDescription.json. If these don't line up, the server won't load the world. WorldName is just a display name – change it to whatever you like.
WorldPresetType can be "Easy", "Medium", "Hard", or "Custom". That last one shows up as "Captain's Choice" in the game UI. Here's the thing though: if you manually edit any parameter inside WorldSettings while using a preset, Windrose automatically converts it to "Custom". There's no way around this. You can't run "Medium with one tweak" – it becomes Captain's Choice the moment you touch anything.
The Tagged JSON Format
This is where Windrose gets weird. Instead of simple key-value pairs, parameters are keyed by a JSON string containing a tag name. I've not seen another game do it quite like this.
Here's how float parameters look:
"FloatParameters": {
"{\"TagName\": \"WDS.Parameter.MobHealthMultiplier\"}": 1.5,
"{\"TagName\": \"WDS.Parameter.MobDamageMultiplier\"}": 1.0
}
Yes, those keys are escaped JSON strings inside a JSON file. It's unusual but it works fine – just be careful with your quotes. A misplaced backslash will break the file.
Boolean parameters follow the same pattern:
"BoolParameters": {
"{\"TagName\": \"WDS.Parameter.EasyExplore\"}": false,
"{\"TagName\": \"WDS.Parameter.Coop.SharedQuests\"}": true
}
Tag parameters are the most nested. These are used for settings that have named options rather than numeric values:
"TagParameters": {
"{\"TagName\": \"WDS.Parameter.CombatDifficulty\"}": {
"TagName": "WDS.Parameter.CombatDifficulty.Hard"
}
}
Notice the value itself is an object with a TagName property. The value's tag name uses the parameter name as a prefix, then appends the option. So combat difficulty set to Hard becomes WDS.Parameter.CombatDifficulty.Hard.
Available Settings
I'll group these by category. Ranges in parentheses.
Combat
MobHealthMultiplier– float, 0.2 to 5.0, defaults to 1.0. Lower values make enemies squishier. At 0.2 everything dies in a couple hits; at 5.0 even basic mobs become damage sponges.MobDamageMultiplier– float, 0.2 to 5.0. How hard enemies hit you. Cranking this up alongside health makes for a genuinely punishing experience.CombatDifficulty– tag parameter with options Easy, Normal, or Hard. This is a broader difficulty dial that affects AI behaviour and encounter tuning beyond just the raw multipliers.
Naval
ShipsHealthMultiplier– float, 0.4 to 5.0. Ship durability. If your crew keeps losing ships, bumping this up a bit can reduce frustration without making naval combat trivial.ShipsDamageMultiplier– float, 0.2 to 2.5. Note the lower ceiling compared to mob damage – ship cannons already hit hard.BoardingDifficultyMultiplier– float, 0.2 to 5.0. Affects how tough boarding encounters are. This one's worth experimenting with.
Co-op Scaling
These matter a lot for multiplayer balance:
Coop.StatsCorrectionModifier– float, 0.0 to 2.0. Controls how enemy stats scale with player count. At 0.0, enemies don't scale at all – great if you want the game to get easier with more players. At 2.0, scaling is aggressive.Coop.ShipStatsCorrectionModifier– float, 0.0 to 2.0. Same idea but for naval encounters specifically.
Honestly, I'd leave both of these at their defaults unless your group is finding the game too easy or too hard with your player count. They interact with the combat multipliers in ways that can snowball.
Exploration and Quests
EasyExplore– boolean. When set totrue, this actually disables map markers, which sounds counterintuitive. The idea is immersive exploration – you discover things by sailing around rather than following icons. It's a nice option for experienced players on a second playthrough.Coop.SharedQuests– boolean. Whentrue, quest completions apply to all players automatically. Saves a lot of "wait, you need to do that quest too?" back-and-forth.
A Practical Example
Say you want a 4-player server with tougher combat, shared quests, and immersive exploration. Your WorldDescription.json settings block would look like:
"WorldSettings": {
"FloatParameters": {
"{\"TagName\": \"WDS.Parameter.MobHealthMultiplier\"}": 2.0,
"{\"TagName\": \"WDS.Parameter.MobDamageMultiplier\"}": 1.5,
"{\"TagName\": \"WDS.Parameter.Coop.StatsCorrectionModifier\"}": 1.2
},
"BoolParameters": {
"{\"TagName\": \"WDS.Parameter.EasyExplore\"}": true,
"{\"TagName\": \"WDS.Parameter.Coop.SharedQuests\"}": true
},
"TagParameters": {
"{\"TagName\": \"WDS.Parameter.CombatDifficulty\"}": {
"TagName": "WDS.Parameter.CombatDifficulty.Hard"
}
}
}
Remember, this will set WorldPresetType to "Custom" automatically. That's fine – it just means the in-game UI will show "Captain's Choice" instead of a named preset.
Running Multiple Worlds
This is an advanced feature, but it works well. You can have several worlds on one server and switch between them.
Each world lives in its own folder under the Worlds directory. The folder name should match the IslandId inside that world's WorldDescription.json. To create a second world:
- Stop the server
- Navigate to the Worlds directory in File Manager
- Create a new folder with a unique name
- Add a
WorldDescription.jsoninside it with a matchingIslandId - Update
WorldIslandIdinServerDescription.jsonto point at whichever world you want active - Start the server
You can only run one world at a time. Switching is just a matter of stopping, changing WorldIslandId, and starting again. All your world saves persist independently – nothing gets deleted when you switch.
This is handy if your group wants to try different difficulty settings without losing progress on your main world, or if you want a separate world for newer players to learn on.
Editing Workflow
The cleanest way to handle config changes:
- Stop your server from the control panel
- Go to Configuration Files or File Manager in the sidebar
- Make your edits
- Start the server
Configuration Files gives you a form-based editor for common settings, which is less error-prone than editing raw JSON. File Manager lets you edit the files directly if you need to tweak something the form doesn't expose.
If your server won't start after a config change, you've almost certainly got a JSON syntax error – a missing comma, an extra quote, something like that. Check Windrose Server Troubleshooting for help diagnosing startup issues, or pull up Log Viewer in the sidebar to see what the server complained about.
For recommended settings combinations and what we've found works well for different group sizes, there's a more opinionated writeup on our blog. And if you're looking to add mods, that's a separate process covered in the mods installation guide.