## Changelog
### Performance
Full renders are much faster. In our benchmark with default settings, a full render on Paper took 14.03 s instead of 38.59 s, a **2.75× speedup**, using half as many render workers and producing identical output (Ryzen 9 5950X, 288,369 chunks). (#601, #610)

- Rewrote the rendering pipeline: renders work through a bounded number of regions at a time, scanning runs on a separate CPU worker pool, chunk and neighbour loads are planned ahead and shared, and region images are saved by multiple writers (#610)
- Read unloaded chunks directly from region files off the main thread on Paper, and on Fabric and NeoForge with the [Moonrise](https://modrinth.com/mod/moonrise-opt) mod installed (recommended) (#601)
- Skip biome blending when every position in the blend window is the same biome
<details>
<summary>Breakdown: renderer rewrite vs. direct snapshot loading</summary>
On its own, the renderer rewrite is 1.21× faster without direct snapshot loading and 1.48× faster with it.

</details>
### Changed
- Render settings are now set per render mode under `map.render.<full|radius|background>`, and image saving is configured under `map.image-saving`. Existing configs are migrated automatically (config version 3)
- Default render worker counts are lower on machines with more than 8 threads. Configs using the old automatic default (`-1`) migrate to `default` and get the new counts
- The default `max-chunks-per-interval` for background renders is raised from 1024 to 2048. Configs still set to 1024 are migrated to 2048; other values are kept
- Radius renders now resume after a restart, like full renders; resumed renders skip chunks that are no longer visible
- Visibility limits, the world border and render settings are captured when a render starts
- Queued image saves are always completed at shutdown instead of being dropped after 5 seconds
- Region scanning log messages now name the world, and image read/save errors name the file; the `could-not-*-region` locale keys are now `could-not-*-image`
- Removed squaremap-client support
- Update dependencies
### Fixed
- Fix world configs retaining worlds unloaded at runtime #600
- Fix partially upgraded terrain being rendered for retrogen chunks (#601)
- Fix terrain shading next to fluids (#604)
- Fix inconsistent shading across chunk and region boundaries in all render types
- Fix the first run limiting rendering to the world border even though the generated config showed the limit as disabled
- Fix full renders failing for dimensions that have never saved a chunk
- Fix `/squaremap resetmap` leaving tiles from in-progress renders and queued image saves in the reset map. It now refuses to run while a full or radius render is in progress
- Fix `markers.json` and other web files not being rewritten after a map reset when using an external web server
- Fix unreadable render progress being warned about on every startup
- Fix background renders losing claimed chunks in some cases, such as when stopped while planning
- Fix progress logging: the ETA no longer wraps after 24 hours, a final line is logged when a render ends, and re-enabling logging mid-render works
- NeoForge: fix modded fluid color export on current NeoForge 26.3 builds
- Sponge: fix compatibility with Sponge 26.3 (now built against API 21)
- Sponge: fix commands failing to register
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" }