MeowMC

World keys

Every key declared in meowmc-world-defaults.yml, with its default and its status. A world overrides any of these by writing only the keys that differ into <world>/meowmc-world.yml — see files and precedence.

How to read the Status column

wired — code reads the key today. declared — the field exists, the file parses it, no code reads it yet; setting it changes nothing on the server. No default is a promise about behaviour until the code behind it has passed its gate.

exec

| Key | Default | Status | Notes | | --- | --- | --- | --- | | exec.mode | inherit | wired | The one INHERIT-able world key. A concrete mode different from global is a startup error, not a per-world grant. | | exec.region-grid-exponent | inherit | declared | 3 gives 64-chunk sections for hub worlds. |

world — thread pools and budgets

| Key | Default | Status | Notes | | --- | --- | --- | --- | | world.io-threads | -1 | declared | -1 = auto max(2, cores/8), clamped [1, 16]. Upstream's default is 1; this is a capacity change, not a behaviour change. | | world.worker-threads | -1 | declared | -1 = auto = cores/4 (upstream's value, unchanged; -DPaper.WorkerThreadCount still honoured). | | world.serialization-pool | -1 | declared | -1 = auto = cores/4. | | world.max-tick-distance-area | 0 | declared | 0 = unlimited. The budget that stops a thousand players each setting /viewdistance 32. | | world.unload-pacing | true | wired | Unload pacing. The 50 / 0.05 numbers are never re-tuned. | | world.save-budget-ms | 3 | wired | Save budget in milliseconds per tick. | | world.block-entity-partition | true | declared | Gated behind bit-identical post-tick block states over a populated trace first. |

world.mob-count-scan

| Key | Default | Status | Notes | | --- | --- | --- | --- | | world.mob-count-scan.restricted | true | wired | Restricts the createState scan to entity-ticking chunks when per-player mob spawns are on. Documented divergence: spawn-potential charges from outside the tick region are dropped (permissive, never a lower cap); /mobcaps stays exact via a lazy recount. | | world.mob-count-scan.async | true | declared | Superseded by restricted — kept so existing configs parse. | | world.mob-count-scan.threads | 2 | declared | Superseded with async. |

world.async-pathfinding

| Key | Default | Status | Notes | | --- | --- | --- | --- | | world.async-pathfinding.enabled | false | declared | AUDITED allowlist; 0 of 187 mobs pass by default. | | world.async-pathfinding.allowed-mobs | [] | declared | The allowlist. | | world.async-pathfinding.threads | -1 | declared | -1 = auto max(2, cores/8). |

world.dormancy

| Key | Default | Status | Notes | | --- | --- | --- | --- | | world.dormancy.hard | false | declared | Never default. |

world.optimization

The memory-and-allocation family. Note which are wired and which still sit behind their gate. | Key | Default | Status | Notes | | --- | --- | --- | --- | | world.optimization.uniform-section-singleton | true | wired | One shared instance for uniform chunk sections instead of one per section. | | world.optimization.lazy-collections | true | declared | Lazy collection construction. | | world.optimization.dead-holder-state | true | declared | Includes per-player state that is allocated and never used. | | world.optimization.player-table-right-sizing | true | wired | CPU-coupled with the per-player chunk-tracking set. | | world.optimization.broadcast-changes-dirty-check | true | declared | Skips broadcast work when nothing changed. | | world.optimization.unwatched-entity-sync-skip | true | wired | Skips entity sync for unwatched entities. | | world.optimization.mob-scan-skip-when-impossible | true | declared | Skips the mob scan when it cannot produce spawns. | | world.optimization.furnace-recipe-cache | true | wired | Caches furnace recipe lookups. | | world.optimization.section-dedupe | false | wired | Opt-in, default off. Aliasing-unsafe if copy-on-write is missed even once — benchmark per world type before enabling. |

antixray

| Key | Default | Status | Notes | | --- | --- | --- | --- | | antixray.threads | -1 | wired | This world's dedicated obfuscation pool: -1 = auto max(2, cores/4), clamped [1, 16]. Upstream obfuscates on the global worker pool, capped at min(8, cores*2/3) and shared with chunk serialization and worldgen — one world's chunk-send burst starves every other world. | | antixray.queue-capacity | -1 | wired | Backlog this world's pool buffers before tasks overflow to the global pool (never dropped, never wedged): -1 = auto min(512, max(64, threads × 16)). Bounded: each queued task holds a chunk packet buffer. |

scale.tracking

Visibility tracking. visibility-mode is the one wired key; the rest of the scale block is the design-ahead tier model. | Key | Default | Status | Notes | | --- | --- | --- | --- | | scale.tracking.visibility-mode | cached | wired | poll \| cached \| event. poll is today's upstream loop; cached is the V1 cache — zero behaviour change; event is the V2 incremental tracker, the large rewrite, opt-in by default and recommended for the target scenario. | | scale.tracking.parallel-visibility-computation | false | declared | Off until the serial version is proven; on only with the read-only proof held. | | scale.tracking.tracking-budget | 0 | declared | 0 = unlimited (baseline). | | scale.tracking.tracking-budget-mode | soft | declared | soft \| hard. Hard changes getTrackedPlayers() — a public API contract, not a tuning knob. | | scale.tracking.relevance-sources | [combat, party, looking_at, nearest] | declared | Which sources mark an entity relevant. | | scale.tracking.tier-1-radius | 32 | declared | Tier radii and periods. 2 everywhere is baseline. | | scale.tracking.tier-2-radius | 96 | declared | See above. | | scale.tracking.tier-1-period | 2 | declared | See above. | | scale.tracking.tier-2-period | 6 | declared | See above. | | scale.tracking.tier-3-period | 15 | declared | See above. | | scale.tracking.forced-refresh-tiers | false | declared | true required once any period exceeds 60. | | scale.tracking.exempt-tiers | [spectator_target, vehicle_tree, leashed] | declared | Exemptions are correctness, not tuning. |

scale.broadcast

Entity packet broadcast.

| Key | Default | Status | Notes | | --- | --- | --- | --- | | scale.broadcast.encode-once-write-many | false | wired | Off pending the byte-identity gate. When on, one encoding serves every connection instead of per-connection re-encodes. | | scale.broadcast.per-connection-tick-batch | false | wired | Off pending the flush-interaction gate. Batches a tick's worth of packets per connection. | | scale.broadcast.stagger-broadcast-phase | false | wired | Off only because it is observable to packet-sniffing plugins; safe to enable. | | scale.broadcast.entity-packet-budget | 0 | wired | Tokens per tick per player; 0 = unlimited. | | scale.broadcast.entity-packet-burst | {100ms: 4.0, 1s: 1.25, 3s: 1.0} | wired | Burst factors, mirroring the upstream chunk limiter's shape. | | scale.broadcast.state-packet-reserve | 256 | wired | Metadata/equipment/passengers/velocity packets must never starve, or players see held-item flicker and passenger detach. | | scale.broadcast.tab-list-latency-cull | false | declared | Unverified what the client re-renders on latency change — needs a client-side check first. |

scale.activation

| Key | Default | Status | Notes | | --- | --- | --- | --- | | scale.activation.activation-map-mode | scan | wired | scan \| chunk_refcount. chunk_refcount is recommended — it deletes the thread-unsafe static AABBs the region port would otherwise work around. | | scale.activation.skip-player-only-sections | false | wired | Skips activation scan for player-only sections. Note: this is EAR-activation-scan only; the collision application is false (players push players). | | scale.activation.region-parallel | false | declared | Requires static-AABB removal first. |

scale.collisions

| Key | Default | Status | Notes | | --- | --- | --- | --- | | scale.collisions.collision-query-cap | 0 | declared | 0 = unlimited. Suggested setting: maxEntityCramming + 8. | | scale.collisions.collision-reuse-list | false | declared | Non-allocating query sink. | | scale.collisions.players-push-players | true | declared | true is vanilla semantics; changing this is a gameplay-semantics change, never a default flip. |

Retired keys that used to live here

| Key | What happened | | --- | --- | | world.optimization.netty-recv-cap | Moved to global network.recv-byte-cap — a channel belongs to a bind, not a world. Removed by a transform, so stale YAML is cleaned with a message rather than silently ignored. | | world.optimization.lazy-entity-ai, world.mob-caps.mode | Retired: declared and read by nothing. The upstream EAR 2.0 already covers lazy entity ticking, and the two-ary mob-caps mode was structurally wrong. |

Where the mob-cap levers actually are

If you came here looking for the mob cap knobs, they are Paper's own keys in paper-world.yml, and MeowMC documents them rather than duplicating them:

  • entities.spawning.per-player-mob-spawns (default true) — flipping it restores the vanilla global-limit × spawnableChunkCount / 289 cap with zero fork code.
  • entities.spawning.spawn-limits and entities.spawning.ticks-per-spawn, per category.

There is no MeowMC key for a fork-side area-budget policy.