Fast to create. Fast to query. No full archive decompression required.
cargo install arcx
The Problem
Strong cross-file compression, but TAR+ZSTD typically requires reading and decompressing the archive sequentially to reach the target file.
Fast per-file random access, but each file is compressed independently -- weak compression ratios.
ARCX does both.
Performance
Benchmarks
How much data does the format actually read from disk to retrieve a single file? ARCX reads the manifest plus one compressed block. TAR+ZSTD typically requires reading and decompressing the archive sequentially to reach the target file.
| Dataset | Target File | ARCX | TAR+ZSTD | ZIP |
|---|---|---|---|---|
| Build artifacts (581 files, 181 MB) | 36.4 KB .o file | 713.8 KB | 140.4 MB | 36.5 KB |
| Python ML project (206 files, 64 MB) | 6.9 KB .py file | 326.1 KB | 63.1 MB | 2.1 KB |
| Log archive (1,008 files, 30 MB) | 35.8 KB log file | 365.8 KB | 5.0 MB | 6.1 KB |
| Node.js project (19,001 files, 43 MB) | 1.5 KB .d.ts file | 1.3 MB | 17.4 MB | 632 B |
| Source code repo (389 files, 1.9 MB) | 4.5 KB .go file | 373.8 KB | 656.1 KB | 1.9 KB |
Architecture
ARCX groups files into independently decompressible blocks. A binary manifest at the end maps every file path to its block location.
Read the 40-byte footer to locate the manifest. Decompress the manifest and look up the target file's block reference.
Seek directly to the relevant compressed block. Skip every other block in the archive entirely.
Decompress only the single block containing the target file. Extract the file data from the decompressed output.
ARCX stores the index at the end and data in independently decompressible blocks.
Archive Layout +----------+-------+-------+-------+-----+----------+--------+ | Header | Block | Block | Block | ... | Manifest | Footer | | (80 B) | 0 | 1 | 2 | | | (40 B) | +----------+-------+-------+-------+-----+----------+--------+ On `arcx get`: 1. Read Footer (40 B) --> manifest offset 2. Read Manifest --> file -> block map 3. Seek to Block N --> decompress one block extract file data Total I/O: footer + manifest + one block. Everything else is untouched.
Comparison
| Feature | ZIP | TAR+ZSTD | ARCX |
|---|---|---|---|
| Cross-file compression | No | Yes | Yes |
| Selective file access | Yes | No | Yes |
| Compression ratio | Weak | Strong | Strong |
| Single-file retrieval speed | Fast | Slow | Fast |
| Remote range-request compatible | Yes | No | Yes |
Applications
Store build outputs once, retrieve individual files on demand without downloading and decompressing the full archive.
Reduce egress costs by reading only the bytes you need. Combine with HTTP range requests for remote selective extraction.
Inspect package metadata or extract a single file without pulling the entire package.
Load individual textures, models, or audio files from a compressed asset bundle at runtime.
Query a specific day's logs from a compressed monthly archive without decompressing the other 29 days.
Extract only the changed module's artifacts from a full build archive, cutting restore times from minutes to milliseconds.
Get Started
# Install cargo install arcx # Pack a directory into an archive arcx pack ./my-project output.arcx # Get a single file (instant) arcx get output.arcx src/main.rs # List contents arcx list output.arcx # Extract everything arcx extract output.arcx ./output-dir
# Build from source git clone https://github.com/getarcx/arcx.git cd arcx cargo build --release