English | 日本語
A client-side Minecraft mod that finds a route you can actually walk to a destination, then draws it in the world, on Xaero's World Map, and on Xaero's Minimap. The top of the screen tells you where to go next.
- Minecraft 26.3, on Forge 66.0.9+ or Fabric (Fabric Loader 0.19.0+ and Fabric API 0.161.0+)
- Minecraft 26.2, on NeoForge 26.2.0.88+, Forge 65.1.3+, or Fabric (Fabric Loader 0.19.0+ and Fabric API 0.161.0+)
- Minecraft 26.1.2, on NeoForge 26.1.2.112+, Forge 64.1.3+, or Fabric (Fabric Loader 0.19.0+ and Fabric API 0.155.3+). The Fabric jar also runs on Minecraft 26.1 and 26.1.1
- Minecraft 1.21.11, on NeoForge 21.11.45+, Forge 61.2.1+, or Fabric (Fabric Loader 0.17.3+ and Fabric API 0.141.6+)
- Minecraft 1.21.10, on NeoForge 21.10.64+, Forge 60.1.15+, or Fabric (Fabric Loader 0.17.0+ and Fabric API 0.138.4+). The Fabric jar also runs on Minecraft 1.21.9 (Fabric API 0.134.1+)
- Minecraft 1.21.8, on NeoForge 21.8.54+, Forge 58.1.22+, or Fabric (Fabric Loader 0.16.13+ and Fabric API 0.136.1+). The Fabric jar also runs on Minecraft 1.21.6 and 1.21.7 (Fabric API 0.128.2+)
- Minecraft 1.21.5, on NeoForge 21.5+, Forge 55.0.24+, or Fabric (Fabric Loader 0.16.10+ and Fabric API 0.128.2+)
- Minecraft 1.21.4, on NeoForge 21.4+, Forge 54.1.5+, or Fabric (Fabric Loader 0.16.9+ and Fabric API 0.119.4+)
- Minecraft 1.21.3, on NeoForge 21.3+, Forge 53.1.2+, or Fabric (Fabric Loader 0.15.11+ and Fabric API 0.114.1+)
- Minecraft 1.21.1, on NeoForge 21.1.228+, Forge 52.1.16+, or Fabric (Fabric Loader 0.15.11+ and Fabric API 0.102.0+). The NeoForge and Fabric jars also run on Minecraft 1.21, with NeoForge 21.0+ or Fabric API 0.102.0+
- Minecraft 1.20.6, on NeoForge 20.6+, Forge 50.2.1+, or Fabric (Fabric Loader 0.15.11+ and Fabric API 0.100.8+). The Fabric jar also runs on Minecraft 1.20.5 (Fabric API 0.97.8+)
- Minecraft 1.20.4, on NeoForge 20.4+, Forge 49.1.10+, or Fabric (Fabric Loader 0.15.11+ and Fabric API 0.97.3+). The Fabric jar also runs on Minecraft 1.20.3 (Fabric API 0.91.1+)
- Minecraft 1.20.2, on Forge 48+ or Fabric (Fabric Loader 0.15.11+ and Fabric API 0.91.6+)
- Minecraft 1.20.1, on Forge 47.4.23+ or Fabric (Fabric Loader 0.15.11+ and Fabric API). The jars also run on Minecraft 1.20, with Forge 46+ or Fabric API 0.83.0+
- Minecraft 1.19.2, on Forge 43+ or Fabric (Fabric Loader 0.15.11+ and Fabric API 0.77.0+)
- Minecraft 1.18.2, on Forge 40+ or Fabric (Fabric Loader 0.15.11+ and Fabric API 0.77.0+)
- Minecraft 1.16.5, on Forge 36.2.39+ or Fabric (Fabric Loader 0.15.11+ and Fabric API 0.42.0+). Runs on Java 8
- A Java heap of at least 2 GB, the official launcher's default. Below 2.5 GB the navigation graph covers a smaller area (see Known limitations)
- Client-only. Nothing to install on the server. If the Forge jar is accidentally placed in a
dedicated server's
modsfolder, it has no server-side feature and does not block startup. - MIT licensed
How routing works → A walkthrough of how the route is found and kept up to date, from the coarse map down to each step.
Contributor-facing design contracts are collected in the architecture decision records.
This is still a 0.x release, and routing is the part still worth stress-testing. If a route detours,
stops short, never appears, or sends you somewhere you cannot follow, run
/xaeronav debug probe <x> <y> <z> where it happens and
open an issue with that output —
it says what the search reached and why it stopped, which is usually enough to reproduce the
problem here.
- Install a loader:
- Minecraft 26.3: Forge 66.0.9 or newer, or Fabric with Fabric Loader 0.19.0 or newer plus Fabric API 0.161.0 or newer.
- Minecraft 26.2: NeoForge 26.2.0.88 or newer, Forge 65.1.3 or newer, or Fabric with Fabric Loader 0.19.0 or newer plus Fabric API 0.161.0 or newer.
- Minecraft 26.1.2: NeoForge 26.1.2.112 or newer, Forge 64.1.3 or newer, or Fabric with Fabric Loader 0.19.0 or newer plus Fabric API 0.155.3 or newer. The Fabric jar also runs on Minecraft 26.1 and 26.1.1.
- Minecraft 1.21.11: NeoForge 21.11.45 or newer, Forge 61.2.1 or newer, or Fabric with Fabric Loader 0.17.3 or newer plus Fabric API 0.141.6 or newer.
- Minecraft 1.21.10: NeoForge 21.10.64 or newer, Forge 60.1.15 or newer, or Fabric with Fabric Loader 0.17.0 or newer plus Fabric API 0.138.4 or newer. The Fabric jar also runs on Minecraft 1.21.9, with Fabric API 0.134.1 or newer.
- Minecraft 1.21.8: NeoForge 21.8.54 or newer, Forge 58.1.22 or newer, or Fabric with Fabric Loader 0.16.13 or newer plus Fabric API 0.136.1 or newer. The Fabric jar also runs on Minecraft 1.21.6 and 1.21.7, with Fabric API 0.128.2 or newer.
- Minecraft 1.21.5: NeoForge 21.5 or newer, Forge 55 or newer, or Fabric with Fabric Loader 0.16.10 or newer plus Fabric API 0.128.2 or newer.
- Minecraft 1.21.4: NeoForge 21.4 or newer, Forge 54.1.5 or newer, or Fabric with Fabric Loader 0.16.9 or newer plus Fabric API 0.119.4 or newer.
- Minecraft 1.21.3: NeoForge 21.3 or newer, Forge 53.1.2 or newer, or Fabric with Fabric Loader 0.15.11 or newer plus Fabric API 0.114.1 or newer.
- Minecraft 1.21.1: NeoForge 21.1.228 or newer, Forge 52.1.16 or newer, or Fabric with Fabric Loader 0.15.11 or newer plus Fabric API 0.102.0 or newer. The NeoForge and Fabric jars also run on Minecraft 1.21.
- Minecraft 1.20.6: NeoForge 20.6 or newer, Forge 50.2.1 or newer, or Fabric with Fabric Loader 0.15.11 or newer plus Fabric API 0.100.8 or newer. The Fabric jar also runs on Minecraft 1.20.5, with Fabric API 0.97.8 or newer.
- Minecraft 1.20.4: NeoForge 20.4 or newer, Forge 49.1.10 or newer, or Fabric with Fabric Loader 0.15.11 or newer plus Fabric API 0.97.3 or newer. The Fabric jar also runs on Minecraft 1.20.3, with Fabric API 0.91.1 or newer.
- Minecraft 1.20.2: Forge 48 or newer, or Fabric with Fabric Loader 0.15.11 or newer plus Fabric API 0.91.6 or newer.
- Minecraft 1.20.1: Forge 47.4.23 or newer, or Fabric with Fabric Loader 0.15.11 or newer plus Fabric API.
- Minecraft 1.19.2: Forge 43 or newer, or Fabric with Fabric Loader 0.15.11 or newer plus Fabric API 0.77.0 or newer.
- Minecraft 1.18.2: Forge 40 or newer, or Fabric with Fabric Loader 0.15.11 or newer plus Fabric API 0.77.0 or newer.
- Minecraft 1.16.5: Forge 36.2.39 or newer, or Fabric with Fabric Loader 0.15.11 or newer plus Fabric API 0.42.0 or newer.
- Download the jar for your loader and Minecraft version from the
Releases page and drop it into your
modsfolder. Jars are namedxaeronav-<version>-<loader>-<minecraft version>.jar, for examplexaeronav-0.3.0-fabric-1.20.1.jar. - For map integration, also install Xaero's World Map and/or Xaero's Minimap. This part is optional. Minimum versions: World Map 1.44.2 / Minimap 26.4.2 on 1.21.1, 1.21.4, 1.21.5 and 1.20.4, World Map 1.46.0 / Minimap 26.5.0 on 26.1.2, 1.21.11, 1.21.10, 1.21.8, 1.20.1, 1.19.2, 1.18.2 and 1.16.5, World Map 1.46.1 / Minimap 26.5.1 on 26.2, World Map 1.46.4 / Minimap 26.5.3 on 26.3. World Map 1.40.6 / Minimap 25.3.5 on 1.21.3. Xaero no longer updates its mods for some versions, so there the last releases work: World Map 1.39.12 / Minimap 25.2.10 on 1.20.2, 1.20.5 and 1.20.6 (Forge: Minimap 25.2.12), World Map 1.39.10 / Minimap 25.2.7 on 1.21.6, World Map 1.39.12 / Minimap 25.2.10 on 1.21.7, World Map 1.39.17 / Minimap 25.2.15 on 1.21.9. On 1.21 and 1.20.3 (Fabric) the current World Map works, but the last Minimap for them is 25.3.2, which the current World Map refuses to run with. To use both there, take World Map 1.41.2 with Minimap 25.3.2.
Routes are found with A* over the actual terrain, not by straight-line distance. The move set covers walking, climbing, descending, swimming, riding a boat, ladders and vines, jumping gaps of 1 to 3 blocks, digging, and placing blocks to bridge a gap.
Blocks placed to bridge a gap are budgeted against how many you actually carry. A route that needs more than you have is only offered when there is no other way through, and the HUD says how many are missing. When a route would eat most of your stack, a slightly longer path that places fewer blocks wins.
Each segment is colored by what you do there. Blocks that need digging are highlighted through walls, and the next one to dig gets an outline. Colors also flag trouble ahead: digging next to lava, digging that lets water flow in, a void below, a swim longer than your breath, a fall that deals damage when those are allowed.
Long distances are handled in stages. Beyond the loaded chunks a coarse route is drawn from Xaero's map data, and the detailed search is stitched onto it one segment at a time. The loaded area itself is turned into a navigation graph in the background, built from the same moves the search uses, so the search aims straight at the destination instead of detouring through the coarse route's waypoints. That also covers dimensions where several floors stack at the same XZ, like the Nether. How routing works walks through all of this in detail. If you are underground and the destination is on the surface, the route heads for the nearest cave mouth or cliff first instead of digging straight up under the target. Dimensions without a sky are the exception; there is no surface to aim for.
Start gliding with an elytra and the mod switches to a 3D aerial path that avoids terrain, with its own deviation threshold and recalculation interval. Recalculation is deliberately lazy while walking, so drifting a few blocks off the line does not redraw it and the guidance stays still.
Without Xaero installed, only the map drawing and the right-click menu go away. In-world rendering and the HUD work as usual.
| Method | Action |
|---|---|
| World map | Right-click empty space on the map → "Route here" |
| Waypoint | Right-click a waypoint → "Route here" |
| Keybind | "Route to block looked at" (unbound by default) |
| Command | /xaeronav goto <x> <y> <z> |
Taking off with an elytra switches the guidance on its own. Under a roof or in the Nether it computes a terrain-avoiding aerial path and shows it as a light-blue line; under open sky it puts a light beam where you should land. As soon as you touch down it goes back to walking navigation toward the same destination.
However you set it, the destination is marked on Xaero's maps, so you can tell where you are headed without following the line to its end. With Xaero's Minimap installed it is registered as a temporary Xaero waypoint: upright on a rotating minimap, pinned to the edge with a distance readout once it goes off screen, and visible in the world like any other waypoint. It is never written to disk and disappears when you clear the route. Without the minimap, XaeroNav draws its own pin on the world map, which keeps the same on-screen size however far you zoom out.
Clear the route with /xaeronav clear or its keybind.
| Command | What it does |
|---|---|
/xaeronav goto <x> <y> <z> |
Set the destination |
/xaeronav clear |
Clear the route |
/xaeronav version |
Print the running build (include this in bug reports) |
/xaeronav debug ... holds measurement commands that print numbers to chat without navigating
anywhere: mapdata [radiusChunks] for how much of Xaero's map data is available around you,
route and corridor for the coarse waypoint chain and its per-leg refinement, probe for what
the detailed search reached and why it stopped, and flight for the aerial route. They are there
to explain a route that came out wrong, so attach their output to a bug report — but review it
first, since it includes your current position, destination, and nearby terrain.
All unbound by default (Options → Controls → XaeroNav).
| Action | Purpose |
|---|---|
| Route to block looked at | Main way to set a destination without Xaero installed |
| Clear route | |
| Toggle HUD | Show or hide the on-screen guidance (persisted to the config file) |
| Open config screen | Edit config/xaeronav-client.toml via GUI |
| Toggle auto-walk | Minecraft 26.3+ only. Walk the shown route automatically (see below) |
With a destination set, the auto-walk key steers along the route and holds forward, jump and sprint for you (walking, stepping up, ladders). While it is on, the route is planned for that: it avoids swimming, placing blocks (bridges, pillars), gap jumps and falls that hurt, and is planned again when you switch auto-walk on or off. In a boat it steers the boat across the water and stops at the shore, where you get out and pick the boat up. On a horse, donkey, mule or camel it steers the animal and stops where the route continues on foot. It stops and tells you why when:
- the next few steps need you: digging, launching a boat, or flying
- a dangerous section is ahead: lava, void, drowning, magma
- there is no route without swimming, building or jumps
- you take over: any other movement key, sneaking, or turning the camera
- you take damage, or your health drops to
autoWalk.stopHealthor below - you arrive, or the route is cleared
It pauses while a screen is open or while the route is being computed. Many multiplayer servers treat automated
movement as cheating, so it only runs in singleplayer unless autoWalk.allowOnServers is set.
Movement:
| Color | Meaning |
|---|---|
| Green | Walking |
| Yellow | Climbing up |
| Blue | Climbing or stepping down |
| Dark blue | Swimming |
| Light cyan | Riding a boat |
| Purple | Ladder or vine |
| Pink | Jumping a gap |
| Orange | Digging (target block outlined) |
| Cyan | Bridging with placed blocks |
| Teal | Fall softened by placing water at the last moment (MLG) |
Warnings:
| Color | Meaning |
|---|---|
| Red | Adjacent to lava |
| Magenta | Void below |
| Light blue | Digging lets water flow in |
| Reddish pink | Swim segment with no breath left |
| Orange-red | Fall that deals damage |
| Pale orange | Sneaking across a magma block |
A warning color always wins over the movement color for that segment, so a dangerous step never looks like an ordinary one.
Other markings:
| Color | Meaning |
|---|---|
| Off-white | Dotted line for a stretch with no known route, heading toward the unexplored destination |
| Amber | Coarse waypoint chain for a long-distance route |
| Sky blue | Aerial path while gliding with an elytra |
| Pale yellow beam | Where to land while gliding under open sky |
| Red pin | The destination, drawn by XaeroNav when Xaero's Minimap is not installed |
config/xaeronav-client.toml, or the "Config" button in the Mods list.
| Key | Default | Description |
|---|---|---|
routeProfile |
BALANCED |
What routes optimise for: BALANCED, FASTEST (risk surcharges halved), SAFEST (risk weighed up to 4x; also forces avoidRiskyJumps on and fallDamageToleranceEnabled off) or RESOURCE_SAVING (placing and digging weighed 3x) |
diggingEnabled |
true |
Allow digging in routes |
bridgingEnabled |
true |
Allow placing blocks to bridge gaps or climb cliffs |
lavaBridgingEnabled |
true |
Allow bridging over lava (also requires bridgingEnabled; last resort when no route avoiding lava exists) |
jumpGapEnabled |
true |
Allow jumping gaps up to 3 blocks wide |
swimmingEnabled |
true |
Allow routes to swim or wade. When false, routes go around water (or take a boat); you can still swim out of water you are already in, and a destination in water is still reached |
boatsEnabled |
true |
Allow crossing water by boat when you carry one. When false, a boat in your inventory is ignored |
mountsEnabled |
true |
Minecraft 26.3+. While riding a horse, donkey, mule or camel, plan the route for the animal: it needs wider gaps and more headroom, steps up one block, stays out of water and is faster. The route only gets off (and continues on foot) where the animal can't go on |
avoidRiskyJumps |
true |
Avoid jumps over the void or a fatal drop (opened only when no way around exists at all) |
blockBudgetEnabled |
true |
Cap the total blocks a route may place at how many you carry (lifted when no route fits, with a shortage warning; never applied in creative) |
blockBudgetReserve |
0 |
Blocks held back from that budget |
fallDamageToleranceEnabled |
false |
Allow descents that deal fall damage (up to 1/3 of health at search time; with a water bucket, MLG descents are also considered) |
strictLimits |
false |
Never loosen the limits on bridge length, time underwater, fall damage, risky jumps and carried blocks, even when there is no other way. false loosens them only when no route fits and shows the result with warnings; true shows no route and says no way exists within the limits |
deepLookAheadEnabled |
true |
Keep extending the route ahead as far as loaded chunks allow while walking |
costToGoGuideEnabled |
true |
Guide the detailed search with a cost-to-go estimate. This builds a navigation graph of the loaded area in the background and aims straight at the destination (uses spare CPU cores and up to about 270 MB, or about 150 MB when the Java heap limit is below 2.5 GB); until the graph is ready, the coarse route's estimate is used. false falls back to straight-line distance |
detailHorizonBlocks |
96 |
Max horizontal distance the detailed search targets in one shot; farther destinations get intermediate waypoints |
maxBridgeRunBlocks |
96 |
How many consecutive blocks a bridge over open air can run before it's abandoned for a detour (0 = unlimited) |
maxLavaBridgeRunBlocks |
30 |
Same, but specifically for bridges over lava (0 = unlimited) |
maxVoidBridgeRunBlocks |
96 |
Same, but specifically for bridges over the bottomless void (0 = unlimited; the default matches the 47-81 block gaps measured between End islands) |
maxSubmergedTicks |
250 |
How many ticks a route may keep your head underwater (0 = unlimited) |
searchHorizontalMargin |
64 |
Horizontal search margin (blocks) |
searchVerticalMargin |
32 |
Vertical search margin (blocks) |
deviationThresholdBlocks |
4.0 |
Recalculate once you're this far from the line; higher keeps the line steadier |
arrivalRadiusBlocks |
3.0 |
Distance counted as "arrived" |
groundLevelY |
60 |
Y level and above, with open sky, counted as "surface" (basis for surface-first routing; inactive in dimensions without sky) |
recalcIntervalTicks |
40 |
Interval for checking block changes along the route |
maxExpandedNodes |
100000 |
Cap on nodes expanded per search; higher reaches farther accurately but costs more CPU/memory |
heuristicWeight |
1.5 |
How much the search favors getting close to the goal; 1.0 guarantees the shortest path but can fail to reach destinations where real cost (digging, swimming) outruns the estimate |
flightRoutingEnabled |
true |
Compute an aerial path while gliding/flying (false reverts to a straight line to the destination) |
elytraFlyingMinGroundClearanceBlocks |
4 |
Minimum height above ground (or water) before an elytra glide counts as flying. A glide must also last half a second, so bouncing on a jump does not throw the route away |
flightCellBlocks |
6 |
Side length (blocks) of the grid used to solve the aerial path; smaller fits through tighter gaps but reaches less far |
flightDeviationThresholdBlocks |
24.0 |
Recalculate the aerial path once you're this far from it |
flightRecalcIntervalTicks |
20 |
Recalculation interval (ticks) while gliding |
flightClearanceDetourBlocks |
12 |
How many blocks of detour a tight passage is worth avoiding (0 disables this) |
flightMaxExpandedNodes |
150000 |
Cap on cells expanded per aerial search |
flightExtendMaxExpandedNodes |
60000 |
Cap on cells expanded when extending the path further from its end |
flightHeuristicWeight |
1.5 |
Heuristic weight for the aerial search |
additionalDiggableBlocks |
[] |
Extra block IDs allowed to dig (e.g. modded terrain blocks; example: "minecraft:cobblestone") |
additionalForbiddenBlocks |
[] |
Extra block IDs forbidden to dig; takes priority over the list above (example: "minecraft:diamond_ore") |
By default, digging only allows naturally generated terrain: stone, dirt, sand, ores, leaves, netherrack and so on. Processed blocks such as cobblestone, stone bricks and planks are never dug, neither are blocks with an inventory, and anything unrecognized is treated as not diggable.
| Key | Default | Description |
|---|---|---|
hudEnabled |
true |
On-screen guidance at the top of the screen |
straightLineEnabled |
true |
Show a dotted line to the destination for stretches with no known route |
goalMarkerEnabled |
true |
Mark the destination on Xaero's maps (a temporary waypoint with the minimap installed, otherwise a pin drawn by XaeroNav) |
fullRoutePreviewEnabled |
true |
Minecraft 26.3+, singleplayer: plan the whole route at once and draw all of it on the map (pale green). The terrain past render distance is read from the world save, so it reaches as far as chunks you have ever generated; past that the dotted lines carry on. The time estimate then comes from this route too |
| Key | Default | Description |
|---|---|---|
allowOnServers |
false |
Allow auto-walk on multiplayer servers. Only enable it where the server rules allow automated movement |
sprint |
true |
Sprint on straight, level stretches |
stopHealth |
6 |
Stop once health is at or below this many half-hearts (0 = never) |
- The search only covers loaded chunks and stops at the expanded-node cap. A far destination gets a route that ends partway and continues as a dotted line toward the destination. The rest is computed as you go, and the HUD says so.
- Search range is capped by Minecraft's render distance (render distance 8 means 128 blocks). Chunks the server hasn't sent can't be read, and vanilla has no packet to request them. If long-distance guidance keeps cutting off, raise your render distance.
- Long-distance routing depends on Xaero's map data, so it isn't available without Xaero installed or in areas you haven't visited yet. It falls back to computing from loaded chunks only.
- While gliding with an elytra, the HUD shows the direct distance to the destination and upcoming climbs. Under open sky (Overworld and End) the mod puts a light beam where you should land instead of drawing an aerial path, and the HUD shows an arrow toward it and the distance.
- Routes don't cross dimensions. Changing dimension clears the current destination.
- Map integration hooks into Xaero's internals. If a newer Xaero changes them, only that part switches off; XaeroNav says which part in chat once per session, and in-world rendering and the HUD keep working.
- Map data that Xaero's Maps: Multiplayer+ downloads from a server is read like any other Xaero map data, so long-distance routing uses it (checked on NeoForge 1.21.1). With Xaero's cave mode on, the surface map isn't written, so there is nothing to share or route over.
- Surface-first routing doesn't work in dimensions without a sky (Nether, the End).
- The navigation graph covers up to 224 blocks around you, or 160 when the Java heap limit is below 2.5 GB, and never more than your render distance. It ignores block changes it hasn't rebuilt yet; it is rebuilt as you walk and when a search stops making progress. Rebuilding keeps about half of your CPU cores busy for up to about 2 seconds every 8 blocks you walk.
- A Java heap below 2 GB is not supported. The game itself can run out of memory there.
./gradlew build collectJarsThis builds every target (Minecraft version × loader) at once, and also runs spotlessCheck
(unused imports, trailing whitespace, final newline) and both test suites. collectJars gathers
each target's jar into build/libs/.
How the targets are set up, and how to add one, is in docs/multiloader.md. Release publishing and its required repository settings are documented in docs/releasing.md.
The suite is split by cost. ./gradlew test runs everything except the searches over real saved
world data, which take a few minutes run in parallel (about 4 on a 10-core machine); those carry @Tag("slow") and run as ./gradlew slowTest.
build runs both, so CI covers the whole suite.
./gradlew test # fast, a few seconds
./gradlew slowTest # real-terrain pathfinding searchesThe pathfinding core does not depend on the loader or the Minecraft version, so the tests only
actually run on the canonical node (canonical_test_node in stonecutter.properties.toml).
Running a dev client (pick a target). The script switches the active target first, then starts the
client; anything after the target name is passed on to Gradle. IntelliJ IDEA gets the same thing
as run configurations in .run/.
tools/run-client.sh 1.21.1-neoforge # with Xaero
tools/run-client.sh 1.20.1-forge # any other target
tools/run-client.sh 1.21.1-neoforge -Pwith_xaero=false # without Xaero (to check fallback behavior)Xaero is only on the classpath for compiling and for the dev client; it isn't bundled with the release.
Some jars also run on older Minecraft versions than the one they're built for (for example the
1.21.10 Fabric jar on 1.21.9). tools/compat_check.py builds the release jars and creates a Prism
Launcher instance for each of those versions, with the matching Xaero and Fabric API. With --auto
it launches them one by one and reports whether every Xaero hook ran.
tools/compat_check.py # create the instances, then play them by hand
tools/compat_check.py --auto # launch each one and check the Xaero hooks
tools/compat_check.py --auto 1.21.9-fabricpathfinding/
astar/ A* core, heap, heuristics, safety checks
coarse/ Coarse terrain from Xaero's map / live sampling, and long-distance waypoint chains
flight/ 3D aerial pathfinding while gliding (coarse route, grid A*, smoothing)
world/ Block reads (CellSource / ChunkView / CellData) and search bounds
cost/ Movement and digging cost baselines
async/ Worker-thread execution and cancellation
client/ Route state, rendering, HUD, guidance, commands, keybinds
mixin/xaero/ Hooks into Xaero's World Map / Minimap (required=false)
config/ TOML configuration (defined once, only the backing store differs per loader)
platform/ Per-loader startup and event wiring. No loader-specific code lives anywhere else
The search core never looks at the Minecraft world directly. It reads blocks through
CellSource, a 4-method
window. The production implementation is ChunkView; tests pass FakeCells, which lets terrain be
written as text.
MIT (LICENSE).
Movement cost baselines are informed by measurements used in Baritone (LGPL), but the code itself is an independent implementation.

