A Minecraft Java Edition server keeps its settings in one plain-text file, server.properties, in the folder the server is started from. Next to it sit a few JSON files for operators, the whitelist and bans, and eula.txt. This guide explains the settings people search for most, what they really do, the ones that changed recently, how much memory to give Java, where Paper keeps its extra settings, and the mistakes that cost server owners an evening.
Which version this covers. We downloaded the official Java Edition 26.3 server (released 15 September 2026) from Mojang and ran it on Linux. Every default below is copied from the file it wrote, and where we write "in our test" we tried it on that server. Meanings come from the Minecraft Wiki's server.properties page. Settings move between versions, so if your file looks different, check which version you run.
server.properties with different settings and uses UDP port 19132 by default. Nothing below applies to it.
Start the server jar once (java -jar server.jar nogui). It writes a default server.properties and an eula.txt containing eula=false, then stops with "You need to agree to the EULA in order to run the server. Go to eula.txt for more info." Read the Minecraft EULA at https://aka.ms/MinecraftEULA (the link is in the file), change the line to eula=true, and start it again. On the second start it generates the world and the JSON files.
The server needs a recent Java. Mojang's version file for 26.3 asks for Java 25, and in our test the server refused to start on Java 21 with an UnsupportedClassVersionError. If you see that error, the server is fine: install a newer Java.
One setting per line, key=value, lines starting with # are comments. On every start the server reads the file, fills in any missing key with its default, and writes the file back out, which is why your own comments disappear. It also escapes some characters, so the default world type appears as level-type=minecraft\:normal; the backslash is normal.
Changes take effect on the next start. In our test, stop did not rewrite the file, so an edit made while the server was running survived until the next start. One thing did overwrite it: a console command that changes a setting stored in the file. We edited motd and max-players while the server ran, then typed whitelist off; the server immediately wrote the whole file from what it had in memory, and both edits were gone. The safe habit is to stop the server, edit, then start it.
| Setting | Default | What it does |
|---|---|---|
| view-distance | 10 | How many chunks around each player the server sends to the client, as a radius (3 to 32). A player's own render distance can't go beyond it. |
| simulation-distance | 10 | How many chunks around each player are actually ticked: mobs move, crops grow, redstone and furnaces run. Radius, 3 to 32. |
| max-players | 20 | How many players can be online at once. An operator whose ops.json entry has "bypassesPlayerLimit": true can join a full server. |
| difficulty | easy | peaceful, easy, normal or hard. |
| gamemode | survival | The default game mode: survival, creative, adventure or spectator. Returning players keep the mode they left in. |
| force-gamemode | false | true puts every player back in the default game mode each time they join. |
| hardcore | false | Hardcore mode for a newly created world. |
| online-mode | true | Checks every joining player against Mojang's account servers. Leave it on; see the pitfalls. |
| white-list | true | Only players in whitelist.json can join. On by default since 26.3 (it used to be off). Operators don't need to be on the list. |
| enforce-whitelist | false | With true, players already online who are not on the whitelist are kicked when the whitelist is reloaded. |
| spawn-protection | 16 | Non-operators can't break or place blocks near the world spawn. The protected square's side is 2 × value + 1 blocks, so 16 protects 33 × 33. 0 turns it off; it is also off while the server has no operators. |
| motd | A Minecraft Server | The line under your server's name in the multiplayer list. Colour and formatting codes work; keep it under about 59 characters. |
| level-seed | empty (random) | The seed used when the world is generated. Only used for a new world. |
| level-type | minecraft:normal | The world preset for a new world: minecraft:normal, minecraft:flat, minecraft:large_biomes, minecraft:amplified or minecraft:single_biome_surface. |
| level-name | world | The folder the world is saved in. Point it at a different folder and the server uses (or creates) that world. |
| allow-flight | false | With false, a Survival player who flies can be kicked for it. Set true if your mods or plugins give players flight. |
| max-tick-time | 60000 | The watchdog: if a single server tick takes longer than this many milliseconds, the server considers itself crashed and shuts down. -1 disables the watchdog. |
| pause-when-empty-seconds | 60 | After this many seconds with nobody online, the server pauses the world. |
| server-port | 25565 | The game port, TCP. The one port players need. |
| server-ip | empty | The address to listen on. Empty means all addresses; leave it empty unless you know you need it. |
| enable-rcon | false | Remote console over the network. Needs rcon.password as well. |
| rcon.port | 25575 | The RCON port, TCP. |
| rcon.password | empty | The RCON password. With it empty, RCON doesn't start even if enabled. |
| enable-query | false | The GameSpy4 "query" protocol that server lists and status tools use, on UDP query.port (default 25565). |
| network-compression-threshold | 256 | Packets of this many bytes or more are compressed. -1 turns compression off, 0 compresses everything. |
| sync-chunk-writes | true | Writes chunks to disk synchronously. Safer after a crash or power loss, at some cost in disk speed. |
| entity-broadcast-range-percentage | 100 | How far away entities are sent to players, as a percentage of the normal distance (10 to 1000). Lower means less network traffic and less client lag, but mobs pop in later. |
| enforce-secure-profile | true | Only players with a Mojang-signed chat key can join. With false, chat is unsigned and can't be reported, and players get a warning when they connect. |
pvp, spawn-monsters, allow-nether and enable-command-block are game rules, not properties, and spawn-animals and spawn-npcs were removed in 1.21.2. A pvp=false line in an older guide does nothing on a current server. Use the game rule instead: in our test gamerule pvp reported true, and gamerule pvp false is the replacement for the old line.
These two are the main performance controls, and they do different jobs. view-distance is how far players can see: the server loads those chunks and sends them, which costs memory, disk reads and upload bandwidth. simulation-distance is how far the world is alive: inside it the server ticks mobs, farms, redstone and furnaces, which costs CPU.
Both are a radius around each player, so the area grows with the square. At 10, each player has a 21 × 21 square of 441 chunks; at 6 it is 13 × 13, 169 chunks. Players far apart multiply that. If the server lags, lower simulation-distance first (6 is a common choice): players still see far, and only nearby farms and mobs run. Lower view-distance if memory or your upload speed is the limit.
After the first full start, the server folder holds four JSON files. Manage them with console commands rather than by hand: in our test op and whitelist add looked the player up and wrote the file immediately.
| File | Command | What it holds |
|---|---|---|
| ops.json | op / deop <name> | Operators, each with UUID, name, level (1 to 4; new ops get op-permission-level, default 4) and bypassesPlayerLimit. |
| whitelist.json | whitelist add / remove <name> | Players allowed to join while white-list=true, by UUID and name. |
| banned-players.json | ban / pardon <name> | Banned accounts. |
| banned-ips.json | ban-ip / pardon-ip | Banned IP addresses. |
Our ops.json entry looked like this:
Each entry carries the account's UUID, which the commands look up for you. If you edit whitelist.json while the server runs, run whitelist reload so the server reads it again.
You set the server's memory on the Java command line:
-Xmx is the most memory Java's heap may grow to, -Xms is how much it starts with. In our test, a fresh 26.3 world with nobody online started fine with -Xmx1G. Players, more view distance, big farms and mods all need more.
More is not always better. The heap isn't all the memory Java uses: the program code, threads and network buffers live outside it. Give -Xmx all of your machine's RAM and there is nothing left for that or for the operating system, so the machine starts swapping or the system kills the server. And memory doesn't make a slow server fast: the world is ticked on one main thread (Server thread in the log), so lag usually comes from CPU work, which simulation distance, entity counts and redstone drive, not from a heap that is too small. Give the server what it needs plus some margin, and leave the rest for the machine.
All three read the same server.properties. In our test, Fabric's file had exactly the vanilla keys, and Paper's added one, debug.
plugins folder. It adds its own settings files. In our test (Paper 26.3, build 152, still marked beta by PaperMC) the first start created bukkit.yml, spigot.yml and commands.yml next to server.properties, plus config/paper-global.yml for server-wide settings, config/paper-world-defaults.yml for the per-world defaults, and a paper-world.yml inside each dimension folder under world/dimensions/minecraft/ to override them per world.mods folder and adds no server settings file of its own; each mod brings its own config.Plugins and mods are not interchangeable: a Paper plugin doesn't load on Fabric, and a Fabric mod doesn't load on Paper.
| Port | Protocol | What for |
|---|---|---|
| 25565 | TCP | The game (server-port). The only port players need; forward this one. |
| 25565 | UDP | Query (query.port), only with enable-query=true. |
| 25575 | TCP | RCON (rcon.port), only with enable-rcon=true and a password. |
Players connect to your address with no port when the server uses 25565. On any other port, they type it after a colon, for example play.example.com:25566.
Since 26.3, white-list=true is the default, so a new server only lets in its operators. Add your friends with whitelist add <name>, or set white-list=false if the server is meant to be open. A server you upgraded keeps whatever its file already said.
With online-mode=false, our server warned at startup: "SERVER IS RUNNING IN OFFLINE/INSECURE MODE! ... it also opens up the ability for hackers to connect with any username they choose." Anyone can then join under any name, including an operator's. Leave it on, unless the server is cut off from the internet.
A console command that changes a stored setting (for example whitelist on/off) rewrites server.properties from memory and wipes edits made since the server started. Stop the server before editing.
In our test, difficulty hard changed the running game but not the file. After a restart the server was back on easy, the value in server.properties. Change the file if you want it to last.
The seed is only used to create a world. We changed level-seed and restarted, and seed still reported the original. For a new world with that seed, change level-name (or move the old world folder away).
CPU lag usually comes from what is simulated, so lower simulation-distance first. A high view-distance costs memory and bandwidth; a high simulation-distance costs CPU.
pvp, spawn-monsters, allow-nether and enable-command-block are game rules on a current server, and spawn-animals/spawn-npcs are gone. Lines for them in the file have no effect.
RCON is not encrypted, so the password crosses the network in the clear. Don't forward 25575; use it from the same machine or your own network. With an empty password, RCON won't start at all ("No rcon password set in server.properties, rcon disabled!").
Java needs memory outside the heap, and the operating system needs some too. Leave headroom, and look for lag in the CPU before adding RAM.
Bedrock Edition (consoles, phones, the Windows Bedrock version) can't connect to a Java server without a bridge, and a Bedrock server is a different program with different settings.
NodeMesh runs your Minecraft server on your own PC or server. Its Config tab edits server.properties as form fields grouped by topic, and its Players tab adds players to whitelist.json and ops.json by username, with operator levels 1 to 4.
The Mods tab switches a server between Vanilla, Paper, Fabric and Forge without recreating it, keeping the world, server.properties, the whitelist, ops and bans. It searches Modrinth for Fabric and Forge mods and, on Paper, Modrinth or Hangar for plugins, filtered to your Minecraft version, and takes a .jar upload for anything else.
You can upload a singleplayer world as a .zip and it becomes the server's world; the current world is backed up first. And when nobody is playing, Sleep stops the server cleanly after a save, and Wake starts it again from the panel.
Host Minecraft on your own hardware. NodeMesh's Config tab edits server.properties, and its Mods tab installs mods and plugins.
Start hosting with NodeMesh