Rust command-line tool for converting Minecraft Java Edition region saves between:
-
mca(.mca)Minecraft's default save format, supported by all servers.
-
linear(.linear)A compressed format, supported by LinearPurpur, Kaiiju, LeavesMC and Luminol.
-
blinear_v2(.b_linear)The next-generation compression format, a reimplemented linear, created by Luminol.
-
blinear_v3(.b_linear)The third generation of blinear, supported by Luminol, provides better performance and stability.
- Parallel conversion with a configurable worker count
- Automatic use of available CPU threads when
--threadsis not set, capped to the discovered region-file count to avoid idle workers - Compression level control for compressed target formats
- Works on Windows and Linux
- Reads classic
linearv1/v2 files and modernlinear v3files - Writes
linearoutput in the modernlinear v3layout - Skips corrupted chunks when the format allows chunk-level recovery
- Fails corrupted whole-region inputs without producing partial garbage
- Accepts one or more world directories, region directories, or single region files
- Supports
--infomode for detailed save statistics without conversion - Prints a concise conversion summary before work starts
- Shows live progress in a single line with completed regions, successful chunks, discarded chunks, warning counts, and chunk throughput
- Writes each completed region file to the output path immediately instead of waiting for the whole batch to finish
cargo build --releasecargo run --release -- \
--to blinear-v3 \
--output /path/to/output \
/path/to/world--from <auto|mca|linear|blinear-v2|blinear-v3>
--to <mca|linear|blinear-v2|blinear-v3>
--output <PATH>
--info
--threads <N>
--compression-level <LEVEL>
Convert a world directory to blinear_v3:
cargo run --release -- \
--to blinear-v3 \
--output /data/out \
/data/worldConvert multiple region directories at once:
cargo run --release -- \
--to mca \
--threads 16 \
--compression-level 6 \
--output /data/out \
/data/world/region \
/data/world_nether/regionConvert with a fixed source format instead of auto-detection:
cargo run --release -- \
--from blinear-v2 \
--to linear \
--output /data/out \
/data/worldConvert a single region file:
cargo run --release -- \
--to mca \
--output /data/out \
/data/world/region/r.0.0.linearInspect a save without converting:
cargo run --release -- --info /data/worldInspect a single region file:
cargo run --release -- --info /data/world/region/r.0.0.b_linearBefore conversion starts, the CLI prints:
- input paths
- output path
- source-format mode and target format
- effective worker-thread count
- compression level
- total region-file count
During conversion, the CLI shows live progress including:
- completed region files versus total region files
- successful chunk count and discarded chunk count
- warnings seen so far
- chunks per second
With --info, the CLI prints:
- input type for each path (
world directory,region directory, orregion file) - total storage size
- detected storage-format breakdown
- region-file count and readable/failed region counts
- decoded chunk count, discarded chunks, and warnings
- per-file details when the input itself is a single region file
mca: zlib0..=9linear,blinear_v2,blinear_v3: zstd1..=22
Default compression level is 6.
If an input path is a supported region file, it is treated as a single-file input.
If an input directory directly contains region files, it is treated as a region directory.
If it does not, the converter searches recursively and treats the input as a world directory. Any nested directory that directly contains supported region files is converted, which covers layouts such as:
world/regionworld/DIM-1/regionworld/DIM1/region
- directory inputs are written under
--output/<input-folder-name>__<hash>/... - world inputs keep their internal relative region-directory structure inside that folder
- region-directory inputs write their region files directly inside that folder
- single region-file inputs are written directly under
--output - the hash suffix is stable for each source path, which keeps same-named directories from colliding across different runs
- Broken chunks are skipped with warnings when the format has enough structure to recover the rest of the region.
- Broken whole-region payloads fail that region file and leave other region files running.
- The process exits with a non-zero status if warnings or errors were encountered.
linearinput compatibility covers classic linear v1/v2 and the newer linear v3 layout from the referenced server implementation.linearoutput is written as linear v3.blinear_v2andblinear_v3are implemented from the referenced server-side format behavior and validated against the sample files.