This release ships three new ways to shape cleanup, plus a complete rewrite of the cleaner algorithm that fixes several long-standing edge cases.
### Added
- **Size ranges in `sizeThresholdOverrides` — shrink instead of replace.** Per-biome entries can now take a `[min, max]` pair instead of a single number. Regions smaller than `min` are still replaced entirely (as before); regions inside the range are kept; **regions larger than `max` are now trimmed down to a `max`-sized patch instead of being wiped from the world.** The single-number form (minimum only, no upper bound) still works exactly as before. The stock config now ships `"minecraft:stony_shore": [32, 64]`, so very small stony shore patches are still cleaned up entirely while oversized stony shore expanses get shrunk down rather than erased.
- **`intraGroupPreference` — preserve lakes, clean up puddles.** A new config block lets you mark a biome group as "preferred", meaning its members merge into each other before being flipped to anything outside the group, and mid-sized regions with no in-group neighbour are preserved rather than replaced. The new `fallbackOutOfGroupBelowSize` knob controls the cutoff: regions below it fall through to a normal out-of-group replacement, regions at or above are preserved. Default: oceans are preferred with a fallback size of 8. The practical effect:
- A tiny ocean **puddle** in the middle of land (under 8 quarts) still gets cleaned up to the surrounding land like before.
- A larger inland **lake** (8 quarts or more) is now preserved instead of being flipped to whatever land surrounds it.
- A coastal sliver of one ocean variant sitting next to a different ocean variant (say, a small `ocean` patch next to `frozen_ocean`) merges into that neighbour rather than turning into beach. So a region that's half ocean and half frozen ocean cleans up into a single ocean variant.
- **`requiredBoundaryGroups` — clean up biomes in places they shouldn't be.** A new config block lets you require a biome's boundary to touch at least one of the listed groups; if none are present, the region is cleaned up **regardless of size.** Default: beaches must touch oceans or rivers, so **any inland beach with no water nearby is cleaned up no matter how big it is.** Without this rule, an unusually large beach patch surrounded by forest would be kept simply because it cleared the size threshold.
### Changed
- **The cleaner algorithm has been rewritten from the ground up.** The new pipeline replaces the old separate "small-region" / "exploration" / "replacement" code paths with a single unified planner that handles minimum-size, range, and forced-replacement cases together. This is what made the new features above tractable — the old algorithm couldn't have expressed range-mode trimming or boundary rules cleanly. Output for existing configs (minimum-size only, no ranges) is broadly similar but not byte-identical to 1.0.x; the new planner's edge-case behaviour is more consistent (see Fixed below).
- **Bad config files now fail loudly instead of silently.** Malformed JSON, non-positive threshold values, unknown biome ids, range bounds where `min > max`, two override entries that resolve to the same biome with no biome-id-level disambiguator, and similar mistakes now refuse to load with a clear error message naming the file and the problem. Previously, the mod would fall back to an empty config and silently disable cleanup, which was easy to miss.
- **Override resolution follows a "narrowest scope wins" rule.** When the same biome is named both directly (`"minecraft:stony_shore": [32, 64]`) and indirectly via a group it belongs to (`"beaches": 32`), the more specific biome-id entry wins. Two *group* entries that overlap on the same biome with no biome-id tiebreaker is still an error, but the layered shape (group default + per-biome exception) now works as you'd expect.
### Fixed
The algorithm rewrite resolves a number of edge cases that the old code couldn't represent cleanly. Most users won't notice these individually; collectively they make output more predictable:
- Oversized regions (above the size threshold) are now handled by a dedicated planner that trims them down rather than skipping or partially clearing them, so leftover "stranded island" remnants are much less common.
- Coastal patches sitting between two non-replaceable biomes (e.g. `stony_shore` between water and a protected biome) no longer get accidentally erased instead of being trimmed or merged into a neighbour.
- Single-quart leftovers from a partial cleanup are now dissolved into a viable neighbour rather than aborting with a policy error.
- Intra-group replacement now works correctly when a region's boundary mixes in-group and out-of-group neighbours.
- Several rare non-determinism sources in the warming and caching layers are gone; cleanup output is now reproducible across re-runs of the same world even under heavier multiplayer load.
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }