
Chunksmith
Pre-generates chunks fast, and safely: an adaptive throttle paces generation against server tick-health so it can run with players online. Builds Distant Horizons / voxy LOD data as it goes and serves it to clients. Fabric, Forge, NeoForge and Paper/Folia.
- Загрузки
- 26K
- Подписчики
- 71
- Обновлён
- 21 августа 2026 г.
- Лицензия
- GPL-3.0-only
Опубликован 9 июня 2026 г.
Chunksmith
Need help or found a bug? Report it at the Chunksmith support forum.
Chunksmith is a Minecraft chunk pre-generator that generates chunks quickly, efficiently, and safely. On top of fast pre-generation it adds an adaptive I/O throttle (so it keeps generating around the clock even with players online), region write-backpressure protection, and worldgen diagnostics (overreach detection and structure-fault attribution).
Ships as a Fabric, Forge, and NeoForge mod and a Paper / Spigot / Folia plugin. Originally derived from Chunky by pop4959; now developed independently. Licensed GPL-3.0.
Environment: required on the server (or in singleplayer, where "server" is the integrated server running inside your own game); the client install is optional. Pre-generation alone needs nothing on the client. But if you want multiplayer LOD - players seeing pregenerated Distant Horizons / voxy terrain at a distance without having walked it - the same jar has to be installed on the client too, no separate mod. See LOD: see what you pregenerated below, especially One mod, all of it.
Source code: CSv3 branch - the 3.x line, where
current development happens. The 2.x line is frozen on
CSv2_archive.
Why Chunksmith
- Fast. Pre-generates chunks ahead of time so they are ready before players arrive, eliminating the lag of on-demand generation.
- Safe under load. An adaptive throttle watches server tick-health and backs off automatically, so generation can run while players are online without tanking TPS.
- Tunable throughput.
dispatchMaxConcurrentcontrols how many chunk requests stay in flight. It defaults to a value scaled to your CPU and is settable live with/cs set- on an 8-core dedicated server, raising it from the old fixed 50 to 200 measured +39% (31.6 to 43.9 chunks/sec). - It stops when your server cannot take it, and starts again when it can. Instead of
stuttering along under load, a run pauses with a stated reason and resumes once the server has
been healthy for a grace period. A manual
/cs pausealways outranks it. - Flexible shapes. Generate by square, circle, diamond, triangle, star, and more - centered on coordinates, world spawn, or the world border, by radius or diameter.
- Multi-world, with live progress, rate, ETA, and an optional boss bar.
- Resumable. Pause, continue, cancel, and continue-on-restart - progress is saved.
- World trimming. Delete chunks outside a selected region.
- LOD generation, on by default. Install Distant Horizons or Voxy and Chunksmith builds their distant-horizon data while it pregenerates. No config file to find first - see below.
- A re-run fills LOD holes automatically. Pregenerated the world before you installed the renderer? Run the same pregen again and Chunksmith builds the LODs from the chunks it already has - it does not regenerate them, and it skips everything that is already done.
- Multiplayer LOD, built in. Players joining your server download the pregenerated LOD data and see the whole world at distance, without ever having walked it. No companion mod - the same Chunksmith jar does it, on the server and on the client.
- Developer API for generation progress and completion events.
LOD: see what you pregenerated
Chunksmith emits level-of-detail data while it pregenerates, in its own neutral format (CSLOD), and hands it straight to a LOD renderer.
It turns itself on
If a LOD renderer is installed, LOD generation is ON. Chunksmith looks for Distant Horizons, Voxy, or a Voxy fork in the game when the server starts, and if one is there it builds the LOD data as it pregenerates. There is no config key to find, nothing to switch on, and no "why are there no LODs?" - install the renderer, install Chunksmith, pregenerate, and the distant terrain is there.
It is also on for a dedicated server, which is the one case where nothing local can draw an LOD: a dedicated server runs no renderer of its own, but the store it builds is exactly what it serves to its players (see multiplayer, below). Building it is the whole reason it is there.
If nothing in the game can use LOD data - no renderer, and not a dedicated server - Chunksmith does not generate any, and says so in the log rather than leaving you guessing.
In singleplayer, Chunksmith is the only mod you need. The integrated server runs inside your
own game, so Chunksmith injects the LODs directly into your renderer - no companion mod, no
network. It registers as Distant Horizons' world-generator override (lodDhOverride), so DH
shows your pregenerated area without generating anything itself, and /cslod dhpush replays an
existing store into DH on demand - a world pregenerated long before you installed DH gets its LODs
after the fact, with no regeneration. Where voxy exists, /cslod inject does the same for voxy.
In multiplayer, the LOD data has to reach the player - and as of 3.1.0-beta-1, Chunksmith does that
itself. Put the same jar on the server and on the client. The server keeps the CSLOD store; the client
downloads what it needs and feeds it to that player's Distant Horizons or voxy. There is no companion
mod any more.
It arrives at network speed. The store is already plain region files, so the server does not stream them
it serves them, over an HTTP backchannel on the game port + 1, opened automatically with nothing for you to configure. If that port cannot be bound or cannot be reached, Chunksmith says so and drips the same bytes down the game connection instead: slower, but it always works, and it never breaks the session.
The store is the cache. Re-join and nothing is downloaded twice.
It follows you. Walk toward terrain the server pregenerated but had not sent, and it is fetched on the way - the pull is not a one-shot at join.
It only sends what you can draw. The client tells the server its renderer's actual LOD distance, and the server ships the regions inside it and no more.
It keeps itself in step. While you play, the client and the server compare a small checksum every few minutes; if they differ, the client fetches only what changed. Terrain that a running pre-generation just finished shows up without a relog and without moving (see below).
Server and client must be on the same version
From 3.1.0-beta-4 on, the server and every client must be on 3.1.0-beta-4 or later. That release
changed the LOD network protocol (v1 -> v2), and there is no compatibility path: the number the two sides
compare to decide "do I already have this region?" is exactly what had to change to fix a bug that could
take a server down.
A mismatched pair does not crash and does not hang. Both sides notice, both refuse, and both say so in the log - the distant terrain is simply not delivered. If you update the server, update the clients; if you update your client, the server has to come with you.
It keeps up while you play
The client asks the server for a one-line summary of the LOD regions in your view - a count and a single folded checksum - and compares it with its own. If they match, nothing happens at all. If they do not, it pulls the region list and downloads only the difference.
That one mechanism covers all three ways the two sides can drift apart: the server generated more terrain, a region you already have changed, or you lost region files off your own disk. It costs 22 bytes out and 34 bytes back, and the server answers it without reading a single byte of the store.
| Key | Where | Default |
|---|---|---|
sync-interval-seconds |
config/chunksmith-lod.properties (client) |
300 |
The file is written with defaults and comments the first time the client runs. Anything below 30 is clamped to 30, deliberately: a config value is a suggestion, and a one-second poll must not turn into a denial of service against a server that is already busy pre-generating. There is no settings screen for it yet.
One mod, all of it
| What you are doing | What you install |
|---|---|
| Singleplayer | Chunksmith. That is all - it always was. |
| Playing on a server | Chunksmith, on the server and on the client. Same jar. |
| Running a server, pre-generation only | Chunksmith on the server. Nothing new loads; a dedicated server never touches the client half. |
The standalone Chunksmith-Client mod is discontinued. Its job is now part of Chunksmith, and as of
3.1.0-beta-4an old copy of it no longer works - it speaks the v1 LOD protocol, and a3.1.0-beta-4server will refuse it and tell it so. There is no reason to keep it in any case, and you cannot run both: they register the same network channel, and the loader will refuse to start and tell you to remove one. Delete Chunksmith-Client; Chunksmith does the job alone.
A re-run fills in the missing LODs
Already pregenerated your world before you installed a LOD renderer? Just run the same pregen again. Chunksmith checks the CSLOD store as well as the world, chunk by chunk:
| On disk | What Chunksmith does |
|---|---|
| No chunk | Generates it - the LOD is built on the way past |
| Chunk, but no LOD | Loads the chunk and builds the LOD from it - no worldgen, nothing regenerated |
| Chunk and LOD | Skips it entirely - no load, no write |
So the second run builds only what is missing, and a third run does nothing at all. Delete part of the store and only those pieces come back. Nothing already done is redone, and nothing is rewritten.
The check is a single small read per region file, so it costs nothing worth measuring - a 6,500-chunk selection spends under a millisecond deciding what it can skip. The pregen then tells you exactly what it did: how many chunks it generated, how many LODs it built from chunks that already existed, and how many it skipped because both were already there.
Forcing it on, or off
lodEnabled in config/chunksmith.json is a tristate, not a switch:
lodEnabled |
What happens |
|---|---|
"auto" (default) |
ON if Distant Horizons, Voxy, or a Voxy fork is loaded. ON on a dedicated server. Off otherwise. |
true |
Always on, renderer or not. Useful to build the store now and install the renderer later. |
false |
Always off - even with a renderer installed. |
An explicit true or false is your decision and Chunksmith never overrides it. Whichever way it
goes, it is stated once in the server log at startup, and /cslod status will tell you again.
What it costs when it is on: ~5.8 KB per chunk on disk and, measured over matched windows, no measurable pre-generation slowdown - 36.1 chunks/sec with LOD on against 34.2 with it off. (Earlier builds claimed a ~16% cost. That was never measured and is not true.) Plain region files - no native database, nothing extra to install.
Where LOD is available
| Distant Horizons | voxy | |
|---|---|---|
| Fabric | 1.20.1, 1.21.1, 1.21.11, 26.1, 26.2 | 1.21.11, 26.1, 26.2 |
| NeoForge | 1.21.1, 1.21.11, 26.1, 26.2 | - |
| Forge | 1.20.1 | - |
Those are the versions the renderers themselves ship on - Chunksmith never claims a renderer it cannot feed. voxy is Fabric-only (upstream builds no NeoForge or Forge jar) and exists only on 1.21.11, 26.1 and 26.2. Distant Horizons works everywhere on the list - Chunksmith needs DH 2.3.0-b or newer, with no upper bound. Neither renderer has shipped a 26.3 build yet, so the 26.3 mod carries everything except LOD; it will start feeding them the day they release, with no change needed here. The Paper / Spigot / Folia plugin has no LOD: there is no client-side renderer to hand data to on that platform. The remaining mod versions (1.20.4, 1.20.6, 1.21.4, 1.21.5, 1.21.8, 1.21.10, 26.3) carry everything except LOD.
voxy forks
voxy gets forked a lot, so Chunksmith feeds upstream voxy and its forks through one adapter: it looks
for the mod id voxy (every fork keeps it), reads the fork's own render-distance setting, and hands data
to voxy's own ingest API. There is no per-fork code and no fork-specific list to maintain.
Forks are third-party builds of an All-Rights-Reserved mod. Chunksmith does not ship, mirror, endorse or link any of them - the table below is a test record, nothing more. We ran the real jars on 2026-07-13 and looked at the screen:
| voxy build | MC | Result |
|---|---|---|
| voxy (upstream, MCRcortex) | 1.21.11, 26.1.2, 26.2 | Works. Detected, render distance read (8192 blocks), distant terrain drawn in singleplayer and in multiplayer. |
| mia-edition (ggonzaDNG) | 1.21.11 | Works. Same, singleplayer and multiplayer. |
| voxy 26.2 branch (NHblock714) | 26.2 | Works. Singleplayer verified. |
| voxy-26.2 (Paulem79) | 26.2 | Works. Detected, distance read, LODs ingested. |
| Vulkan-Voxy (SpinGiantCRM) | 26.1.2 | Chunksmith's side works - detected, distance read, LODs ingested into its database - but its Vulkan renderer drew no distant terrain on either machine we could test it on. That is between you and the fork; Chunksmith hands it the data. |
| m-series support (srjefers) | 1.21.11 | Chunksmith reads it correctly, but the fork does not work. Its renderer is based on an old voxy that predates MC 1.21.9's render rework, and it throws IllegalStateException: Cannot use the default framebuffer the moment it has anything to draw - with Chunksmith removed as well. Nothing we can fix from here. |
If a fork ever changes something Chunksmith depends on, Chunksmith says so in the log - once, in plain words, naming what it could not read and what it fell back to. It will never quietly send you less terrain.
NeoForge and Forge: Distant Horizons only
There is no voxy for NeoForge or Forge on the modern versions - not from upstream, and not from a fork. Every "NeoForge voxy" out there is a Fabric jar loaded through Sinytra Connector, and Connector only supports 1.20.1 / 1.21 / 1.21.1. There is no Connector for 1.21.11 or 26.x, so there is nothing to repackage and nothing for Chunksmith to feed. On NeoForge and Forge, Chunksmith's LOD is Distant Horizons only - a limit of the ecosystem, not of Chunksmith.
Conflicts
Do not run Chunksmith's LOD alongside another server-side LOD provider - lss, voxyserver, or
lodserver. They inject into the same renderer over the same channels, and whichever gets there
first wins; the result is missing or corrupted LODs, not an error message. Pick one. Chunksmith
declares those three as incompatible so your loader tells you before you find out the hard way.
Usage
The primary command is /cs (alias /chunksmith); /chunky and /cy are deprecated
aliases that redirect to /cs. The mod/plugin is op-gated on servers; on Bukkit it uses
the chunksmith.command.* permission namespace (legacy chunky.command.* still works).
Common workflow:
/cs world <world>- choose the target world (defaults to the current overworld)/cs spawnor/cs center <x> <z>- set the generation center/cs radius <blocks>- set the radius (or/cs worldborderto use the world border)/cs start- begin generating/cs pause//cs continue- pause and resume (progress is saved)/cs cancelthen/cs confirm- stop and discard the current/saved task
Generation is throttled automatically against server tick-health, so it can run while players are online.
Tuning
Every setting is readable and settable live with /cs set <key> [value] - no restart, no editing
files - and persists to config/chunksmith/config.json.
| Key | Default | What it does |
|---|---|---|
dispatchMaxConcurrent |
scales with CPU cores | How many chunk requests stay in flight. The single biggest throughput lever; 200 was the measured knee on an 8-core server. |
autoPauseOnOverload |
true |
Pause the run when the server cannot sustain it, resume when it recovers. |
autoPauseGraceSeconds |
120 |
How long the condition must hold, in both directions, before acting on it. |
throttleMaxHeapPercent |
85 |
Hold dispatch while the heap stays above this, resuming once there is real headroom again. |
pregenSettleMaxHeld |
256 |
How many finished chunks are held open at once so neighbouring structures can finish building. This is a memory setting: each held chunk keeps a worldgen context ring resident with it. |
License
GPL-3.0-only. Original Chunky (c) pop4959. Chunksmith modifications (c) Kishku7.
Ченджлог
3.13.0+26.x-pluginРелиз26.1.1, 26.1.2, 26.2 · 21 августа 2026 г.
The first release since 3.4.1. Versions 3.5.0 through 3.12.0 were built and tested in-house but never published, so everything they contain arrives here -- this entry covers the whole line. The short version: a pre-gen could hold the entire world open until the server died, and that is fixed; throughput on a multi-core server is up substantially; and the mod now tells you what it is doing instead of leaving you to infer it from tick times.
Fixed
A pre-gen could hold the entire world open, and the server would die to the tick watchdog. This is the headline fix. A held chunk does not cost one chunk: its ticket sits at FULL level and vanilla's distance manager propagates that level outward one ring at a time, so a single held ticket keeps a whole neighbourhood resident. Measured on a live 1.21.11 server, 20 held tickets held 3,507 resident chunks -- roughly 25 resident chunks per held ticket at pre-gen clustering. 3.4.1 had no cap on the settle frontier at all, which is how a real server reached 75,045 resident chunks, pinned its heap at 107% of an 8 GB
-Xmx, and collapsed to 5 chunks per second with a 42-hour ETA. The frontier is now bounded bypregenSettleMaxHeld(default 256), and memory is bounded directly bythrottleMaxHeapPercentrather than by any proxy.The unload backlog outlived the task that created it. Housekeeping was armed by a running task, so when a run paused or finished, whatever backlog remained was handed to vanilla's budgeted pass -- which does almost nothing once the tick is already over budget, and the tick was over budget precisely because of the retained chunks. The backlog was then permanent until a restart. Housekeeping is now armed while a BACKLOG exists, not while a task exists.
Three separate mechanisms were suppressing their own recovery. Releases are driven by new chunks arriving, so gating dispatch also stopped the releases that would have opened the gate; a gate holding dispatch was given the small unload budget, so nothing unloaded and it never reopened; and the settle frontier froze at its cap during a hold while holding the very tickets that blocked recovery. All three now release, drain and re-arm from the tick instead.
/cs debuganswered "An unexpected error occurred trying to execute that command". The residency snapshot contained a literal percent sign and the message path runs throughString.format./cs continuereported "Task already started!" while the previous run was still draining, leaving the operator with a stopped pre-gen and a message saying the opposite. It now says what is actually happening.The ticket diagnostics were compiled into the shared mixin but written against 1.21.11-and-newer shapes, so this whole line of work could only build for 1.21.11. They are now gated on the presence of those shapes and every supported version has a jar again.
A 26-line drift:
ChunkPosbecame a record and lost its packed-long constructor.Config range-clamp warnings went nowhere.
GsonConfigandTaskSchedulerlogged throughjava.util.logging, which no loader routes into the game log, so a clamped value was silently corrected with the explanation discarded. Both now use slf4j like the rest of the mod.
Added
dispatchMaxConcurrent-- how many chunk requests stay in flight, and the single biggest throughput lever in the mod. It was previously fixed at 50 and reachable only through an undocumentedchunksmith.maxWorkingCountsystem property. Nothing was saturated at that cap: CPU sat at 255 of 800 percent, workers at ~24 percent, the server thread at ~10. Measured on an 8-core dedicated server: 50 -> 31.6 chunks/sec, 200 -> 43.9, 600 -> 42.4. So 200 is the knee, worth +39 percent, and beyond it the remaining ceiling is vanilla promoting about 2.2 chunks per tick at 20 tps. The default now scales with the machine --min(400, max(50, cores * 25))-- with a floor of 50 so no server gets slower than it was. Live-settable with/cs set.A pre-gen now pauses when the server cannot sustain it, and resumes when it can.
autoPauseOnOverload(default true) andautoPauseGraceSeconds(default 120). A gated run on an overloaded server does not stop, it stutters -- measured at 60 chunks in two minutes, which is indistinguishable from a hang, keeps the server under load throughout, and produces nothing. Both directions require the condition to hold continuously for the grace period. A human/cs pauseoutranks it in both directions and is never auto-resumed.throttleMaxHeapPercent(default 85) bounds the run by measuring memory. Three earlier releases tried to bound a pre-gen with a proxy -- queued writes, LOD queue depth, resident chunks, chunks added since the run started -- and each was wrong on a live server in a different way. A chunk is worth wildly different amounts of heap depending on what came with it, so no chunk count means the same thing on two worlds.The mod now reports what it is doing.
/cs debugprints a chunk-residency snapshot, a ticket ledger, and an unload breakdown with a plain-English verdict; a drain logs one line when it starts and one when it ends, naming the outcome and how many chunks it freed, at WARNING level when chunks are left behind. Previously the only way to read residency at all was to set a low cap, start a run, and read the backpressure line -- which perturbs the thing being measured.
Changed
throttleMaxAddedChunksnow defaults to 0 (off). On a live server it closed at 22,000 chunks with the heap at 40 percent and stuttered a healthy run down to 60 chunks per two minutes. A pre-gen's resident set is its FULL chunks plus the mandatory worldgen context ring around each of them, and that frontier's perimeter legitimately grows with the radius. It remains available as an expert knob.The tick-budget baseline now requires 15 consecutive idle ticks, and probes every 60 seconds instead of 120. A one- or two-tick gap between chunks is not idle -- it is still paying for the chunk that just landed -- and sampling those taught the baseline the mod's own aftermath, observed as a baseline reading 49ms and then 116.8ms with no change in load.
The LOD startup message no longer claims LOD generation costs ~16 percent of pre-gen speed. It does not: measured over matched windows, 36.1 chunks/sec with LOD on against 34.2 with it off. The message now reports the measured cost as none.
The README documents nine config keys that previously had no documentation anywhere.
Removed
- The stale-ticket purge, and its
purgeStaleVanillaTicketsandstaleTicketThresholdkeys. A controlled A/B put residency at 16,800 with it on and 16,820 with it off -- a 0.1 percent difference -- while it evicted 10,765 tickets. It recovered nothing and was removed rather than kept as reassurance.
3.13.0+26.3Бета26.3-snapshot-7 · 21 августа 2026 г.
The first release since 3.4.1. Versions 3.5.0 through 3.12.0 were built and tested in-house but never published, so everything they contain arrives here -- this entry covers the whole line. The short version: a pre-gen could hold the entire world open until the server died, and that is fixed; throughput on a multi-core server is up substantially; and the mod now tells you what it is doing instead of leaving you to infer it from tick times.
Fixed
A pre-gen could hold the entire world open, and the server would die to the tick watchdog. This is the headline fix. A held chunk does not cost one chunk: its ticket sits at FULL level and vanilla's distance manager propagates that level outward one ring at a time, so a single held ticket keeps a whole neighbourhood resident. Measured on a live 1.21.11 server, 20 held tickets held 3,507 resident chunks -- roughly 25 resident chunks per held ticket at pre-gen clustering. 3.4.1 had no cap on the settle frontier at all, which is how a real server reached 75,045 resident chunks, pinned its heap at 107% of an 8 GB
-Xmx, and collapsed to 5 chunks per second with a 42-hour ETA. The frontier is now bounded bypregenSettleMaxHeld(default 256), and memory is bounded directly bythrottleMaxHeapPercentrather than by any proxy.The unload backlog outlived the task that created it. Housekeeping was armed by a running task, so when a run paused or finished, whatever backlog remained was handed to vanilla's budgeted pass -- which does almost nothing once the tick is already over budget, and the tick was over budget precisely because of the retained chunks. The backlog was then permanent until a restart. Housekeeping is now armed while a BACKLOG exists, not while a task exists.
Three separate mechanisms were suppressing their own recovery. Releases are driven by new chunks arriving, so gating dispatch also stopped the releases that would have opened the gate; a gate holding dispatch was given the small unload budget, so nothing unloaded and it never reopened; and the settle frontier froze at its cap during a hold while holding the very tickets that blocked recovery. All three now release, drain and re-arm from the tick instead.
/cs debuganswered "An unexpected error occurred trying to execute that command". The residency snapshot contained a literal percent sign and the message path runs throughString.format./cs continuereported "Task already started!" while the previous run was still draining, leaving the operator with a stopped pre-gen and a message saying the opposite. It now says what is actually happening.The ticket diagnostics were compiled into the shared mixin but written against 1.21.11-and-newer shapes, so this whole line of work could only build for 1.21.11. They are now gated on the presence of those shapes and every supported version has a jar again.
A 26-line drift:
ChunkPosbecame a record and lost its packed-long constructor.Config range-clamp warnings went nowhere.
GsonConfigandTaskSchedulerlogged throughjava.util.logging, which no loader routes into the game log, so a clamped value was silently corrected with the explanation discarded. Both now use slf4j like the rest of the mod.
Added
dispatchMaxConcurrent-- how many chunk requests stay in flight, and the single biggest throughput lever in the mod. It was previously fixed at 50 and reachable only through an undocumentedchunksmith.maxWorkingCountsystem property. Nothing was saturated at that cap: CPU sat at 255 of 800 percent, workers at ~24 percent, the server thread at ~10. Measured on an 8-core dedicated server: 50 -> 31.6 chunks/sec, 200 -> 43.9, 600 -> 42.4. So 200 is the knee, worth +39 percent, and beyond it the remaining ceiling is vanilla promoting about 2.2 chunks per tick at 20 tps. The default now scales with the machine --min(400, max(50, cores * 25))-- with a floor of 50 so no server gets slower than it was. Live-settable with/cs set.A pre-gen now pauses when the server cannot sustain it, and resumes when it can.
autoPauseOnOverload(default true) andautoPauseGraceSeconds(default 120). A gated run on an overloaded server does not stop, it stutters -- measured at 60 chunks in two minutes, which is indistinguishable from a hang, keeps the server under load throughout, and produces nothing. Both directions require the condition to hold continuously for the grace period. A human/cs pauseoutranks it in both directions and is never auto-resumed.throttleMaxHeapPercent(default 85) bounds the run by measuring memory. Three earlier releases tried to bound a pre-gen with a proxy -- queued writes, LOD queue depth, resident chunks, chunks added since the run started -- and each was wrong on a live server in a different way. A chunk is worth wildly different amounts of heap depending on what came with it, so no chunk count means the same thing on two worlds.The mod now reports what it is doing.
/cs debugprints a chunk-residency snapshot, a ticket ledger, and an unload breakdown with a plain-English verdict; a drain logs one line when it starts and one when it ends, naming the outcome and how many chunks it freed, at WARNING level when chunks are left behind. Previously the only way to read residency at all was to set a low cap, start a run, and read the backpressure line -- which perturbs the thing being measured.
Changed
throttleMaxAddedChunksnow defaults to 0 (off). On a live server it closed at 22,000 chunks with the heap at 40 percent and stuttered a healthy run down to 60 chunks per two minutes. A pre-gen's resident set is its FULL chunks plus the mandatory worldgen context ring around each of them, and that frontier's perimeter legitimately grows with the radius. It remains available as an expert knob.The tick-budget baseline now requires 15 consecutive idle ticks, and probes every 60 seconds instead of 120. A one- or two-tick gap between chunks is not idle -- it is still paying for the chunk that just landed -- and sampling those taught the baseline the mod's own aftermath, observed as a baseline reading 49ms and then 116.8ms with no change in load.
The LOD startup message no longer claims LOD generation costs ~16 percent of pre-gen speed. It does not: measured over matched windows, 36.1 chunks/sec with LOD on against 34.2 with it off. The message now reports the measured cost as none.
The README documents nine config keys that previously had no documentation anywhere.
Removed
- The stale-ticket purge, and its
purgeStaleVanillaTicketsandstaleTicketThresholdkeys. A controlled A/B put residency at 16,800 with it on and 16,820 with it off -- a 0.1 percent difference -- while it evicted 10,765 tickets. It recovered nothing and was removed rather than kept as reassurance.
3.13.0+26.2Релиз26.2 · 21 августа 2026 г.
The first release since 3.4.1. Versions 3.5.0 through 3.12.0 were built and tested in-house but never published, so everything they contain arrives here -- this entry covers the whole line. The short version: a pre-gen could hold the entire world open until the server died, and that is fixed; throughput on a multi-core server is up substantially; and the mod now tells you what it is doing instead of leaving you to infer it from tick times.
Fixed
A pre-gen could hold the entire world open, and the server would die to the tick watchdog. This is the headline fix. A held chunk does not cost one chunk: its ticket sits at FULL level and vanilla's distance manager propagates that level outward one ring at a time, so a single held ticket keeps a whole neighbourhood resident. Measured on a live 1.21.11 server, 20 held tickets held 3,507 resident chunks -- roughly 25 resident chunks per held ticket at pre-gen clustering. 3.4.1 had no cap on the settle frontier at all, which is how a real server reached 75,045 resident chunks, pinned its heap at 107% of an 8 GB
-Xmx, and collapsed to 5 chunks per second with a 42-hour ETA. The frontier is now bounded bypregenSettleMaxHeld(default 256), and memory is bounded directly bythrottleMaxHeapPercentrather than by any proxy.The unload backlog outlived the task that created it. Housekeeping was armed by a running task, so when a run paused or finished, whatever backlog remained was handed to vanilla's budgeted pass -- which does almost nothing once the tick is already over budget, and the tick was over budget precisely because of the retained chunks. The backlog was then permanent until a restart. Housekeeping is now armed while a BACKLOG exists, not while a task exists.
Three separate mechanisms were suppressing their own recovery. Releases are driven by new chunks arriving, so gating dispatch also stopped the releases that would have opened the gate; a gate holding dispatch was given the small unload budget, so nothing unloaded and it never reopened; and the settle frontier froze at its cap during a hold while holding the very tickets that blocked recovery. All three now release, drain and re-arm from the tick instead.
/cs debuganswered "An unexpected error occurred trying to execute that command". The residency snapshot contained a literal percent sign and the message path runs throughString.format./cs continuereported "Task already started!" while the previous run was still draining, leaving the operator with a stopped pre-gen and a message saying the opposite. It now says what is actually happening.The ticket diagnostics were compiled into the shared mixin but written against 1.21.11-and-newer shapes, so this whole line of work could only build for 1.21.11. They are now gated on the presence of those shapes and every supported version has a jar again.
A 26-line drift:
ChunkPosbecame a record and lost its packed-long constructor.Config range-clamp warnings went nowhere.
GsonConfigandTaskSchedulerlogged throughjava.util.logging, which no loader routes into the game log, so a clamped value was silently corrected with the explanation discarded. Both now use slf4j like the rest of the mod.
Added
dispatchMaxConcurrent-- how many chunk requests stay in flight, and the single biggest throughput lever in the mod. It was previously fixed at 50 and reachable only through an undocumentedchunksmith.maxWorkingCountsystem property. Nothing was saturated at that cap: CPU sat at 255 of 800 percent, workers at ~24 percent, the server thread at ~10. Measured on an 8-core dedicated server: 50 -> 31.6 chunks/sec, 200 -> 43.9, 600 -> 42.4. So 200 is the knee, worth +39 percent, and beyond it the remaining ceiling is vanilla promoting about 2.2 chunks per tick at 20 tps. The default now scales with the machine --min(400, max(50, cores * 25))-- with a floor of 50 so no server gets slower than it was. Live-settable with/cs set.A pre-gen now pauses when the server cannot sustain it, and resumes when it can.
autoPauseOnOverload(default true) andautoPauseGraceSeconds(default 120). A gated run on an overloaded server does not stop, it stutters -- measured at 60 chunks in two minutes, which is indistinguishable from a hang, keeps the server under load throughout, and produces nothing. Both directions require the condition to hold continuously for the grace period. A human/cs pauseoutranks it in both directions and is never auto-resumed.throttleMaxHeapPercent(default 85) bounds the run by measuring memory. Three earlier releases tried to bound a pre-gen with a proxy -- queued writes, LOD queue depth, resident chunks, chunks added since the run started -- and each was wrong on a live server in a different way. A chunk is worth wildly different amounts of heap depending on what came with it, so no chunk count means the same thing on two worlds.The mod now reports what it is doing.
/cs debugprints a chunk-residency snapshot, a ticket ledger, and an unload breakdown with a plain-English verdict; a drain logs one line when it starts and one when it ends, naming the outcome and how many chunks it freed, at WARNING level when chunks are left behind. Previously the only way to read residency at all was to set a low cap, start a run, and read the backpressure line -- which perturbs the thing being measured.
Changed
throttleMaxAddedChunksnow defaults to 0 (off). On a live server it closed at 22,000 chunks with the heap at 40 percent and stuttered a healthy run down to 60 chunks per two minutes. A pre-gen's resident set is its FULL chunks plus the mandatory worldgen context ring around each of them, and that frontier's perimeter legitimately grows with the radius. It remains available as an expert knob.The tick-budget baseline now requires 15 consecutive idle ticks, and probes every 60 seconds instead of 120. A one- or two-tick gap between chunks is not idle -- it is still paying for the chunk that just landed -- and sampling those taught the baseline the mod's own aftermath, observed as a baseline reading 49ms and then 116.8ms with no change in load.
The LOD startup message no longer claims LOD generation costs ~16 percent of pre-gen speed. It does not: measured over matched windows, 36.1 chunks/sec with LOD on against 34.2 with it off. The message now reports the measured cost as none.
The README documents nine config keys that previously had no documentation anywhere.
Removed
- The stale-ticket purge, and its
purgeStaleVanillaTicketsandstaleTicketThresholdkeys. A controlled A/B put residency at 16,800 with it on and 16,820 with it off -- a 0.1 percent difference -- while it evicted 10,765 tickets. It recovered nothing and was removed rather than kept as reassurance.
3.13.0+26.2-neoforgeРелиз26.2 · 21 августа 2026 г.
The first release since 3.4.1. Versions 3.5.0 through 3.12.0 were built and tested in-house but never published, so everything they contain arrives here -- this entry covers the whole line. The short version: a pre-gen could hold the entire world open until the server died, and that is fixed; throughput on a multi-core server is up substantially; and the mod now tells you what it is doing instead of leaving you to infer it from tick times.
Fixed
A pre-gen could hold the entire world open, and the server would die to the tick watchdog. This is the headline fix. A held chunk does not cost one chunk: its ticket sits at FULL level and vanilla's distance manager propagates that level outward one ring at a time, so a single held ticket keeps a whole neighbourhood resident. Measured on a live 1.21.11 server, 20 held tickets held 3,507 resident chunks -- roughly 25 resident chunks per held ticket at pre-gen clustering. 3.4.1 had no cap on the settle frontier at all, which is how a real server reached 75,045 resident chunks, pinned its heap at 107% of an 8 GB
-Xmx, and collapsed to 5 chunks per second with a 42-hour ETA. The frontier is now bounded bypregenSettleMaxHeld(default 256), and memory is bounded directly bythrottleMaxHeapPercentrather than by any proxy.The unload backlog outlived the task that created it. Housekeeping was armed by a running task, so when a run paused or finished, whatever backlog remained was handed to vanilla's budgeted pass -- which does almost nothing once the tick is already over budget, and the tick was over budget precisely because of the retained chunks. The backlog was then permanent until a restart. Housekeeping is now armed while a BACKLOG exists, not while a task exists.
Three separate mechanisms were suppressing their own recovery. Releases are driven by new chunks arriving, so gating dispatch also stopped the releases that would have opened the gate; a gate holding dispatch was given the small unload budget, so nothing unloaded and it never reopened; and the settle frontier froze at its cap during a hold while holding the very tickets that blocked recovery. All three now release, drain and re-arm from the tick instead.
/cs debuganswered "An unexpected error occurred trying to execute that command". The residency snapshot contained a literal percent sign and the message path runs throughString.format./cs continuereported "Task already started!" while the previous run was still draining, leaving the operator with a stopped pre-gen and a message saying the opposite. It now says what is actually happening.The ticket diagnostics were compiled into the shared mixin but written against 1.21.11-and-newer shapes, so this whole line of work could only build for 1.21.11. They are now gated on the presence of those shapes and every supported version has a jar again.
A 26-line drift:
ChunkPosbecame a record and lost its packed-long constructor.Config range-clamp warnings went nowhere.
GsonConfigandTaskSchedulerlogged throughjava.util.logging, which no loader routes into the game log, so a clamped value was silently corrected with the explanation discarded. Both now use slf4j like the rest of the mod.
Added
dispatchMaxConcurrent-- how many chunk requests stay in flight, and the single biggest throughput lever in the mod. It was previously fixed at 50 and reachable only through an undocumentedchunksmith.maxWorkingCountsystem property. Nothing was saturated at that cap: CPU sat at 255 of 800 percent, workers at ~24 percent, the server thread at ~10. Measured on an 8-core dedicated server: 50 -> 31.6 chunks/sec, 200 -> 43.9, 600 -> 42.4. So 200 is the knee, worth +39 percent, and beyond it the remaining ceiling is vanilla promoting about 2.2 chunks per tick at 20 tps. The default now scales with the machine --min(400, max(50, cores * 25))-- with a floor of 50 so no server gets slower than it was. Live-settable with/cs set.A pre-gen now pauses when the server cannot sustain it, and resumes when it can.
autoPauseOnOverload(default true) andautoPauseGraceSeconds(default 120). A gated run on an overloaded server does not stop, it stutters -- measured at 60 chunks in two minutes, which is indistinguishable from a hang, keeps the server under load throughout, and produces nothing. Both directions require the condition to hold continuously for the grace period. A human/cs pauseoutranks it in both directions and is never auto-resumed.throttleMaxHeapPercent(default 85) bounds the run by measuring memory. Three earlier releases tried to bound a pre-gen with a proxy -- queued writes, LOD queue depth, resident chunks, chunks added since the run started -- and each was wrong on a live server in a different way. A chunk is worth wildly different amounts of heap depending on what came with it, so no chunk count means the same thing on two worlds.The mod now reports what it is doing.
/cs debugprints a chunk-residency snapshot, a ticket ledger, and an unload breakdown with a plain-English verdict; a drain logs one line when it starts and one when it ends, naming the outcome and how many chunks it freed, at WARNING level when chunks are left behind. Previously the only way to read residency at all was to set a low cap, start a run, and read the backpressure line -- which perturbs the thing being measured.
Changed
throttleMaxAddedChunksnow defaults to 0 (off). On a live server it closed at 22,000 chunks with the heap at 40 percent and stuttered a healthy run down to 60 chunks per two minutes. A pre-gen's resident set is its FULL chunks plus the mandatory worldgen context ring around each of them, and that frontier's perimeter legitimately grows with the radius. It remains available as an expert knob.The tick-budget baseline now requires 15 consecutive idle ticks, and probes every 60 seconds instead of 120. A one- or two-tick gap between chunks is not idle -- it is still paying for the chunk that just landed -- and sampling those taught the baseline the mod's own aftermath, observed as a baseline reading 49ms and then 116.8ms with no change in load.
The LOD startup message no longer claims LOD generation costs ~16 percent of pre-gen speed. It does not: measured over matched windows, 36.1 chunks/sec with LOD on against 34.2 with it off. The message now reports the measured cost as none.
The README documents nine config keys that previously had no documentation anywhere.
Removed
- The stale-ticket purge, and its
purgeStaleVanillaTicketsandstaleTicketThresholdkeys. A controlled A/B put residency at 16,800 with it on and 16,820 with it off -- a 0.1 percent difference -- while it evicted 10,765 tickets. It recovered nothing and was removed rather than kept as reassurance.
3.13.0+26.1Релиз26.1, 26.1.1, 26.1.2 · 21 августа 2026 г.
The first release since 3.4.1. Versions 3.5.0 through 3.12.0 were built and tested in-house but never published, so everything they contain arrives here -- this entry covers the whole line. The short version: a pre-gen could hold the entire world open until the server died, and that is fixed; throughput on a multi-core server is up substantially; and the mod now tells you what it is doing instead of leaving you to infer it from tick times.
Fixed
A pre-gen could hold the entire world open, and the server would die to the tick watchdog. This is the headline fix. A held chunk does not cost one chunk: its ticket sits at FULL level and vanilla's distance manager propagates that level outward one ring at a time, so a single held ticket keeps a whole neighbourhood resident. Measured on a live 1.21.11 server, 20 held tickets held 3,507 resident chunks -- roughly 25 resident chunks per held ticket at pre-gen clustering. 3.4.1 had no cap on the settle frontier at all, which is how a real server reached 75,045 resident chunks, pinned its heap at 107% of an 8 GB
-Xmx, and collapsed to 5 chunks per second with a 42-hour ETA. The frontier is now bounded bypregenSettleMaxHeld(default 256), and memory is bounded directly bythrottleMaxHeapPercentrather than by any proxy.The unload backlog outlived the task that created it. Housekeeping was armed by a running task, so when a run paused or finished, whatever backlog remained was handed to vanilla's budgeted pass -- which does almost nothing once the tick is already over budget, and the tick was over budget precisely because of the retained chunks. The backlog was then permanent until a restart. Housekeeping is now armed while a BACKLOG exists, not while a task exists.
Three separate mechanisms were suppressing their own recovery. Releases are driven by new chunks arriving, so gating dispatch also stopped the releases that would have opened the gate; a gate holding dispatch was given the small unload budget, so nothing unloaded and it never reopened; and the settle frontier froze at its cap during a hold while holding the very tickets that blocked recovery. All three now release, drain and re-arm from the tick instead.
/cs debuganswered "An unexpected error occurred trying to execute that command". The residency snapshot contained a literal percent sign and the message path runs throughString.format./cs continuereported "Task already started!" while the previous run was still draining, leaving the operator with a stopped pre-gen and a message saying the opposite. It now says what is actually happening.The ticket diagnostics were compiled into the shared mixin but written against 1.21.11-and-newer shapes, so this whole line of work could only build for 1.21.11. They are now gated on the presence of those shapes and every supported version has a jar again.
A 26-line drift:
ChunkPosbecame a record and lost its packed-long constructor.Config range-clamp warnings went nowhere.
GsonConfigandTaskSchedulerlogged throughjava.util.logging, which no loader routes into the game log, so a clamped value was silently corrected with the explanation discarded. Both now use slf4j like the rest of the mod.
Added
dispatchMaxConcurrent-- how many chunk requests stay in flight, and the single biggest throughput lever in the mod. It was previously fixed at 50 and reachable only through an undocumentedchunksmith.maxWorkingCountsystem property. Nothing was saturated at that cap: CPU sat at 255 of 800 percent, workers at ~24 percent, the server thread at ~10. Measured on an 8-core dedicated server: 50 -> 31.6 chunks/sec, 200 -> 43.9, 600 -> 42.4. So 200 is the knee, worth +39 percent, and beyond it the remaining ceiling is vanilla promoting about 2.2 chunks per tick at 20 tps. The default now scales with the machine --min(400, max(50, cores * 25))-- with a floor of 50 so no server gets slower than it was. Live-settable with/cs set.A pre-gen now pauses when the server cannot sustain it, and resumes when it can.
autoPauseOnOverload(default true) andautoPauseGraceSeconds(default 120). A gated run on an overloaded server does not stop, it stutters -- measured at 60 chunks in two minutes, which is indistinguishable from a hang, keeps the server under load throughout, and produces nothing. Both directions require the condition to hold continuously for the grace period. A human/cs pauseoutranks it in both directions and is never auto-resumed.throttleMaxHeapPercent(default 85) bounds the run by measuring memory. Three earlier releases tried to bound a pre-gen with a proxy -- queued writes, LOD queue depth, resident chunks, chunks added since the run started -- and each was wrong on a live server in a different way. A chunk is worth wildly different amounts of heap depending on what came with it, so no chunk count means the same thing on two worlds.The mod now reports what it is doing.
/cs debugprints a chunk-residency snapshot, a ticket ledger, and an unload breakdown with a plain-English verdict; a drain logs one line when it starts and one when it ends, naming the outcome and how many chunks it freed, at WARNING level when chunks are left behind. Previously the only way to read residency at all was to set a low cap, start a run, and read the backpressure line -- which perturbs the thing being measured.
Changed
throttleMaxAddedChunksnow defaults to 0 (off). On a live server it closed at 22,000 chunks with the heap at 40 percent and stuttered a healthy run down to 60 chunks per two minutes. A pre-gen's resident set is its FULL chunks plus the mandatory worldgen context ring around each of them, and that frontier's perimeter legitimately grows with the radius. It remains available as an expert knob.The tick-budget baseline now requires 15 consecutive idle ticks, and probes every 60 seconds instead of 120. A one- or two-tick gap between chunks is not idle -- it is still paying for the chunk that just landed -- and sampling those taught the baseline the mod's own aftermath, observed as a baseline reading 49ms and then 116.8ms with no change in load.
The LOD startup message no longer claims LOD generation costs ~16 percent of pre-gen speed. It does not: measured over matched windows, 36.1 chunks/sec with LOD on against 34.2 with it off. The message now reports the measured cost as none.
The README documents nine config keys that previously had no documentation anywhere.
Removed
- The stale-ticket purge, and its
purgeStaleVanillaTicketsandstaleTicketThresholdkeys. A controlled A/B put residency at 16,800 with it on and 16,820 with it off -- a 0.1 percent difference -- while it evicted 10,765 tickets. It recovered nothing and was removed rather than kept as reassurance.
3.13.0+26.1-neoforgeРелиз26.1, 26.1.1, 26.1.2 · 21 августа 2026 г.
The first release since 3.4.1. Versions 3.5.0 through 3.12.0 were built and tested in-house but never published, so everything they contain arrives here -- this entry covers the whole line. The short version: a pre-gen could hold the entire world open until the server died, and that is fixed; throughput on a multi-core server is up substantially; and the mod now tells you what it is doing instead of leaving you to infer it from tick times.
Fixed
A pre-gen could hold the entire world open, and the server would die to the tick watchdog. This is the headline fix. A held chunk does not cost one chunk: its ticket sits at FULL level and vanilla's distance manager propagates that level outward one ring at a time, so a single held ticket keeps a whole neighbourhood resident. Measured on a live 1.21.11 server, 20 held tickets held 3,507 resident chunks -- roughly 25 resident chunks per held ticket at pre-gen clustering. 3.4.1 had no cap on the settle frontier at all, which is how a real server reached 75,045 resident chunks, pinned its heap at 107% of an 8 GB
-Xmx, and collapsed to 5 chunks per second with a 42-hour ETA. The frontier is now bounded bypregenSettleMaxHeld(default 256), and memory is bounded directly bythrottleMaxHeapPercentrather than by any proxy.The unload backlog outlived the task that created it. Housekeeping was armed by a running task, so when a run paused or finished, whatever backlog remained was handed to vanilla's budgeted pass -- which does almost nothing once the tick is already over budget, and the tick was over budget precisely because of the retained chunks. The backlog was then permanent until a restart. Housekeeping is now armed while a BACKLOG exists, not while a task exists.
Three separate mechanisms were suppressing their own recovery. Releases are driven by new chunks arriving, so gating dispatch also stopped the releases that would have opened the gate; a gate holding dispatch was given the small unload budget, so nothing unloaded and it never reopened; and the settle frontier froze at its cap during a hold while holding the very tickets that blocked recovery. All three now release, drain and re-arm from the tick instead.
/cs debuganswered "An unexpected error occurred trying to execute that command". The residency snapshot contained a literal percent sign and the message path runs throughString.format./cs continuereported "Task already started!" while the previous run was still draining, leaving the operator with a stopped pre-gen and a message saying the opposite. It now says what is actually happening.The ticket diagnostics were compiled into the shared mixin but written against 1.21.11-and-newer shapes, so this whole line of work could only build for 1.21.11. They are now gated on the presence of those shapes and every supported version has a jar again.
A 26-line drift:
ChunkPosbecame a record and lost its packed-long constructor.Config range-clamp warnings went nowhere.
GsonConfigandTaskSchedulerlogged throughjava.util.logging, which no loader routes into the game log, so a clamped value was silently corrected with the explanation discarded. Both now use slf4j like the rest of the mod.
Added
dispatchMaxConcurrent-- how many chunk requests stay in flight, and the single biggest throughput lever in the mod. It was previously fixed at 50 and reachable only through an undocumentedchunksmith.maxWorkingCountsystem property. Nothing was saturated at that cap: CPU sat at 255 of 800 percent, workers at ~24 percent, the server thread at ~10. Measured on an 8-core dedicated server: 50 -> 31.6 chunks/sec, 200 -> 43.9, 600 -> 42.4. So 200 is the knee, worth +39 percent, and beyond it the remaining ceiling is vanilla promoting about 2.2 chunks per tick at 20 tps. The default now scales with the machine --min(400, max(50, cores * 25))-- with a floor of 50 so no server gets slower than it was. Live-settable with/cs set.A pre-gen now pauses when the server cannot sustain it, and resumes when it can.
autoPauseOnOverload(default true) andautoPauseGraceSeconds(default 120). A gated run on an overloaded server does not stop, it stutters -- measured at 60 chunks in two minutes, which is indistinguishable from a hang, keeps the server under load throughout, and produces nothing. Both directions require the condition to hold continuously for the grace period. A human/cs pauseoutranks it in both directions and is never auto-resumed.throttleMaxHeapPercent(default 85) bounds the run by measuring memory. Three earlier releases tried to bound a pre-gen with a proxy -- queued writes, LOD queue depth, resident chunks, chunks added since the run started -- and each was wrong on a live server in a different way. A chunk is worth wildly different amounts of heap depending on what came with it, so no chunk count means the same thing on two worlds.The mod now reports what it is doing.
/cs debugprints a chunk-residency snapshot, a ticket ledger, and an unload breakdown with a plain-English verdict; a drain logs one line when it starts and one when it ends, naming the outcome and how many chunks it freed, at WARNING level when chunks are left behind. Previously the only way to read residency at all was to set a low cap, start a run, and read the backpressure line -- which perturbs the thing being measured.
Changed
throttleMaxAddedChunksnow defaults to 0 (off). On a live server it closed at 22,000 chunks with the heap at 40 percent and stuttered a healthy run down to 60 chunks per two minutes. A pre-gen's resident set is its FULL chunks plus the mandatory worldgen context ring around each of them, and that frontier's perimeter legitimately grows with the radius. It remains available as an expert knob.The tick-budget baseline now requires 15 consecutive idle ticks, and probes every 60 seconds instead of 120. A one- or two-tick gap between chunks is not idle -- it is still paying for the chunk that just landed -- and sampling those taught the baseline the mod's own aftermath, observed as a baseline reading 49ms and then 116.8ms with no change in load.
The LOD startup message no longer claims LOD generation costs ~16 percent of pre-gen speed. It does not: measured over matched windows, 36.1 chunks/sec with LOD on against 34.2 with it off. The message now reports the measured cost as none.
The README documents nine config keys that previously had no documentation anywhere.
Removed
- The stale-ticket purge, and its
purgeStaleVanillaTicketsandstaleTicketThresholdkeys. A controlled A/B put residency at 16,800 with it on and 16,820 with it off -- a 0.1 percent difference -- while it evicted 10,765 tickets. It recovered nothing and was removed rather than kept as reassurance.
3.13.0+1.21.x-pluginРелиз1.21.9, 1.21.10, 1.21.11 · 21 августа 2026 г.
The first release since 3.4.1. Versions 3.5.0 through 3.12.0 were built and tested in-house but never published, so everything they contain arrives here -- this entry covers the whole line. The short version: a pre-gen could hold the entire world open until the server died, and that is fixed; throughput on a multi-core server is up substantially; and the mod now tells you what it is doing instead of leaving you to infer it from tick times.
Fixed
A pre-gen could hold the entire world open, and the server would die to the tick watchdog. This is the headline fix. A held chunk does not cost one chunk: its ticket sits at FULL level and vanilla's distance manager propagates that level outward one ring at a time, so a single held ticket keeps a whole neighbourhood resident. Measured on a live 1.21.11 server, 20 held tickets held 3,507 resident chunks -- roughly 25 resident chunks per held ticket at pre-gen clustering. 3.4.1 had no cap on the settle frontier at all, which is how a real server reached 75,045 resident chunks, pinned its heap at 107% of an 8 GB
-Xmx, and collapsed to 5 chunks per second with a 42-hour ETA. The frontier is now bounded bypregenSettleMaxHeld(default 256), and memory is bounded directly bythrottleMaxHeapPercentrather than by any proxy.The unload backlog outlived the task that created it. Housekeeping was armed by a running task, so when a run paused or finished, whatever backlog remained was handed to vanilla's budgeted pass -- which does almost nothing once the tick is already over budget, and the tick was over budget precisely because of the retained chunks. The backlog was then permanent until a restart. Housekeeping is now armed while a BACKLOG exists, not while a task exists.
Three separate mechanisms were suppressing their own recovery. Releases are driven by new chunks arriving, so gating dispatch also stopped the releases that would have opened the gate; a gate holding dispatch was given the small unload budget, so nothing unloaded and it never reopened; and the settle frontier froze at its cap during a hold while holding the very tickets that blocked recovery. All three now release, drain and re-arm from the tick instead.
/cs debuganswered "An unexpected error occurred trying to execute that command". The residency snapshot contained a literal percent sign and the message path runs throughString.format./cs continuereported "Task already started!" while the previous run was still draining, leaving the operator with a stopped pre-gen and a message saying the opposite. It now says what is actually happening.The ticket diagnostics were compiled into the shared mixin but written against 1.21.11-and-newer shapes, so this whole line of work could only build for 1.21.11. They are now gated on the presence of those shapes and every supported version has a jar again.
A 26-line drift:
ChunkPosbecame a record and lost its packed-long constructor.Config range-clamp warnings went nowhere.
GsonConfigandTaskSchedulerlogged throughjava.util.logging, which no loader routes into the game log, so a clamped value was silently corrected with the explanation discarded. Both now use slf4j like the rest of the mod.
Added
dispatchMaxConcurrent-- how many chunk requests stay in flight, and the single biggest throughput lever in the mod. It was previously fixed at 50 and reachable only through an undocumentedchunksmith.maxWorkingCountsystem property. Nothing was saturated at that cap: CPU sat at 255 of 800 percent, workers at ~24 percent, the server thread at ~10. Measured on an 8-core dedicated server: 50 -> 31.6 chunks/sec, 200 -> 43.9, 600 -> 42.4. So 200 is the knee, worth +39 percent, and beyond it the remaining ceiling is vanilla promoting about 2.2 chunks per tick at 20 tps. The default now scales with the machine --min(400, max(50, cores * 25))-- with a floor of 50 so no server gets slower than it was. Live-settable with/cs set.A pre-gen now pauses when the server cannot sustain it, and resumes when it can.
autoPauseOnOverload(default true) andautoPauseGraceSeconds(default 120). A gated run on an overloaded server does not stop, it stutters -- measured at 60 chunks in two minutes, which is indistinguishable from a hang, keeps the server under load throughout, and produces nothing. Both directions require the condition to hold continuously for the grace period. A human/cs pauseoutranks it in both directions and is never auto-resumed.throttleMaxHeapPercent(default 85) bounds the run by measuring memory. Three earlier releases tried to bound a pre-gen with a proxy -- queued writes, LOD queue depth, resident chunks, chunks added since the run started -- and each was wrong on a live server in a different way. A chunk is worth wildly different amounts of heap depending on what came with it, so no chunk count means the same thing on two worlds.The mod now reports what it is doing.
/cs debugprints a chunk-residency snapshot, a ticket ledger, and an unload breakdown with a plain-English verdict; a drain logs one line when it starts and one when it ends, naming the outcome and how many chunks it freed, at WARNING level when chunks are left behind. Previously the only way to read residency at all was to set a low cap, start a run, and read the backpressure line -- which perturbs the thing being measured.
Changed
throttleMaxAddedChunksnow defaults to 0 (off). On a live server it closed at 22,000 chunks with the heap at 40 percent and stuttered a healthy run down to 60 chunks per two minutes. A pre-gen's resident set is its FULL chunks plus the mandatory worldgen context ring around each of them, and that frontier's perimeter legitimately grows with the radius. It remains available as an expert knob.The tick-budget baseline now requires 15 consecutive idle ticks, and probes every 60 seconds instead of 120. A one- or two-tick gap between chunks is not idle -- it is still paying for the chunk that just landed -- and sampling those taught the baseline the mod's own aftermath, observed as a baseline reading 49ms and then 116.8ms with no change in load.
The LOD startup message no longer claims LOD generation costs ~16 percent of pre-gen speed. It does not: measured over matched windows, 36.1 chunks/sec with LOD on against 34.2 with it off. The message now reports the measured cost as none.
The README documents nine config keys that previously had no documentation anywhere.
Removed
- The stale-ticket purge, and its
purgeStaleVanillaTicketsandstaleTicketThresholdkeys. A controlled A/B put residency at 16,800 with it on and 16,820 with it off -- a 0.1 percent difference -- while it evicted 10,765 tickets. It recovered nothing and was removed rather than kept as reassurance.
3.13.0+1.21.8Релиз1.21.6, 1.21.7, 1.21.8 · 21 августа 2026 г.
The first release since 3.4.1. Versions 3.5.0 through 3.12.0 were built and tested in-house but never published, so everything they contain arrives here -- this entry covers the whole line. The short version: a pre-gen could hold the entire world open until the server died, and that is fixed; throughput on a multi-core server is up substantially; and the mod now tells you what it is doing instead of leaving you to infer it from tick times.
Fixed
A pre-gen could hold the entire world open, and the server would die to the tick watchdog. This is the headline fix. A held chunk does not cost one chunk: its ticket sits at FULL level and vanilla's distance manager propagates that level outward one ring at a time, so a single held ticket keeps a whole neighbourhood resident. Measured on a live 1.21.11 server, 20 held tickets held 3,507 resident chunks -- roughly 25 resident chunks per held ticket at pre-gen clustering. 3.4.1 had no cap on the settle frontier at all, which is how a real server reached 75,045 resident chunks, pinned its heap at 107% of an 8 GB
-Xmx, and collapsed to 5 chunks per second with a 42-hour ETA. The frontier is now bounded bypregenSettleMaxHeld(default 256), and memory is bounded directly bythrottleMaxHeapPercentrather than by any proxy.The unload backlog outlived the task that created it. Housekeeping was armed by a running task, so when a run paused or finished, whatever backlog remained was handed to vanilla's budgeted pass -- which does almost nothing once the tick is already over budget, and the tick was over budget precisely because of the retained chunks. The backlog was then permanent until a restart. Housekeeping is now armed while a BACKLOG exists, not while a task exists.
Three separate mechanisms were suppressing their own recovery. Releases are driven by new chunks arriving, so gating dispatch also stopped the releases that would have opened the gate; a gate holding dispatch was given the small unload budget, so nothing unloaded and it never reopened; and the settle frontier froze at its cap during a hold while holding the very tickets that blocked recovery. All three now release, drain and re-arm from the tick instead.
/cs debuganswered "An unexpected error occurred trying to execute that command". The residency snapshot contained a literal percent sign and the message path runs throughString.format./cs continuereported "Task already started!" while the previous run was still draining, leaving the operator with a stopped pre-gen and a message saying the opposite. It now says what is actually happening.The ticket diagnostics were compiled into the shared mixin but written against 1.21.11-and-newer shapes, so this whole line of work could only build for 1.21.11. They are now gated on the presence of those shapes and every supported version has a jar again.
A 26-line drift:
ChunkPosbecame a record and lost its packed-long constructor.Config range-clamp warnings went nowhere.
GsonConfigandTaskSchedulerlogged throughjava.util.logging, which no loader routes into the game log, so a clamped value was silently corrected with the explanation discarded. Both now use slf4j like the rest of the mod.
Added
dispatchMaxConcurrent-- how many chunk requests stay in flight, and the single biggest throughput lever in the mod. It was previously fixed at 50 and reachable only through an undocumentedchunksmith.maxWorkingCountsystem property. Nothing was saturated at that cap: CPU sat at 255 of 800 percent, workers at ~24 percent, the server thread at ~10. Measured on an 8-core dedicated server: 50 -> 31.6 chunks/sec, 200 -> 43.9, 600 -> 42.4. So 200 is the knee, worth +39 percent, and beyond it the remaining ceiling is vanilla promoting about 2.2 chunks per tick at 20 tps. The default now scales with the machine --min(400, max(50, cores * 25))-- with a floor of 50 so no server gets slower than it was. Live-settable with/cs set.A pre-gen now pauses when the server cannot sustain it, and resumes when it can.
autoPauseOnOverload(default true) andautoPauseGraceSeconds(default 120). A gated run on an overloaded server does not stop, it stutters -- measured at 60 chunks in two minutes, which is indistinguishable from a hang, keeps the server under load throughout, and produces nothing. Both directions require the condition to hold continuously for the grace period. A human/cs pauseoutranks it in both directions and is never auto-resumed.throttleMaxHeapPercent(default 85) bounds the run by measuring memory. Three earlier releases tried to bound a pre-gen with a proxy -- queued writes, LOD queue depth, resident chunks, chunks added since the run started -- and each was wrong on a live server in a different way. A chunk is worth wildly different amounts of heap depending on what came with it, so no chunk count means the same thing on two worlds.The mod now reports what it is doing.
/cs debugprints a chunk-residency snapshot, a ticket ledger, and an unload breakdown with a plain-English verdict; a drain logs one line when it starts and one when it ends, naming the outcome and how many chunks it freed, at WARNING level when chunks are left behind. Previously the only way to read residency at all was to set a low cap, start a run, and read the backpressure line -- which perturbs the thing being measured.
Changed
throttleMaxAddedChunksnow defaults to 0 (off). On a live server it closed at 22,000 chunks with the heap at 40 percent and stuttered a healthy run down to 60 chunks per two minutes. A pre-gen's resident set is its FULL chunks plus the mandatory worldgen context ring around each of them, and that frontier's perimeter legitimately grows with the radius. It remains available as an expert knob.The tick-budget baseline now requires 15 consecutive idle ticks, and probes every 60 seconds instead of 120. A one- or two-tick gap between chunks is not idle -- it is still paying for the chunk that just landed -- and sampling those taught the baseline the mod's own aftermath, observed as a baseline reading 49ms and then 116.8ms with no change in load.
The LOD startup message no longer claims LOD generation costs ~16 percent of pre-gen speed. It does not: measured over matched windows, 36.1 chunks/sec with LOD on against 34.2 with it off. The message now reports the measured cost as none.
The README documents nine config keys that previously had no documentation anywhere.
Removed
- The stale-ticket purge, and its
purgeStaleVanillaTicketsandstaleTicketThresholdkeys. A controlled A/B put residency at 16,800 with it on and 16,820 with it off -- a 0.1 percent difference -- while it evicted 10,765 tickets. It recovered nothing and was removed rather than kept as reassurance.
Комментарии
Загружаем…