Nothing is buffered whole
Contents stream through reused 64 KiB buffers, packing and extracting alike. An asset directory is never resident in memory, however large it is.
.zpak out. Streamed, hashed, and byte-for-byte reversible.$ zpack pack assets/ game.zpakPacked 56 files (77.2 MiB -> 71.7 MiB, 7.1% smaller)
$ zpack unpack game.zpak extracted/Extracted 56 files
$ diff -r assets/ extracted/ # no output: identicalNothing is buffered whole
Contents stream through reused 64 KiB buffers, packing and extracting alike. An asset directory is never resident in memory, however large it is.
Reversible by construction
Every entry carries an XxHash64 of its original bytes, checked on every read. Entries are sorted before writing, so packing the same tree twice produces the same archive.
A library, not just a binary
main.zig is argument handling and nothing else. A game depends on the
zpack module directly and never shells out to the CLI.
No dependencies
The standard library and nothing beyond it. Deflate, hashing, and the
filesystem all come from std.