Description
Worldgen Router lets modpack authors control what other mods may generate, spawn, or drop in each dimension — entirely from config files. No content mods required, no code, no per-mod compatibility patches.
What you can control
- Biomes, structures, features and carvers — per dimension, at generation time
- Natural spawning, including mobs placed during chunk generation
- Loot, trades, crafting and player inventories, each switchable on its own
- Whole mod namespaces or individual IDs, with a fixed precedence between them
- Several isolated Overworld–Nether–End sets, with portals routed inside each one
- Custom dimensions declared from config, with templates, fixed seeds and portal routing
- Every allow/deny decision can be explained in-game, including the exact rule that won
- Denied structure IDs fail
/locateimmediately, instead of scanning chunks for something that can never generate
Installing it changes nothing
The starter config ships default = "allow". Drop the jar in and your pack plays exactly as it did.
Nothing is refused until you write a rule saying so.
Curating is one value away:
[world_sets.curated]
overworld = "minecraft:overworld"
nether = "minecraft:the_nether"
end = "minecraft:the_end"
default = "deny"
allow_namespaces = ["minecraft", "yourmod"]
That set now generates only content owned by the namespaces it allows. Dimensions no world set claims behave exactly like vanilla.
Blocking two mods in an otherwise open pack is one line:
deny_namespaces = ["somemod", "othermod"]
Requirements
Minecraft 1.21.1 and NeoForge 21.1.x only. The range is pinned deliberately: this mod hooks 1.21.1 worldgen internals directly and is not verified anywhere else.
Boots on Minecraft + NeoForge alone — no required dependencies. Allow-lists live in config, so adding or removing a mod from your pack never means rebuilding a jar.
Rules that say what you mean
Rules are per category — structure, feature, carver, entity, biome, item — and per
enforcement point. So "curate what generates here, but leave players' inventories alone" is a few
lines, not a wish:
[world_sets.curated.rules.item]
apply_to = ["loot", "trade"]
The same axis is why you can curate the spawn cycle without taking the tools away:
[world_sets.curated.rules.entity]
apply_to = ["natural_spawn"] # mobs stop spawning; /summon and spawn eggs still work
Precedence is fixed, total, and inspectable
deny_ids > allow_ids > deny_namespaces > allow_namespaces > default
Never guess which rule won:
/worldgenrouter explain structure somemod:some_structure
result DENIED
matched rules.structure.deny_namespaces
priority 3 of 5 - checked after deny_ids, allow_ids did not match
/worldgenrouter status prints the effective rules per category. /worldgenrouter reload re-reads
them live — a bad edit keeps the previous rules rather than breaking your server.
Dimensions, datapacks and reusable profiles
- Declare custom dimensions in config. Use an
overworld,netherorendtemplate, or supply your own generator JSON, with an optional fixed seed. - Route portals inside each world set. A set can have its own Overworld, Nether and End, and a portal lit in that Overworld arrives in that set's own Nether — never in the vanilla one.
- Datapacks can ship a world set, so a pack brings its dimensions and the rules governing them. A datapack can also add denials to an existing set, but never loosen one: an installed pack cannot quietly undo a server owner's isolation.
- Themes let several world sets share one rule set through
extends. - Snapshots turn a 200-mod allow-list into a single line.
When it refuses to start
This mod fails loudly rather than silently doing nothing — an unknown key, a tag in a rule list, or a
removed key stops the boot and names the file, the world set and the key. Silently ignoring a
misspelled allow_namespace could leave a world set enforcing nothing, and you might not discover it
until terrain had already generated.
Known limitations, stated up front
- Global biome systems. Mods that place biomes through their own world-wide region system, rather than through the dimension's own biome source, are not fully contained by a curated set — foreign biomes can still appear there. The mod detects this at startup and warns instead of pretending otherwise, and where no verified adapter exists it refuses to boot rather than letting a global system through an isolation rule. Adapters are version-pinned, so an untested version of a system they hook also refuses to load rather than mis-generating your world. This applies only when a detected global biome system would bypass an isolation rule you actually enforced — an unsupported mod on its own never stops the game. Startup names exactly what it found; the pack-author guide lists which systems are covered and which are not.
- Mobs already saved in a chunk stay. Spawn rules apply from the moment a mob would be created; there is no sweep that removes entities a world already holds. Inventories are swept.
- Tags (
#namespace:id) in rule lists are refused for now, instead of silently matching nothing. /locateon a tag is not the same as/locateon an ID. A denied ID disappears from the search at once; a tag usually holds allowed members too, and vanilla keeps looking for those. That search can run a long time and looks like a freeze. Locate a plain ID before concluding a denial failed.- Worldgen is not retroactive. Rules apply to chunks generated after them; existing terrain keeps what it already has.
Documentation
The full setup walkthrough — every config file, category overrides, enforcement points, snapshots, declaring dimensions, both datapack formats, themes, the validation report, and the compatibility matrix — is in the pack-author guide.
- Pack-author guide — every key, the footguns, the compatibility limits
- Support matrix — every key's state, and what is deliberately not supported
- Changelog
Bug reports and pack-author questions: GitHub issues.







