Files
onion-mc/analysis/archive/FINDINGS.md
T
logan 5919955548 chore(analysis): archive finished reviews, drop stale duplicates
Move the completed 2026-09 candidate review (MODLIST-REVIEW/-GROUPS,
CANDIDATE-APPENDIX, PACK-CONTEXT), FINDINGS.md and the shipped FTB Chunks swap
write-up into analysis/archive/, with a README mapping their old paths. The
review's build pieces, subagent intermediates and Modrinth API dumps are
deleted: the assembled reports carry their content. MODLIST-GROUPS.md was a
byte-for-byte duplicate of analysis/groups-table.md.

Also: drop the now-pointless FINDINGS/MODLIST packwizignore lines (analysis/
covers the archive), and gitignore *.tar.gz so the 650 MB map-migration world
tarball can't be committed by accident.
2026-10-14 18:08:48 -04:00

40 KiB

Onion MC - Configuration, Compatibility & Performance Review

Pack: Onion MC 0.1.0 - Minecraft 1.21.1 / NeoForge 21.1.251 - 146 mods (packwiz; 141 Modrinth + 5 CurseForge) Scope: options and settings that improve inter-mod behaviour, performance, or are useful to the players and the server administrator.

Snapshot note. The mod-list statistics in section 1 were measured against an earlier pack revision (140 entries). The pack has since changed: FTB Chunks was replaced by Open Parties and Claims + Xaero's World Map/Minimap, the rest of the FTB suite that depended on it (FTB Quests, FTB Teams, FTB XMod Compat) was removed, Iris/shaders landed upstream, and Clumps/C2ME/Noisium were added. Sections 3.3 and 7.1 have been updated for these; section 1's counts have not been re-run.


How to read this document

Every claim is tagged with a confidence level, because "a Reddit comment said so" and "I read the mod's config source" are not the same thing.

Tag Meaning
VERIFIED Read from the mod's own jar metadata, upstream source code, or bundled default config.
DOCUMENTED Stated in official project docs (Modrinth/GitHub/wiki/NeoForge docs).
COMMUNITY User reports (Reddit, forums). Directionally useful, not authoritative.
INFERENCE My reasoning from the above.

Methods used: Modrinth API (project + version metadata for all 131 Modrinth-tracked mods), extraction of all 131 mod jars (reading META-INF/neoforge.mods.toml for dependencies, sides and declared incompatibilities), upstream source/config files on GitHub/GitLab, and official documentation.

Section 8 lists what is still unverified. Nothing there should be acted on as fact.


1. Pack state - it is in good shape

This matters because it means the work here is tuning, not repair. There is no fire to put out.

1.1 Integrity - VERIFIED

Check Result
Version validity (every pinned version supports 1.21.1 + NeoForge/Forge) 129 / 131 OK
Unsatisfied required dependencies 0
side flags that disagree with Modrinth's authoritative client/server support 0
Mods that would be wrongly installed on a dedicated server 0
  • The two non-"release" pins are Incendium and Sound Physics Remastered, both tagged alpha on Modrinth. For Incendium that is normal (Stardust Labs datapacks); for Sound Physics Remastered 1.5.1 it is currently the only 1.21.1 NeoForge build.
  • Libs that look "missing" are correctly bundled via jar-in-jar: apollib (inside Tectonic and Lithostitched), flywheel + ponder (inside Create), atmosphere (Slice & Dice), sablecompanion (Sable), mezz_config (JEI), Registrate (Create/Ars Delight/Twilight Delight).
  • The 16 client-only mods carry side = "client", so packwiz-installer -s server will exclude them. The server mod list is already correct - do not hand-prune it.

1.2 Version currency - VERIFIED

108 / 131 pins are the newest 1.21.1 NeoForge build. The 23 that are behind are mostly trivial patch bumps, with three worth a decision:

Mod Pinned Newest 1.21.1 Note
Terralith 2.5.8 2.6.2 Minor bump. New worlds only - see section 2.4.
Apotheosis 8.8.0 8.9.0 Feature release.
Sophisticated Storage 1.5.91 1.6.0 Minor bump.

Also available: NeoForge 21.1.252 (pack pins .251). The 21.1.x line is the 1.21.1 LTS branch and still receives fixes, so a patch bump is low-risk if you want bugfixes.

1.3 Declared incompatibilities - VERIFIED

These are asserted by the mods' own metadata. They are not opinions.

Mod Declares incompatible In pack?
create radium, palladium No [OK] - never add Radium
sodium embeddium (any version) No [OK] - never add Embeddium
sable scalablelux, sablecompanion > 1.6.0 No [OK]
distanthorizons ssrd <= 1.8.6 1.8.7 [OK] - one release clear of a hard break
geckolib geckoanimfix No [OK]
cristel-lib t_and_t <= 1.13.3 1.13.11 [OK]

1.4 Hard version constraints - do not break these

VERIFIED from mod metadata. These are the version pins that are load-bearing:

  1. Sodium must stay >= 0.8.12-alpha.2+mc1.21.1. sable declares every Sodium below that incompatible. Current 0.8.13 is fine. Downgrading Sodium breaks Create Aeronautics.
  2. SSRD must stay >= 1.8.7. Distant Horizons declares SSRD <= 1.8.6 incompatible.
  3. create-enchantment-industry requires Create >= 6.0.10 and create_dragons_plus >= 1.11.9. The pack sits exactly on both minimums, so Create cannot be downgraded.
  4. ssrd requires sable and sodium (sodium at side=CLIENT, so the dedicated server is unaffected).
  5. Towns and Towers must stay > 1.13.3 (cristel-lib constraint).

2. Where the server load actually comes from

Four cost centres dominate, in rough order of impact. Everything in section 3 maps to one of these.

  1. Worldgen & structure density - this pack stacks Terralith + Tectonic + Incendium + Nullscape + Towns and Towers + When Dungeons Arise + nine YUNG's mods + Explorify. Structure-heavy worldgen is the classic cause of chunk-generation spikes and stutter while players explore.
  2. Apotheosis spawners and entities - Apotheosis spawners can manufacture mob counts far beyond vanilla, and spawner-spawned mobs are deliberately prevented from despawning.
  3. Create + Sable physics - Create Aeronautics runs a physics pipeline. Sable's own README calls itself "an incredibly intrusive mod" that "makes extensive use of mixins" and is "prone to many compatibility issues". This is the highest-risk component in the pack.
  4. OPAC claim force-loading + offline chunk loading - per-player force-loaded chunks that tick even when nobody is online.

3. Server tuning

3.1 Structure density - the single biggest lever

Sparse Structures is already in the pack and already active. - DOCUMENTED/VERIFIED

  • Config file: config/sparsestructures.json5 (confirmed in Constants.java: Path.of("config", "sparsestructures.json5")).
  • spreadFactor - default 2. This multiplies structure spacing globally: >1 = rarer, 1 = untouched, <1 = more common. So the pack is already halving structure frequency versus default. Good default; raising it is the cheapest TPS win available.
  • customSpreadFactors - array of { "structure": "namespace:name", "factor": n }. The value may be a structure set or a structure name; using a structure name modifies the whole set it belongs to.
  • /dumpstructuresets dumps every structure set to a file - use this to get real names instead of guessing.
  • Changes require a full game restart.
  • Source: https://github.com/MaxenceDC/sparsestructures (sparse-structures-default-config.json5)

Suggested next step - push the expensive/oversized structure sets harder than the global 2x:

{
  "spreadFactor": 2,
  "customSpreadFactors": [
    { "structure": "minecraft:mansion", "factor": 2 }
    // run /dumpstructuresets, then add entries for the dungeons_arise:*
    // and t_and_t:* sets with factor 3-4
  ]
}

Caveat (INFERENCE): I have not verified the exact dungeons_arise / t_and_t structure-set names. Use /dumpstructuresets on the server to obtain them rather than copying names from the web.

Chunky (in pack) is the other half: pregenerate so players don't force live generation. DOCUMENTED - commands are /chunky radius <n>, /chunky world <dim>, /chunky center, /chunky start, /chunky pause, /chunky continue. See section 3.4 for the Chunky <-> Distant Horizons interaction, which matters here.

3.2 Apotheosis - entity accumulation

VERIFIED by reading the config source of Apothic Spawners 1.21 branch.

Config file: config/apothic_spawners.cfg - section [general]:

Key Default Notes
Entity Despawn Delay 600 Ticks that spawner-spawned mobs are prevented from despawning after spawning. Range 0-24000.
Spawners Drop Empty false Clears stored entity when broken.
Capturing Drop Chance 0.005 Per-level spawn-egg drop chance.
Spawner Silk Level 1 Silk touch level needed; -1 disables.
Spawner Silk Damage 100 Durability damage per spawner harvested.

Entity Despawn Delay is the lever most people miss. At the default 600 ticks, every spawner keeps its output alive for 30 seconds regardless of mobcap pressure. On a server with several upgraded spawners this is a steady entity tax. Lowering it to 0-100 is a direct, low-risk TPS improvement and is unlikely to be noticed by players (vanilla spawners have no such protection).

Note: this config surface is small. In Apotheosis 8.x the spawner modifiers (spawn range, delay, count, ...) are datapack-driven, not config-driven. So you cannot cap spawner throughput from the config file alone - Entity Despawn Delay plus the loot-table/datapack layer is what you have.

Config file: config/apotheosis/apotheosis.cfg - sections and keys (defaults in parentheses), all VERIFIED:

Note the directory. Apotheosis's module configs are not in the config root: configDir is defined as <config>/apotheosis (ApothicAttributes.java, line 58), and getConfigFile(p) returns <config>/apotheosis/<p>.cfg. The one exception is Apothic Spawners, which uses Placebo's Configuration(String) constructor and therefore lands at the config root as config/apothic_spawners.cfg. Do not go looking for config/apotheosis.cfg - it does not exist.

Section Key Default
bosses Boss Spawn Cooldown 3600 ticks (3 min)
bosses Boss Announcement Range vanilla spawn distance + 12 blocks
bosses Curse Boss Items / Boss Auto-Aggro / Boss Glowing On Spawn false / false / true
worldgen Generation Dimension Whitelist ["overworld"]
spawners Spawner Value Chance 0.11
affixes Cleave Players, Disable Quark Tooltips for Affix Items, Torch Placement Item false / true / minecraft:torch
augmenting Upgrade Sigil Cost / Upgrade Level Cost / Reroll Sigil Cost / Reroll Level Cost 2 / 225 / 1 / 175
potion_charms Restrict Charms to Curios false
quality_of_life Enable Item Linking, Item Linking Cooldown, Enable Equipment Comparisons true / 100 / true
flair Enable Affix Item Effects true (clientside)
world_tiers Enable Manual World Tier Changes true

Two worth acting on:

  • Boss Spawn Cooldown (3600): invading bosses are among the most expensive things Apotheosis spawns. Raising this is a legitimate, cheap difficulty/load dial.
  • Generation Dimension Whitelist = ["overworld"]: Apotheosis worldgen currently only runs in the Overworld. This pack has Twilight Forest, plus Incendium's Nether and Nullscape's End. If you want rogue spawners/boss dungeons there you must add the dimension IDs - and understand that doing so increases worldgen cost.

Related configs, same pattern (config/apotheosis/apothic_attributes.cfg, config/apotheosis/apothic_enchanting.cfg, and config/apotheosis/name_generation.cfg):

  • apothic_attributes.cfg -> [combat_rules] holds the damage formulas as editable expressions (Protection Formula, A-Value Formula, Armor Formula, Armor Toughness Formula, Negative Armor Factor=0.015). These are how you retune Apotheosis combat without a mod - useful because Apotheosis's armour model is the thing players most often call "broken" in a pack with Better Combat. [general] Hidden Attributes controls what shows in the attributes GUI (supports namespace wildcards and ! negation entries).
  • apothic_enchanting.cfg -> [client] Sculkshelf Noise Chance = 200 (1-in-200 chance per client tick to play a sculk shelf sound; 0 disables). Minor client perf/noise lever.

3.3 Open Parties and Claims - force-loading and ticking

Replaces FTB Chunks (removed 2026-09-30 in favour of Open Parties and Claims + Xaero's World Map/Minimap; see analysis/FTB-CHUNKS-SWAP.md). Everything below is the OPAC equivalent of the tuning this section used to document for FTB Chunks.

DOCUMENTED - OPAC's main config lives inside the world save, not the pack:

File Purpose
world/serverconfig/openpartiesandclaims-server.toml Main server config (limits, protection, forceloading, party backend).
world/serverconfig/openpartiesandclaims-* Global "player configs" (default player config, server-claim, expired-claim, wilderness).
<server dir>/config/openpartiesandclaims-server.toml Reported location on Fabric/Quilt only.

Warning - stop the server before editing. The README is explicit: the server may overwrite your changes otherwise. Do not assume the file the server generated matches any list here; read the generated file, which carries inline # Default: comments for every key.

Easiest route for an admin: in-game, the mod UI is bound to ' by default. Claim/party commands are /oclaims, /oparties, /opac and /opm (party chat). Server-wide options are still edited in the file, not the UI.

defaultconfigs/ and packwiz cannot help here - the file is in the world save, so it cannot be shipped at all. See section 7.1.

Keys and defaults - DOCUMENTED where the project's own issue quotes or README state them, else flagged:

Key Default Why it matters
maxPlayerClaims 500 Per-player claim cap. Same as FTB Chunks' max_claimed_chunks, so no capacity loss on the swap. Overridable via the xaero.pac_max_claims permission.
maxPlayerClaimForceloads low/0 - verify Per-player forceload cap. This pack sets it to 25 (matching FTB Chunks' old max_force_loaded_chunks); the stock default is not 25, so leaving it unset silently removes forceloading. Overridable via xaero.pac_max_forceloads.
claims.forceload.offlineForceload verify (documented as "true" in a 2021 issue, so possibly stale) Force-loaded chunks stay loaded while the owner is offline. This is the OPAC equivalent of FTB Chunks' chunk_load_offline, and the same farms-vs-TPS trade applies: 25 forceloads x ~10 players is potentially 250 chunks ticking around the clock.
primaryPartySystem built-in Left at OPAC's built-in default - FTB Teams was removed along with FTB Quests, so the built-in system is now the only one. Pointing this at ftbteams would be a no-op that logs missing-mod noise.
staticFakePlayers - Position-bound fake players for automation (miners, auto-clickers). The analogue of FTB Chunks' fake_players.
playerConfigurablePlayerConfigOptions / opConfigurablePlayerConfigOptions - Which options players (and OPs) may change in their own config. Adding a key to these arrays is what exposes it - e.g. claims.forceload.offlineForceload is not player-changeable until listed.
protection exception lists - forcedBlockProtectionExceptionList, forcedEntityProtectionExceptionList, itemUseProtectionExceptionList, plus the optional per-claim groups. This is OPAC's answer to FTB Chunks' protection; modded blocks/entities that misbehave go here.

Recommended starting point for a ~10-player server: keep maxPlayerClaims = 500, maxPlayerClaimForceloads = 25 (decided 2026-09-30), leave primaryPartySystem at the built-in default, and take a deliberate decision on claims.forceload.offlineForceload - it is the same straight farms-vs-TPS trade FTB Chunks' chunk_load_offline was, with a larger blast radius now that each player may forceload 25 chunks.

Reliability caveat - COMMUNITY (open upstream issues). OPAC force-loading has a recurring "marked the chunk but it does not actually stay loaded" failure mode with issues open at the time of writing (#855, #927, plus #237/#528 further back). Because this pack's farm design leans on offline force-loading, verify per-player forceloading on a staging world before trusting it, and re-test after each OPAC bump.

Sources: https://github.com/thexaero/open-parties-and-claims (README: config locations, permission nodes, primaryPartySystem, staticFakePlayers), https://modrinth.com/mod/open-parties-and-claims (commands, keybind, FAQ; also states the mod is in beta), https://github.com/thexaero/open-parties-and-claims/issues/228 and https://github.com/thexaero/open-parties-and-claims/issues/731 (default keys and the offlineForceload description), https://github.com/thexaero/open-parties-and-claims/issues/855 (force-loading reliability).

3.4 Distant Horizons - decide deliberately, and mind Chunky

DOCUMENTED - Distant Horizons has real server-side support and it is opt-in. From the official "Server Owners" wiki:

  • DH >= 2.3 is required on a server; older builds crash. The pack's 3.3.2 is fine.
  • "Using the same version / build on both the server and the client is strongly preferred."
  • Server support only engages if "Distant Generation" is enabled on both server and client; the same applies to every toggle with a server-side counterpart.
  • DH is optional on both sides - vanilla clients can still connect. So marking it optional in the pack is correct and safe.
  • Default settings need >= 500 KB/s (4 Mbit/s) per client. If players see "Timed out" kicks, lower their client bandwidth settings.
  • "Pre-generating LODs is highly recommended to avoid performance issues."
  • Warning: Chunky interaction: "Running Chunky will also generate & update LODs, but it's not recommended to rely on this behavior for pre-generation. LODs and chunks are independent, and by loading a lot of chunks quickly you risk overloading DH and ending up with a lot of holes. Either use DH's pre-generation, or temporarily disable the mod entirely." This pack has both Chunky and DH. If you pregenerate with Chunky, expect DH LOD holes. Use /dh pregen instead, or disable DH while Chunky runs.

Server-side config keys (use /dh config <key>; the command prints the current value, description and the config file path, which is the reliable way to find the file):

Setting Purpose
common.threadPreset CPU load preset for DH's worker threads.
common.maxDataTransferSpeed Per-player bandwidth cap.
generation.mode Set to INTERNAL_SERVER to generate chunks alongside LODs.
generation.requestRateLimit Requests/second cap.
generation.maxRequestDistance Per-player generation radius.
generation.nSized Experimental: generate LODs directly at the required size.
generation.bounds.x / .z / .radius Global generation area restriction (disabled while radius is 0).
realTimeUpdates.playerDistance How far chunk updates are converted to LOD pushes.
syncOnLoad.rateLimit / syncOnLoad.maxRequestDistance Login-time sync throttling.
levelKeyPrefix Required if several servers share a proxy - set a unique string.

Also: pregenerate beyond the world border if you use one, or clients will show LOD holes at the edge. Avoid running /dh pregen on a server people are actively playing on.

Source: https://gitlab.com/distant-horizons-team/distant-horizons/-/wikis/1-user-guide/1-frequently-asked-questions/5-server-owners/Server-Owners

3.5 Diagnosing lag: spark is already installed

DOCUMENTED - spark 1.10.124 is in the pack, so no setup is needed. Per spark's own docs, ~30 seconds of profiling is enough for useful results.

Admin workflow:

  • /spark tps - accurate TPS.
  • /spark health - TPS, tick durations (min/avg/max), CPU usage, GC activity. Start here.
  • /spark profiler start --timeout 60 - sample the server; then /spark profiler stop. Target specific threads with --thread, and record only slow periods to cut noise.
  • Use GC figures from /spark health to decide heap/GC flags rather than guessing.
  • On Linux x86_64 spark uses async-profiler via perf_events, which gives better results than the fallback ThreadMXBean engine - worth knowing when comparing reports.

Docs: https://spark.lucko.me/docs


4. Client tuning and cross-mod conflicts

4.1 The SSRD -> Distant Horizons -> Sodium chain

VERIFIED/DOCUMENTED. SSRD ("Separate Sable Render Distance") is a client rendering addon that exists to decouple Sable's sub-level render distance from the normal one.

  • SSRD's own README: "Distant Horizons or voxy AND Sodium MUST be installed on the Client!"
  • Versions 1.8 and up REQUIRE Sodium 0.8. The pack has Sodium 0.8.13 [OK] and SSRD 1.8.7 [OK].
  • But Distant Horizons is marked optional = true, default = false in the pack. INFERENCE: any player who leaves DH disabled gets a non-functional SSRD. Either ship DH by default, or mark SSRD optional alongside DH so the two travel together.
  • SSRD has server-side gamerules:
    • /gamerule ssrdMaxRenderDistance - default 128 chunks (server-wide cap).
    • /gamerule ssrdForceloadLimit - default 2 per player for /ssrd forceload.
    • /ssrd forceload does not require op but respects that cap.
  • SSRD README also warns: "Certain Iris shader packs cause rendering issues."

4.2 EntityCulling will break Ars Nouveau's spell visuals

DOCUMENTED - EntityCulling's README: "Client-side entities, commonly used by magic mods for animations, may not behave as expected. Whitelist the relevant entities via the config screen for tick culling and/or entity culling."

INFERENCE: this pack has Ars Nouveau, which uses client-side entities for spell/projectile visuals, plus Create Aeronautics (Sable) and several mob mods with custom animations. EntityCulling has a wide whitelist surface and its config screen supports per-entity toggles - expect to need it. EntityCulling is a solid win in general (it is one of the biggest client FPS wins on busy servers), so whitelist rather than remove.

4.3 Should you add shaders? Probably not yet

DOCUMENTED, two independent blockers:

  1. Create Aeronautics 1.1.3 README: "Aeronautics currently has visual issues when used with Iris Shaders."
  2. SSRD README: certain Iris shader packs cause rendering issues.

Combined with the fact that the pack contains no shader mod at all (no Iris/Oculus) and that DH + Sodium + Sable already form a tight, version-sensitive trio, adding shaders introduces a new compatibility axis in exactly the most fragile part of the pack. INFERENCE: leave shaders out unless you are willing to own that debugging surface.

4.4 Tectonic - optional terrain knobs

VERIFIED from Tectonic v3 config source. File: config/tectonic.json (DOCUMENTED via the official changelog: "Added a proper config to the mod version at config/tectonic.json"). Keys and defaults:

Group Key Default
general mod_enabled / snow_start_offset true / 128
global_terrain vertical_scale / increased_height / lava_tunnels 1.125 / false / true
continents ocean_offset / continents_scale / erosion_scale / ridge_scale -0.8 / 0.13 / 0.25 / 0.25
continents underground_rivers / river_lanterns / flat_terrain_skew / rolling_hills / jungle_pillars true / true / 0.1 / true / true
islands enabled / noise_scale true / 0.11
oceans ocean_depth / deep_ocean_depth / monument_offset / remove_frozen_ocean_ice -0.22 / -0.45 / -30 / false
biomes temperature_multiplier / temperature_scale / ... 1.0 / 0.25 / ...

Note increased_height is already false - good. It raises the build/generation ceiling to y640, which is a meaningful worldgen and memory cost. Do not enable it on a server.

The Tectonic wiki (https://github.com/Apollounknowndev/tectonic/wiki/Config) explains every option; the in-game mod-menu config screen shows them with tooltips.


5. Terralith + Tectonic - the combination is correct

DOCUMENTED, and this is a commonly-messed-up setup, so it's worth confirming it's right:

  • Terralith's README: "Terralith is fully compatible with the mod version of Tectonic."
  • Tectonic's README: "Tectonic has a special version with Terralith compatibility. This version is shipped in the mod version of Tectonic, but it is available as a standalone datapack [Terratonic]."
  • Terralith's README: "If you are using the datapack versions, you must use Terratonic instead of Tectonic."

The pack has both as mods, so the Terralith-compat layer is already active. Do not add Terratonic - it is for the datapack route and would conflict.

5.1 Terralith updates require a new world

DOCUMENTED - Terralith's README: *"It is not recommended to add Terralith to an existing world

  • reset yours first, or use a new world."*

Also relevant: "In 2.6.0, the mod version of Terralith relies on Lithostitched as a required dependency." The pack has Terralith 2.5.8 and already ships Lithostitched 1.8.0, so the eventual 2.6.x update is dependency-safe. But it is a worldgen change - new worlds only.

INFERENCE / worth checking: if the live server world predates the addition of Terralith (the pack added it recently), terrain seams and abrupt biome transitions are expected and are not a bug.


6. Cross-mod notes worth knowing

6.1 Apothic Combat silently disables the attack-range affix

DOCUMENTED - from the Apothic Combat README (the "Better Combat x Apotheosis Compat" mod):

The problem it solves: Apotheosis adds a "Heavy Weapon" category (loosely like Better Combat's two-handed weapons, but unrelated), and Apotheosis/Forge treat attack range as an entity attribute that grows with gems and affixes, while Better Combat defines attack range as an immutable weapon property in its own JSON format - so they cannot both work.

What the compat mod does:

  • Registers all two-handed Better Combat weapons automatically as HEAVY_WEAPON for Apotheosis.
  • "Removes the Entity Reach Attribute from all weapons, and makes the attack range affix nonfunctional."

Player-facing consequence: any gem/affix investment in attack range does nothing in this pack. That is a legitimate thing to tell players, and if you want, the README notes that disabling the Apotheosis Attack Range affix from appearing at all is possible via datapack.

Source: https://modrinth.com/mod/apothic-combat

6.2 Apotheosis enchanting vs other enchanting overhauls

COMMUNITY. The well-known Apotheosis enchanting-table conflict is with Quark, which is not in this pack, so that specific issue does not apply. No verified conflict with Ars Nouveau's enchanting was found. Flagging only that both touch the enchanting system; if you see an enchanting-table UI problem, test with Apothic Enchanting disabled first.

6.3 Lootr - exact keys, and one gotcha

DOCUMENTED - file config/lootr-common.toml. Lootr must be installed on both client and server (its FAQ is explicit). Selected keys and defaults:

Key Default Notes
disable_break false Prevents breaking Lootr containers except sneaking in creative.
blast_resistant false Makes Lootr containers explosion-proof.
decay_all false All chests decay after first open (overrides the per-list options).
decay_value 6000 Ticks for a decaying container to decay (5 min).
decay_dimensions / decay_modids / decay_loot_tables [] Targeted decay.
refresh_all false All chests refresh after first open.
refresh_value 24000 Ticks to refresh (20 min).
refresh_dimensions / refresh_modids / refresh_loot_tables [] Targeted refresh.
convert_wooden_chests / convert_trapped_chests / convert_mineshafts true Conversion scope.
convert_quark true Quark isn't in this pack; harmless.
skip_unloaded true Skip containers in unloaded chunks (queued for later).
maximum_age 3600 How long a container may sit in the conversion queue (180x20 ticks).
loot_modid_blacklist / loot_table_blacklist / dimension_blacklist / dimension_whitelist [] Exclusions.
power_comparators true Comparators output 1 - important for trap-based structures; false makes traps fire on load.
report_unresolved_tables false Log unresolved loot tables.
randomise_seed true Warning: see caveat below.
vanilla_textures false Client-side; hides Lootr textures.

Two things to flag:

  • Warning: randomise_seed's documentation is contradictory in the official wiki - the Forge section and the Fabric section describe opposite behaviours. Do not change this key on the strength of the wiki alone; test on a scratch world first.
  • Warning: Structure blacklists do not work on 1.21.1. The wiki states plainly: "structure blacklists are not functional outside of 1.16.5 due to tagging and holder changes." So decay_structures and loot_structure_blacklist are dead keys here. Don't waste time on them.

Lootr interacts with the pack's structure mods (When Dungeons Arise, the nine YUNG's mods) and with Apotheosis loot tables by converting their chests. If a specific structure's loot behaves oddly, the loot_table_blacklist / loot_modid_blacklist route is the supported fix - not the structure keys.

6.4 Known compatibility risks to keep on the radar

  • Sable / Create Aeronautics - self-described as highly intrusive and mixin-heavy. If you get a weird crash or a visual bug you can't explain, test with Sable removed first. The five Sable compat addons in the pack (sablecompat, aeronauticscompat, gravestone_sable_compat, waystonessable, sablejade) exist precisely because it needed patching.
  • Create declares radium and palladium incompatible - this rules out the most obvious "add more server performance mods" candidates. See section 7.

7. Config mechanics - how to actually apply any of this

This is the part that decides whether the rest of the document is usable.

DOCUMENTED (NeoForge config docs) - three locations, and they behave differently:

Location Scope Synced to clients?
config/ Global, both sides Depends on config type
world/serverconfig/ Per-world override of SERVER-type configs Yes - server wins
defaultconfigs/ Seeds new worlds n/a
  • SERVER-type configs are synced from server to client and can be overridden per world in world/serverconfig/. STARTUP / COMMON / CLIENT are not synced.
  • Server configs are only editable via the in-game screen on a local world; they are greyed out on a multiplayer server - so on a real server you edit the files.
  • The Apotheosis stack is the exception: those are Placebo .cfg files under config/apotheosis/ (+ config/apothic_spawners.cfg) and are not NeoForge SERVER-type configs, so they are not synced and not per-world. They're plain global files you edit directly. This also means defaultconfigs/ will not seed them - see 7.1.

7.1 The pack currently cannot ship server configs

VERIFIED - .packwizignore contains:

config/
defaultconfigs/

So every config is excluded from the pack index. Consequences:

  • None of the tuning in section 3 can be delivered to players or to a fresh server via the pack as it stands.
  • A fresh server generates stock defaults for everything.

This is a cleaner end state than before: the only config the pack used to ship was the FTB Chunks minimap client file, and it left with FTB Chunks (section 3.3).

Recommendation (INFERENCE): if you want these settings to be part of the pack rather than tribal knowledge, un-ignore the specific files you care about (a !config/<path> rule alongside the config/ ignore) and/or use defaultconfigs/ for per-world SERVER-type defaults.

Caveat - the systems this document tunes are mostly unreachable from packwiz.

  • OPAC keeps its main config in world/serverconfig/, inside the world save. Not shippable, ever.
  • the Apotheosis stack uses Placebo .cfg files, which defaultconfigs/ does not seed.

The one exception now worth knowing: Xaero's server-side settings live in <server dir>/config/xaero/ (world-map, minimap), so a !config/xaero/* rule would let the pack ship enforced map profiles if that is ever wanted. Those configs also register the status effects that block non-modded clients, so shipping them has a real consequence - see the Xaero's pages before doing it.

Note the .packwizignore also excludes *.json globally, which would also exclude config/tectonic.json even if config/* were relaxed. It needs an explicit ! rule.

7.2 Installing on the server

DOCUMENTED - use the server side flag so client-only mods are skipped:

java -jar packwiz-installer-bootstrap.jar -g -s server <pack-url>

-g disables the optional-mods GUI, -s server downloads only server-side mods. Because every side = "client" flag in this pack is already correct (section 1.1), this produces a correct server mod list automatically.


8. Prioritised recommendations

Ordered by value / risk. P0 items are the ones I'd do first.

# Pri Change Where Evidence
1 P0 Set Entity Despawn Delay to 0-100 (from 600) config/apothic_spawners.cfg -> [general] VERIFIED source
2 P0 Decide claims.forceload.offlineForceload (true = farms run while owners are offline, costs TPS); set maxPlayerClaimForceloads to 25 OPAC server config, world/serverconfig/openpartiesandclaims-server.toml DOCUMENTED
3 P0 Leave primaryPartySystem at the built-in default (FTB Teams is gone; pointing it at ftbteams is a no-op) OPAC server config VERIFIED
4 P0 Fix SSRD/DH mismatch: ship DH by default, or mark SSRD optional with it mods/*.pw.toml VERIFIED + DOCUMENTED
5 P0 Whitelist Ars Nouveau (and Sable/Create) entities in EntityCulling client config screen DOCUMENTED
6 P1 Raise spreadFactor for the expensive structure sets via customSpreadFactors (use /dumpstructuresets) config/sparsestructures.json5 VERIFIED source
7 P1 Cap SSRD via /gamerule ssrdMaxRenderDistance (default 128 chunks) server command DOCUMENTED
8 P1 Pregenerate with /dh pregen, not Chunky, or disable DH while Chunky runs server DOCUMENTED
9 P1 Raise Boss Spawn Cooldown above 3600 if invader load is heavy config/apotheosis/apotheosis.cfg -> [bosses] VERIFIED source
10 P1 Establish a /spark health -> /spark profiler baseline before and after changes server DOCUMENTED
11 P1 Un-ignore the specific configs you want shipped (or adopt defaultconfigs/) .packwizignore VERIFIED
12 P2 Consider NeoForge 21.1.251 -> 21.1.252 pack.toml VERIFIED
13 P2 Tell players the attack-range affix is inert (Apothic Combat) player comms DOCUMENTED
14 P2 Decide on the 23 outdated pins (Terralith 2.6.2 is new-world only) mods/*.pw.toml VERIFIED
15 P2 Leave increased_height: false in Tectonic; never add Embeddium/Radium/shaders various VERIFIED/DOCUMENTED
16 P2 Set levelKeyPrefix if you ever run multiple servers behind a proxy DH server config DOCUMENTED

9. Not verified / open questions

Listed so nobody mistakes absence of evidence for evidence of absence.

  1. Client-side performance options not yet reviewed in depth - Distant Horizons' client quality/ thread presets, ImmediatelyFast, Dynamic FPS, EMF/ETF, Fusion/Athena, Legendary Tooltips, Prism. These are very likely fine at defaults; DH's client quality preset is the one worth player guidance.
  2. Missing server-side performance mods not yet assessed - ServerCore, Noisium, Clumps, Connectivity, Packet Fixer, ThreadTweak on NeoForge 1.21.1, and whether each overlaps with the already-installed Lithium/ModernFix/FerriteCore/AllTheLeaks. Note Create's declared incompatibility with Radium and Palladium, which removes two candidates. Do not add anything here without checking for overlap with Lithium and ModernFix first.
  3. Create / Sable / Aeronautics config surface - not yet read from source. SSRD and the Sable gamerules in section 4.1 are the only Sable-family settings verified so far.
  4. FTB Backups 3 config keys (interval, retention, compression) - not yet verified. Relevant to disk/IO on the server.
  5. Waystones, GraveStone, Sophisticated Storage/Backpacks, Curios, Artifacts config keys - not yet verified.
  6. JVM flags / heap sizing for this pack size - not yet researched. Use /spark health GC data (section 3.5) to decide empirically rather than copying generic flags.
  7. server.properties / gamerule tuning (view-distance vs simulation-distance, entity cramming, mobcaps, network-compression-threshold for large modded packets) - not yet verified.
  8. Exact dungeons_arise / t_and_t structure-set names - use /dumpstructuresets.
  9. Lootr randomise_seed semantics - the official wiki contradicts itself; test before changing.
  10. The 5 CurseForge-sourced mods (FTB Backups 3, FTB Library, AllTheLeaks, Collapsible Groups, Twilight Forest) could not be version-checked by packwiz for currency without a CurseForge API key. The FTB Chunks swap plus the later FTB suite removal cut this blind spot from nine mods to five.

Appendix A - Verified config file paths

Mod File Format
Tectonic config/tectonic.json JSON
Sparse Structures config/sparsestructures.json5 JSON5
Apotheosis (adventure) config/apotheosis/apotheosis.cfg Placebo CFG
Apothic Attributes config/apotheosis/apothic_attributes.cfg Placebo CFG
Apothic Spawners config/apothic_spawners.cfg (config root - see note in section 3.2) Placebo CFG
Apothic Enchanting config/apotheosis/apothic_enchanting.cfg Placebo CFG
Apotheosis name generation config/apotheosis/name_generation.cfg Placebo CFG
Open Parties and Claims world/serverconfig/openpartiesandclaims-server.toml (main server config - inside the world save) plus openpartiesandclaims-* player configs alongside it TOML
Xaero's World Map / Minimap server-side: config/xaero/world-map, config/xaero/minimap; client map + waypoint data under the instance xaero/ directory TXT / binary
Lootr config/lootr-common.toml TOML
Distant Horizons use /dh config <key> to print the path TOML

Appendix B - Sources