squaremap
What is squaremap
squaremap is a minimalistic and lightweight live world map viewer for Minecraft servers.
squaremap hooks into your Minecraft server as a plugin or mod on a supported platform, then generates and manages a live map of your server, viewable in any web browser.
Features
- Ultra fast render times. Get your map rendered today, not next week.
- Simple vanilla-like top down 2D view, designed for navigation.
- Player markers showing yaw rotation, health, and armor.
- Easy to setup and configure.
- Up to date Leaflet front-end.
- Addons and integrations for many popular plugins.
Supported platforms
- Paper
- Sponge
- Fabric (requires Fabric API)
- NeoForge
Downloads
Downloads can be obtained here on Modrinth, or from GitHub releases for all supported platforms.
Development builds
Development builds are available at https://jenkins.jpenilla.xyz/job/squaremap/
Demo
Official squaremap demo: https://squaremap-demo.jpenilla.xyz/
License
This project is licensed under the MIT license
Leaflet (the web ui frontend) is licensed under 2-clause BSD License
API
squaremap provides simple APIs to draw markers, shapes, icons, and etc. on rendered maps. Javadocs are hosted on the maven repository alongside the binaries, and should be automatically downloaded by your IDE. See the README and Wiki for more details about the API.
All Versions
+ Add Version| Name | Game version | Platforms | Published | Downloads | Actions |
|---|---|---|---|---|---|
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
| 18h ago | 1 | ||||
|
R
1.2.1
|
18h ago | 1 | |||
|
R
1.2.1
|
18h ago | 1 | |||
|
R
1.2.1
|
18h ago | 1 | |||
|
R
1.2.0
|
18h ago | 1 | |||
|
R
1.2.0
|
18h ago | 1 | |||
|
R
1.2.0
|
18h ago | 1 | |||
|
R
1.2.0
|
18h ago | 1 | |||
|
R
1.1.16
|
18h ago | 1 | |||
|
R
1.1.16
|
18h ago | 1 | |||
|
R
1.1.16
|
18h ago | 1 | |||
|
R
1.1.16
|
18h ago | 1 | |||
|
R
1.1.15
|
18h ago | 1 | |||
|
R
1.1.15
|
18h ago | 1 | |||
|
R
1.1.15
|
18h ago | 1 | |||
|
R
1.1.15
|
18h ago | 1 | |||
|
R
1.1.14
|
18h ago | 1 | |||
|
R
1.1.14
|
18h ago | 1 | |||
|
R
1.1.14
|
18h ago | 1 | |||
|
R
1.1.14
|
18h ago | 1 | |||
|
R
1.1.13
|
18h ago | 1 | |||
|
R
1.1.13
|
18h ago | 1 | |||
|
R
1.1.13
|
18h ago | 1 | |||
|
R
1.1.13
|
18h ago | 1 | |||
|
R
1.1.12
|
18h ago | 1 | |||
|
R
1.1.12
|
18h ago | 1 | |||
|
R
1.1.12
|
18h ago | 1 | |||
|
R
1.1.12
|
18h ago | 1 | |||
|
R
1.1.11
|
18h ago | 1 | |||
|
R
1.1.11
|
18h ago | 1 | |||
|
R
1.1.11
|
18h ago | 1 | |||
|
R
1.1.11
|
18h ago | 1 | |||
|
R
1.1.10
|
18h ago | 1 | |||
|
R
1.1.10
|
18h ago | 1 | |||
|
R
1.1.10
|
18h ago | 1 | |||
|
R
1.1.10
|
18h ago | 1 | |||
|
R
1.1.9
|
18h ago | 1 | |||
|
R
1.1.9
|
18h ago | 1 |
### Changed
- Hide bush, short dry grass, and tall dry grass by default, like short grass. Existing configs get them in every
invisible-blockslist that still hides short grass - Tint leaf litter with the biome's dry foliage color, like vanilla, instead of its brown map color. Adds a
color-overrides.biomes.dry-foliagesetting - Tint bush with the biome grass color and give dry grass a tan color, for configs that show them
- Add default color overrides for torchflower, pitcher plant, wildflowers, and golden dandelion. Existing configs get them without changing values you've set
- Update dependencies
Forests, deserts, and badlands look noticeably different. Existing tiles only change as chunks re-render; run
/squaremap fullrender <world> to update the whole map.### Changed
- Hide bush, short dry grass, and tall dry grass by default, like short grass. Existing configs get them in every
invisible-blockslist that still hides short grass - Tint leaf litter with the biome's dry foliage color, like vanilla, instead of its brown map color. Adds a
color-overrides.biomes.dry-foliagesetting - Tint bush with the biome grass color and give dry grass a tan color, for configs that show them
- Add default color overrides for torchflower, pitcher plant, wildflowers, and golden dandelion. Existing configs get them without changing values you've set
- Update dependencies
Forests, deserts, and badlands look noticeably different. Existing tiles only change as chunks re-render; run
/squaremap fullrender <world> to update the whole map.### Changed
- Hide bush, short dry grass, and tall dry grass by default, like short grass. Existing configs get them in every
invisible-blockslist that still hides short grass - Tint leaf litter with the biome's dry foliage color, like vanilla, instead of its brown map color. Adds a
color-overrides.biomes.dry-foliagesetting - Tint bush with the biome grass color and give dry grass a tan color, for configs that show them
- Add default color overrides for torchflower, pitcher plant, wildflowers, and golden dandelion. Existing configs get them without changing values you've set
- Update dependencies
Forests, deserts, and badlands look noticeably different. Existing tiles only change as chunks re-render; run
/squaremap fullrender <world> to update the whole map.### Changed
- Hide bush, short dry grass, and tall dry grass by default, like short grass. Existing configs get them in every
invisible-blockslist that still hides short grass - Tint leaf litter with the biome's dry foliage color, like vanilla, instead of its brown map color. Adds a
color-overrides.biomes.dry-foliagesetting - Tint bush with the biome grass color and give dry grass a tan color, for configs that show them
- Add default color overrides for torchflower, pitcher plant, wildflowers, and golden dandelion. Existing configs get them without changing values you've set
- Update dependencies
Forests, deserts, and badlands look noticeably different. Existing tiles only change as chunks re-render; run
/squaremap fullrender <world> to update the whole map.### Changed
- Hide bush, short dry grass, and tall dry grass by default, like short grass. Existing configs get them in every
invisible-blockslist that still hides short grass - Tint leaf litter with the biome's dry foliage color, like vanilla, instead of its brown map color. Adds a
color-overrides.biomes.dry-foliagesetting - Tint bush with the biome grass color and give dry grass a tan color, for configs that show them
- Add default color overrides for torchflower, pitcher plant, wildflowers, and golden dandelion. Existing configs get them without changing values you've set
- Update dependencies
Forests, deserts, and badlands look noticeably different. Existing tiles only change as chunks re-render; run
/squaremap fullrender <world> to update the whole map.### Changed
- Hide bush, short dry grass, and tall dry grass by default, like short grass. Existing configs get them in every
invisible-blockslist that still hides short grass - Tint leaf litter with the biome's dry foliage color, like vanilla, instead of its brown map color. Adds a
color-overrides.biomes.dry-foliagesetting - Tint bush with the biome grass color and give dry grass a tan color, for configs that show them
- Add default color overrides for torchflower, pitcher plant, wildflowers, and golden dandelion. Existing configs get them without changing values you've set
- Update dependencies
Forests, deserts, and badlands look noticeably different. Existing tiles only change as chunks re-render; run
/squaremap fullrender <world> to update the whole map.### Changed
- Hide bush, short dry grass, and tall dry grass by default, like short grass. Existing configs get them in every
invisible-blockslist that still hides short grass - Tint leaf litter with the biome's dry foliage color, like vanilla, instead of its brown map color. Adds a
color-overrides.biomes.dry-foliagesetting - Tint bush with the biome grass color and give dry grass a tan color, for configs that show them
- Add default color overrides for torchflower, pitcher plant, wildflowers, and golden dandelion. Existing configs get them without changing values you've set
- Update dependencies
Forests, deserts, and badlands look noticeably different. Existing tiles only change as chunks re-render; run
/squaremap fullrender <world> to update the whole map.### Changed
- Hide bush, short dry grass, and tall dry grass by default, like short grass. Existing configs get them in every
invisible-blockslist that still hides short grass - Tint leaf litter with the biome's dry foliage color, like vanilla, instead of its brown map color. Adds a
color-overrides.biomes.dry-foliagesetting - Tint bush with the biome grass color and give dry grass a tan color, for configs that show them
- Add default color overrides for torchflower, pitcher plant, wildflowers, and golden dandelion. Existing configs get them without changing values you've set
- Update dependencies
Forests, deserts, and badlands look noticeably different. Existing tiles only change as chunks re-render; run
/squaremap fullrender <world> to update the whole map.### 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, Minecraft 26.3). (#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 undermap.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 todefaultand get the new counts - The default
max-chunks-per-intervalfor 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-*-regionlocale keys are nowcould-not-*-image - Removed squaremap-client support
- Mark [Moonrise](https://modrinth.com/mod/moonrise-opt) versions older than 1.0.1 as incompatible on Fabric and NeoForge (Moonrise is still optional)
- 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 resetmapleaving 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.jsonand 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
- Sponge: fix commands failing to register
### 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, Minecraft 26.3). (#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 undermap.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 todefaultand get the new counts - The default
max-chunks-per-intervalfor 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-*-regionlocale keys are nowcould-not-*-image - Removed squaremap-client support
- Mark [Moonrise](https://modrinth.com/mod/moonrise-opt) versions older than 1.0.1 as incompatible on Fabric and NeoForge (Moonrise is still optional)
- 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 resetmapleaving 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.jsonand 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
- Sponge: fix commands failing to register
### 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, Minecraft 26.3). (#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 undermap.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 todefaultand get the new counts - The default
max-chunks-per-intervalfor 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-*-regionlocale keys are nowcould-not-*-image - Removed squaremap-client support
- Mark [Moonrise](https://modrinth.com/mod/moonrise-opt) versions older than 1.0.1 as incompatible on Fabric and NeoForge (Moonrise is still optional)
- 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 resetmapleaving 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.jsonand 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
- Sponge: fix commands failing to register
### 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, Minecraft 26.3). (#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 undermap.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 todefaultand get the new counts - The default
max-chunks-per-intervalfor 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-*-regionlocale keys are nowcould-not-*-image - Removed squaremap-client support
- Mark [Moonrise](https://modrinth.com/mod/moonrise-opt) versions older than 1.0.1 as incompatible on Fabric and NeoForge (Moonrise is still optional)
- 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 resetmapleaving 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.jsonand 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
- Sponge: fix commands failing to register
### 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 undermap.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 todefaultand get the new counts - The default
max-chunks-per-intervalfor 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-*-regionlocale keys are nowcould-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 resetmapleaving 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.jsonand 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
### 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 undermap.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 todefaultand get the new counts - The default
max-chunks-per-intervalfor 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-*-regionlocale keys are nowcould-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 resetmapleaving 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.jsonand 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
### 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 undermap.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 todefaultand get the new counts - The default
max-chunks-per-intervalfor 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-*-regionlocale keys are nowcould-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 resetmapleaving 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.jsonand 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
### 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 undermap.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 todefaultand get the new counts - The default
max-chunks-per-intervalfor 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-*-regionlocale keys are nowcould-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 resetmapleaving 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.jsonand 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
### Changed
- Align NeoForge shutdown lifecycle with Fabric
- Update dependencies
### Fixed
- Fix incorrect grass and foliage colors caused by a nondeterministic biome downfall lookup #290 (#578)
- Fix crash caused by fluids with no tint source, a regression from the Minecraft 26.1 update #588
- Fix mobile viewport height so browser chrome does not obscure the bottom controls #561
- Fix invalid map markers and missing sidebar entries for players without position data
### Changed
- Align NeoForge shutdown lifecycle with Fabric
- Update dependencies
### Fixed
- Fix incorrect grass and foliage colors caused by a nondeterministic biome downfall lookup #290 (#578)
- Fix crash caused by fluids with no tint source, a regression from the Minecraft 26.1 update #588
- Fix mobile viewport height so browser chrome does not obscure the bottom controls #561
- Fix invalid map markers and missing sidebar entries for players without position data
### Changed
- Align NeoForge shutdown lifecycle with Fabric
- Update dependencies
### Fixed
- Fix incorrect grass and foliage colors caused by a nondeterministic biome downfall lookup #290 (#578)
- Fix crash caused by fluids with no tint source, a regression from the Minecraft 26.1 update #588
- Fix mobile viewport height so browser chrome does not obscure the bottom controls #561
- Fix invalid map markers and missing sidebar entries for players without position data
### Changed
- Align NeoForge shutdown lifecycle with Fabric
- Update dependencies
### Fixed
- Fix incorrect grass and foliage colors caused by a nondeterministic biome downfall lookup #290 (#578)
- Fix crash caused by fluids with no tint source, a regression from the Minecraft 26.1 update #588
- Fix mobile viewport height so browser chrome does not obscure the bottom controls #561
- Fix invalid map markers and missing sidebar entries for players without position data
### Changed
- Update for Minecraft 26.3
- Update dependencies
### Fixed
- Fix randomly incorrect grass and foliage colors (savanna and others) caused by a nondeterministic biome downfall lookup #290 (#578)
- Fix crash caused by fluids with no tint source, a regression from the Minecraft 26.1 update #588
- Web: use dynamic viewport height so mobile browser chrome no longer obscures the bottom controls #561
- Web: handle players without position data (no more invalid map markers; they remain listed in the sidebar)
### Changed
- Update for Minecraft 26.3
- Update dependencies
### Fixed
- Fix randomly incorrect grass and foliage colors (savanna and others) caused by a nondeterministic biome downfall lookup #290 (#578)
- Fix crash caused by fluids with no tint source, a regression from the Minecraft 26.1 update #588
- Web: use dynamic viewport height so mobile browser chrome no longer obscures the bottom controls #561
- Web: handle players without position data (no more invalid map markers; they remain listed in the sidebar)
### Changed
- Update for Minecraft 26.3
- Update dependencies
### Fixed
- Fix randomly incorrect grass and foliage colors (savanna and others) caused by a nondeterministic biome downfall lookup #290 (#578)
- Fix crash caused by fluids with no tint source, a regression from the Minecraft 26.1 update #588
- Web: use dynamic viewport height so mobile browser chrome no longer obscures the bottom controls #561
- Web: handle players without position data (no more invalid map markers; they remain listed in the sidebar)
### Changed
- Update for Minecraft 26.3
- Update dependencies
### Fixed
- Fix randomly incorrect grass and foliage colors (savanna and others) caused by a nondeterministic biome downfall lookup #290 (#578)
- Fix crash caused by fluids with no tint source, a regression from the Minecraft 26.1 update #588
- Web: use dynamic viewport height so mobile browser chrome no longer obscures the bottom controls #561
- Web: handle players without position data (no more invalid map markers; they remain listed in the sidebar)
### Changed
- Use Modrinth for update checks to only recommend releases for the current Minecraft version
### Fixed
- Adapt to NeoForge's
BreakBlockEventAPI change (#568) - Fix NeoForge block updates for multi-place events
### Changed
- Use Modrinth for update checks to only recommend releases for the current Minecraft version
### Fixed
- Adapt to NeoForge's
BreakBlockEventAPI change (#568) - Fix NeoForge block updates for multi-place events
### Changed
- Use Modrinth for update checks to only recommend releases for the current Minecraft version
### Fixed
- Adapt to NeoForge's
BreakBlockEventAPI change (#568) - Fix NeoForge block updates for multi-place events
### Changed
- Use Modrinth for update checks to only recommend releases for the current Minecraft version
### Fixed
- Adapt to NeoForge's
BreakBlockEventAPI change (#568) - Fix NeoForge block updates for multi-place events
### Changed
- Use Modrinth for update checks to only recommend releases for the current Minecraft version
- Align NeoForge shutdown lifecycle with Fabric
- Update dependencies
### Changed
- Use Modrinth for update checks to only recommend releases for the current Minecraft version
- Align NeoForge shutdown lifecycle with Fabric
- Update dependencies