Pre-tuned server configs: exactly what we change and why
Most Minecraft servers lag long before the hardware runs out — the usual culprit is vanilla entity AI (villagers, pathfinding) chewing through the single main tick thread. The fixes are well known in the server-admin community: a handful of config keys in spigot.yml and Paper's world defaults, a couple of server.properties keys, and the right garbage-collector flags for the JVM. But if you've never run a server before, you shouldn't have to learn that the hard way.
So every new server that runs on a JVM starts with that tuning already in place — Paper, Purpur, Vanilla, Forge, NeoForge, Fabric, and the modpacks that run on those loaders. It comes in two halves. Aikar's GC flags and two server.properties keys go to all of them. The config files below (spigot.yml, bukkit.yml, Paper's world defaults, purpur.yml) are seeded on Paper and Purpur only, because the other cores don't read them. A Pumpkin server gets none of it — it's a Rust core, so there is no JVM to tune — and neither does a Velocity proxy, which has no world of its own. Everything the preset does is on this page — no hidden changes.
What's in server.properties
| Key | Stock | Ours | What it does |
|---|---|---|---|
simulation-distance |
10 | 6 | How far from each player the server keeps ticking the world at all: a radius in chunks, not a diameter, and entities, blocks and fluids are not updated outside it, entities in the spawn chunks at world spawn excepted (see the trade-off note below). So this number caps the area that can be doing tick work, and that cap grows with its square. It is also the one key here you can notice: past 6 chunks mobs stop moving and stop being visible to you, and farms and circuits stand still. The property is new in Minecraft 1.18, so the "Stock 10" above is the 1.18-and-later default: pick an older release in the create form and the game has no such setting, and our 6 does nothing there. |
sync-chunk-writes |
true | false | Chunk writes stop being forced to disk on every write — the stock game opens region files in synchronous mode "to prevent data loss and corruption after crash", and lets a dedicated server turn that off with this key. Invisible in play. On the cores where the key is live — Vanilla, Fabric, Forge, NeoForge — the trade-off is that a hard kill can cost the newest chunks. On Paper and Purpur it changes nothing at all; see the note right below. |
Both are ordinary settings — open Settings in the panel and change either one. We set them once, at creation.
sync-chunk-writes is a no-op on Paper and Purpur, and we set it there anyway. Paper's own reference says this property "has no effect on Paper by default, unless the corresponding system property is also set to true", and that system property — Paper.enable-sync-chunk-writes — is unset by default. We never set it. So on a Paper or Purpur server our false is not a change: those cores were not doing synchronous chunk writes to begin with, and our default therefore adds no risk of losing the newest chunks there. We still write the value so that one preset reads the same on every core. (Purpur is a drop-in replacement for Paper, built on top of Paper — we found no Purpur statement about this key either way, so this is our reading of the fork relationship, not a Purpur source.)
Change these two in Settings rather than by hand in server.properties. A property that has a value in Settings is written into that file every time the container starts, so the panel's value wins and a hand-edit of that one key is gone on the next boot — on a metered server, that's the next wake. These two always have a value on a new JVM server, because we set them at creation. A property you have never set in Settings works the other way round: we pass nothing for it, and whatever the file says stands. Some keys are ours anyway, and a hand-edit of one of those is replaced on the next start: accepts-transfers, which we force to true on every start (on Paper, Purpur and Vanilla servers from Minecraft 1.20.5 up) so a woken server can accept the transfer packet we send it and put the waiting player through — behind a Velocity proxy we send that player through a normal reconnect instead; and enable-rcon and rcon.password, which we set ourselves, because the panel console, the save-flush before a backup, and the TPS/MSPT readings all go over RCON.
Also note that setting a field back to default in the panel is not the same as restoring the stock value. An empty field is not sent at all: we stop managing that key, and server.properties keeps the last value written into it — ours. To get the stock behaviour back, pick the stock value explicitly: on for sync-chunk-writes, 10 for simulation-distance.
The ownership rule: seeded once, then the files are yours
The files below are seeded on Paper and Purpur only. We write them once, when the server is created, before its first boot. After that:
- Any edit you make sticks. We never rewrite, patch, or "correct" these files.
- If you delete one, the server regenerates stock defaults on the next boot. We never overwrite a file that exists.
- Worlds you import replace whatever they ship with; your import wins.
What's in spigot.yml
| Key | Stock | Ours | What it does |
|---|---|---|---|
entity-activation-range.animals |
32 | 24 | Entities farther than this from any player stop running AI |
entity-activation-range.monsters |
32 | 24 | Same, for hostiles |
entity-activation-range.villagers |
32 | 16 | The biggest lever — idle villagers (trading halls!) are the classic tick-killer |
entity-activation-range.misc |
16 | 8 | Items, arrows, etc. |
entity-activation-range.water |
16 | 8 | Squid, fish, dolphins |
entity-activation-range.tick-inactive-villagers |
true | false | Villagers outside the range stop ticking entirely |
merge-radius.item |
2.5 | 3.0 | Dropped items merge from slightly farther away — fewer item entities |
What's in config/paper-world-defaults.yml
| Key | Stock | Ours | What it does |
|---|---|---|---|
misc.redstone-implementation |
VANILLA | ALTERNATE_CURRENT | A faster redstone engine with near-identical behavior |
misc.update-pathfinding-on-block-update |
true | false | Mobs stop recomputing paths on every block change |
collisions.max-entity-collisions |
8 | 2 | Fewer collision checks inside dense mobs/farms |
tick-rates.behavior.villager.validatenearbypoi |
-1 | 60 | Villagers re-scan their points of interest less often; trading is unaffected |
tick-rates.sensor.villager.secondarypoisensor |
40 | 100 | Same idea, different sensor |
tick-rates.container-update |
1 | 3 | Container/hopper update packets every 3 ticks instead of every tick |
tick-rates.grass-spread |
1 | 4 | Grass spreads slightly slower — purely cosmetic |
On Minecraft 1.18 and older, Paper used a single paper.yml instead — these keys apply from 1.19 up. The seeded file is simply ignored by older versions and activates if you later upgrade.
What's in bukkit.yml
| Key | Stock | Ours | What it does |
|---|---|---|---|
settings.connection-throttle |
4000 | -1 | Disables the per-IP reconnect throttle, so a group reconnecting to a just-woken server doesn't get "Connection throttled!" — this matters on TrueTick because sleeping servers wake on join |
Purpur only: purpur.yml
| Key | Ours | What it does |
|---|---|---|
world-settings.default.dab.enabled |
true | DAB ("dynamic activation of brain") ticks entity AI less often the farther the entity is from any player — the single biggest entity-AI lever Purpur has |
JVM: Aikar's flags
New servers on every JVM core also run with Aikar's flags — the community-standard G1GC garbage-collector tuning for Minecraft servers. This affects only GC pause behavior, never gameplay. It is also the one part of this page that reaches servers which don't carry the preset — see the last section.
What we deliberately did NOT touch
spawn-limits— mob density stays exactly vanilla. Lowering caps is a real optimization, but it visibly changes the game, so it's your call, not a default.view-distance— same reason.
Honest trade-off
Most of what's above is invisible in play. Two things are not:
- The reduced activation ranges (Paper and Purpur): mobs very far from any player tick less, so fully-AFK farms built far away can run somewhat slower. If a specific farm needs vanilla behavior, raise
entity-activation-rangevalues back — the file is yours. simulation-distance6: past 6 chunks from a player, living entities stop being ticked and stop being visible to that player, and blocks and fluids stop updating out there — a farm or a redstone circuit that far from anyone stands still. One exception we can source, and it is about entities: the spawn chunks at world spawn are always loaded in memory, and 3×3 entity-ticking chunks by default since Minecraft 1.20.5, much wider before that — so mobs inside that patch tick with nobody near them. Set it back to 10 in Settings if that matters for your build.
Everything else is imperceptible in normal play.
We changed our mind about one thing. Until preset v2 shipped, this page said we deliberately left simulation-distance alone because it's player-visible. It still is — that's the bullet above. We set it to 6 on new servers anyway, on the mechanism: it is a radius in chunks, and, spawn-chunk entities aside, entities, blocks and fluids outside it are not updated at all, so the radius caps the area that can be doing tick work — and that cap grows with its square. And it is a default, not a ceiling. view-distance — the one you actually see as render distance — we still do not touch, and servers created before this change kept their existing simulation-distance.
Servers that don't carry the preset
The preset never goes back and rewrites a server that already exists. Nothing in the tables above was applied to yours retroactively: your config files are as you left them, and simulation-distance stays wherever you have it. This section is about every server without the preset, not only the old ones — a Vanilla, Fabric, Forge or modpack server created before v2 never got one either, because v1 covered Paper and Purpur only.
One part does reach those servers: Aikar's flags. Those live in the container's start command rather than in any file of yours, so nothing you own is rewritten — an existing JVM server picks them up the next time it starts, and a running server keeps running until then. Pumpkin and Velocity servers get nothing, same as new ones.
Want the rest applied to an older server? The tables above are the complete recipe, or ask us on Discord and we'll walk through it with you.
Skip the setup: spin up a server with guaranteed CPU and live TPS — see pricing.