Worldgen overview

A map of Minecraft's data-driven world generator: the pipeline from dimension to placed feature, which folder each piece lives in, the 11 generation steps, and how to test it in-game.

⚠ Version differences

Worldgen JSON is an unstable, "experimental" datapack API. Unlike recipes, loot tables, and advancements, its schema is explicitly allowed to change between versions with no backward-compatibility guarantee β€” and it does, frequently. Fields are renamed, added, and removed at the snapshot level. Everything on these pages is pinned to the 1.21 / pack_format 48 baseline. Known divergences in the large 26.x rework:

  • Most dimension_type gameplay flags migrated into an attributes object (26.x / 25w42a+).
  • surface_rule renamed to material_rule (26.3-snap1).
  • initial_density_without_jaggedness replaced by preliminary_surface_level (1.21.9 / 25w31a).
  • weird_scaled_sampler density function removed (26.2-snap5, replaced by interval_select).

Always regenerate and validate worldgen files against your exact target version.

The worldgen pipeline

Everything is one graph. A dimension instance ties a dimension type (physics/behavior) to a generator (how terrain and biomes are produced). The generator wires into noise settings, which reference density functions and custom noises for the actual math; the biome source selects biome files, which in turn list the features, carvers, and structures placed during generation.

StageWhat it decidesLives in
dimensionTies a dimension type to a generator; registers a reachable dimension.data/<ns>/dimension/
dimension_typePhysics & behavior: light, height, coordinate scale, spawning, portals/beds.data/<ns>/dimension_type/
generatornoise / flat / debug β€” the terrain strategy.(inside the dimension file)
biome_sourceWhere each biome goes: multi_noise, fixed, checkerboard, the_end.(inside the generator)
noise_settingsDefault block/fluid, vertical envelope, aquifers, ore veins, the noise router, surface rule.data/<ns>/worldgen/noise_settings/
density_functionJSON-encoded math of (x,y,z) that feeds the noise router slots (terrain shape, aquifers, veins).data/<ns>/worldgen/density_function/
noisePerlin/octave noise (firstOctave + amplitudes) referenced by density functions.data/<ns>/worldgen/noise/
biomeClimate, client effects, mob spawns, carvers, and the 11 feature steps.data/<ns>/worldgen/biome/
features / carvers / structuresThe trees, ores, caves, ravines, villages, and other placed content.data/<ns>/worldgen/...

A single missing or mistyped ID anywhere in this graph makes the chunk fail to load β€” often a silent void or a crash on entering the dimension.

πŸ“Œ Note

The vanilla minecraft:overworld, minecraft:the_nether, and minecraft:the_end dimensions live in data/minecraft/dimension/ and can be overridden by placing a file at the same path in your datapack.

Folder map

All folder names are singular in 1.21+. Each registry has one file per ID:

RegistryPath
Dimension instancedata/<ns>/dimension/<id>.json
Dimension typedata/<ns>/dimension_type/<id>.json
Biomedata/<ns>/worldgen/biome/<id>.json
Noise settingsdata/<ns>/worldgen/noise_settings/<id>.json
Density functiondata/<ns>/worldgen/density_function/<id>.json
Custom noisedata/<ns>/worldgen/noise/<id>.json
Configured / placed features, carvers, structures, structure setsdata/<ns>/worldgen/configured_feature/, placed_feature/, configured_carver/, structure/, structure_set/, template_pool/, processor_list/

The 11 generation steps

Each biome's features field is an array of 11 sub-arrays β€” one per generation step, indices 0 through 10 inclusive. Every biome in a chunk contributes its placed features to the matching step, and all biomes' step 0 run before any biome's step 1, and so on. The order is fixed:

#StepTypical content
0RAW_GENERATIONEarliest terrain-shaping placements (e.g. small end islands).
1LAKESWater/lava lakes.
2LOCAL_MODIFICATIONSGeodes, dripstone clusters, icebergs.
3UNDERGROUND_STRUCTURESMineshafts, dungeons, fossils. (Never generates in flat.)
4SURFACE_STRUCTURESDesert wells and similar. (Never generates in flat.)
5STRONGHOLDSStronghold placement.
6UNDERGROUND_ORESOre blobs, dirt/gravel/granite disks.
7UNDERGROUND_DECORATIONGlow lichen, sculk veins, cave decorations.
8FLUID_SPRINGSWater/lava springs.
9VEGETAL_DECORATIONTrees, grass, flowers, mushrooms, kelp.
10TOP_LAYER_MODIFICATIONSnow/ice freeze-over pass.
πŸ“Œ Note

Carvers (caves and ravines) run in a separate pass between raw terrain and features β€” they are listed in the biome's carvers field, not among the 11 feature steps.

Testing with /place

The /place command 1.19+ forces worldgen content to generate at a location so you can inspect it without hunting for the right biome or seed. Its four subcommands:

SubcommandPlaces
/place feature <id> [pos]A configured feature (tree, ore blob, etc.).
/place structure <id> [pos]A whole structure (village, temple, …).
/place jigsaw <pool> <target> <max_depth> [pos]A jigsaw assembly from a template pool.
/place template <id> [pos] [rotation] [mirror] [integrity] [seed]A structure template (NBT structure file).
πŸ’‘ Best practice

To exercise a custom dimension, jump in with /execute in <ns>:<id> run tp @s ~ ~ ~ β€” a new dimension does not auto-generate a portal to reach it. Combine with /reload after editing worldgen files, but note that already-generated chunks keep their old terrain; travel to fresh chunks (or use a new world) to see structural changes.

Stability & version discipline

Version discipline is the single biggest hazard in worldgen. The public wiki now documents 26.x snapshots that diverge sharply from 1.21. When copying wiki snippets, cross-check against a 1.21 vanilla extract before shipping.

πŸ’‘ Best practice

Author by forking vanilla. The vanilla worldgen JSON (extractable from github.com/misode/mcmeta, tagged per version) is the ground truth; hand-writing a full noise router or surface rule is impractical. Copy a vanilla file and change one slot at a time. Use misode.github.io generators for schema-correct editing β€” but confirm its version selector matches your target.

🚧 Gotcha

Keep dimension_type.min_y/height and the referenced noise_settings.noise.min_y/height identical (both multiples of 16, with min_y + height ≤ 2032). A mismatch produces missing or duplicated terrain.

Where to go next

Sources