hv Haven

v0.9.4 · MIT licensed

A boring archive format for build artifacts

Haven packs directories into a single file with content-addressed chunks, so repeated builds of the same tree cost almost nothing to store. One static binary, no runtime dependencies, deterministic output.

Why another archive format

Most CI pipelines end up tarring a build directory and pushing it somewhere. That works until the directory is 400 MB and 98% of it is identical to yesterday's build. Haven splits files into content-addressed chunks and stores each unique chunk once, so the incremental cost of an artifact is roughly the size of what actually changed.

It is not a backup tool and not a package manager. It does one job: take a directory, produce a single verifiable file, and unpack it byte-for-byte somewhere else.

Properties

Deterministic

The same input tree always produces the same archive bytes. Timestamps and ordering are normalised, so archive hashes are comparable across machines.

Deduplicated

Rolling-hash chunking with a 64 KiB target. Shared chunks between archives in the same store are written once.

Verifiable

Every archive carries a manifest of chunk digests. haven verify re-hashes the contents and fails loudly on mismatch.

Streamable

Archives can be written to and read from a pipe. No seeking required for the common create and extract paths.

Single binary

Statically linked, around 4 MB. No shared libraries, no interpreter, nothing to install on the target host.

Small surface

Six subcommands. The format specification is nine pages. Both are meant to stay that way.

Thirty seconds

$ haven create --store ./cache -o dist-2f9c.hv ./dist
  scanned    1841 files    412.6 MiB
  chunked    6702 chunks   409.1 MiB
  written     213 chunks    18.4 MiB   (95.5% deduplicated)
  archive    dist-2f9c.hv   18.7 MiB

$ haven verify dist-2f9c.hv
  ok    1841 files    6702 chunks    manifest digest b3:41d9e0c7…

$ haven extract dist-2f9c.hv --into /srv/release/2f9c
  restored   1841 files    412.6 MiB   in 2.31s

The 95.5% figure is what a second build of an unchanged frontend bundle typically looks like. Cold archives dedupe far less; see the measurements.

Status

Current release
0.9.4 — 2 August 2026
Format version
2 (stable since 0.8.0)
Platforms
linux/amd64, linux/arm64, darwin/arm64
License
MIT

The format is frozen for the 0.9 line. Anything that would change archive bytes is deferred to 1.0.