The toolkit

One engine.
Many surfaces.

CAVS is a Rust core wrapped in a command-line toolkit, an HTTP origin and a streaming client — plus language SDKs for Go, Kotlin and Node, engine plugins for Godot (shipping) with Unity and Unreal on the way, and a SteamPipe-style build & update analyzer built into the CLI. Everything below is Apache-2.0 licensed and lives in one repository.

Downloads — always the latest

Get each product,
on its own version.

Core, SDKs, engine plugins and the desktop app now release on independent version trains. Every button below resolves to the latest published release of that product automatically.

Core & CLI v1.2.0

The cavs / cavs-server / cavs-client binaries and the Rust crates.

SDKs v1.2.0

Go, Kotlin and Node — versioned together with the core they bind to.

Engine plugins

The Godot plugin as an installable addons/ zip. Unity and Unreal are on the way.

Desktop app

The CAVS Desktop build/update lab — native installers for every platform.

Core & SDKs share a version (the SDKs bind the core through a C ABI). Plugins and the desktop app version independently — a desktop-only change ships a desktop release without touching the core.

SDKs — Go · Kotlin · Node

The engine,
in your language.

The SDKs load the same compiled Rust core the CLI uses through a stable C ABI, and expose idiomatic APIs — so publishers, backend teams and CI/CD systems integrate CAVS programmatically instead of shelling out. One JSON contract, three ecosystems: analyze, preview, packDirectory, createPlan, applyPlan, verifyInstall, benchmark and estimateSavings.

Every SDK carries the same operations and error codes; the native library ships per platform (linux / macOS / windows, x86_64 & arm64) with a SHA-256 checksum the loader verifies. Full references: Go, Kotlin, Node.

cavs — the CLI

The whole workflow,
one command.

Content is split into chunks identified by their BLAKE3-256 hash; each unique chunk is stored once. The CLI packages releases, produces offline patches, plans delivery routes, manages the store and runs the reproducible benchmark suite. Every command is grouped below.

// packaging

cavs pack --raw <file> -o <out.cavs>
Package any file (PCK, bundle, binary) into a deduplicated .cavs. --profile auto classifies the payload and sweeps candidate profiles; --prev optimizes for update egress; --bootstrap also emits a full artifact for cold clients; --sign attaches an Ed25519 signature.
cavs pack-dir <dir> -o <out.cavs>
Package a directory tree as a container: one deduplicated track per file, plus directory / symlink / exec metadata. Applies with per-file no-op detection and staged installs. --ignore globs merge with .cavsignore.
cavs unpack <in.cavs> -o <dir>
Reconstruct the original file(s) from a .cavs, verifying the final SHA-256.
cavs keygen -o <key>
Generate an Ed25519 signing keypair so clients can verify your releases.

// offline toolkit — no server

cavs signature export <build> -o <.cavssig>
Export a compact, deterministic old-version signature (~0.07% of the source) so a new build can be diffed without the old bytes. signature inspect / ls / verify round out the subcommand.
cavs preview <new> --against <.cavssig>
Classify every entry NEW / MODIFIED / DELETED / SAME, estimate the update per route, detect renames by content, and warn when a compressed file will patch badly.
cavs diff-plan <old> <new> -o <.cavsplan>
Produce a deterministic, BLAKE3-sealed patch: copy-ranges from the old build plus zstd-19 fresh data. Portable and server-free.
cavs apply --old <dir> --plan <.cavsplan> --inplace
Stage, verify every file, journal, then commit. Interrupt it and re-run — mods and unchanged files are left untouched. --verify gates the final output.
cavs verify-install <dir> --against <.cavssig>
Check a folder against a signature, reporting MODIFIED / MISSING / EXTRA. --allow-extra-files tolerates saves and mods.
cavs file <.cavs> · cavs ls <.cavs>
Inspect and list entries inside a container without unpacking it.

// delivery planner & sidecars

cavs route-plan --installed <dir> --new <dir>
Price every route for one concrete client under a device profile (default, low-memory, slow-network, low-disk) and pick the cheapest that fits the memory budget.
cavs optimize-patch <old> <new> -o <.cavspatch>
Build a per-file optimized sidecar: copy-old, streaming plan ops, bsdiff, xdelta3 or recompressed data — every candidate measured, the smallest wins. --explain-strategies shows why.
cavs apply-patch <.cavspatch> --memory-budget 128MiB
Apply a sidecar with a hard memory ceiling — a route that would exceed it is refused up front (CAVS-E-MEMORY-BUDGET-EXCEEDED).
cavs patch-policy --versions v1,…,vN
Choose the hot pairs worth optimizing (previous, latest-stable, top-installed) so you never generate the all-pairs O(N²) patch graph.
cavs bench patch-policy --versions-dir builds
Benchmark practical patch policies — adjacent, sparse ladder, base hub, hot pairs, the all-pairs one-hop baseline — against CAVS routes under real user traffic models (v1.1.0).
cavs publish-dir <new> --previous <old> --out-dir <dir>
One-pass publishing: container + signature + plan + sidecar, preceded by a preview with rename detection and compressed-blob warnings.

// SteamPipe-style analysis — v0.9.0

cavs bench steampipe-style <old> <new>
Estimate the update under a public fixed-1MiB chunk model: changed chunks, estimated download, per-file ranking, local rebuild I/O. --scope per-file|global, --compression, --json. Always labeled as an estimate — never Valve's implementation.
cavs analyze steampipe <old> <new>
The diagnosis: scattered churn, asset shuffling, distributed-TOC/offset cascades, compressed blobs, metadata churn and oversized packs — each finding with severity, wasted bytes, cause, fix and expected improvement. Engine hints for Unreal / Unity / Godot.
cavs analyze-packs · cavs analyze godot-pck
Pack-file table (changed windows, scatteredness, entropy, main issue → one-line fix); the Godot variant parses the PCK directory and names the res:// paths behind each changed region.
cavs publish-preview <new> --previous <old> --routes all
Release readiness: every route measured (full, CAVS chunk/hybrid/plan, butler and bsdiff/xdelta3 when installed — missing tools skipped, never fatal), the SteamPipe-style row, layout warnings, and a recommended route with the reason.
cavs io-estimate <old> <new>
Local disk I/O per route — reads, writes, temp disk, creates/renames/deletes — timed under configurable device profiles (HDD / SATA / NVMe), flagging when I/O dominates the network saving.
cavs plan-update --policy balanced --client-state …
Policy route planner: network_min, cpu_min, ram_min, disk_io_min, balanced, hdd_friendly, developer_fast — scored per client state; unavailable routes are never chosen.
cavs optimize-layout <old> <new> --write-plan plan.json
Advisory restructuring plan with the estimated impact of each fix. Never modifies files.

// workspace — depots, branches, builds (v0.9.0)

cavs workspace init · depot add · branch add · build create
Model apps/depots/branches/builds as local metadata; build create indexes each depot's content for estimates. Depots carry platform / language / optional flags.
cavs branch promote / promote-preview / rollback
Atomic branch pointer changes with per-depot update cost previews; rollback only to builds the branch has served.
cavs depot analyze-sharing · cavs install-plan
Shared bytes across every depot pair, and per-player install/update simulation by platform, language and ownership with cross-depot chunk reuse.
cavs serve <workspace> --port 8990
Development-only content server: branches, builds, depot files (HTTP Range), chunks by hash, update previews. No auth by design; production stays on cavs-server.
cavs build sign / verify / encrypt / decrypt
Release authenticity (Ed25519 detached signatures, tamper ⇒ CAVS-E-SIGNATURE-INVALID) and optional local at-rest encryption (XChaCha20-Poly1305). Not DRM.

// store, verify & diagnostics

cavs store add / rm / gc / stat / verify / export
Manage the global content-addressable store: dedup index with refcounting and GC, loose or .cavspack packfile layout, and a deterministic CDN-ready object export.
cavs info <.cavs> · cavs verify <.cavs>
Inspect container metadata and verify integrity end to end.
cavs manifest …
Convert and benchmark manifest formats (JSON v1 ↔ compact binary CAVSMF2).
cavs doctor · cavs test corrupt · cavs test apply-recovery
Environment diagnostics, the ~20-case corruption matrix, and the interrupted-apply recovery suite.

// benchmarks

cavs bench gen --size 1GiB --out ds
Emit a deterministic dataset (same seed ⇒ identical bytes on any machine): a base build plus the update shapes that matter for chunked delivery.
cavs bench suite --dataset ds --out results
Pack and measure every version, writing summary.md and summary.json.
cavs bench full-pipeline · butler-full · routes
Measure every CAVS route and butler's complete pipeline (default diff and optimized rediff) on the same transition, with byte-level proxies. delta and compression cross-checks included.
cavs bench steampipe-cases --out results
The v0.9.0 pack-pathology suite: 12 deterministic layouts (localized, shifted, shuffled, distributed TOC, global vs per-asset compression, new packs, directory builds, Godot PCKs) measured under the SteamPipe-style model, real .cavsplans and external tools when installed.

Every subcommand has full --help. Without --raw, cavs pack treats inputs as video and segments them into CMAF/fMP4 via ffmpeg before packaging.

cavs-server · cavs-client

Serve and fetch.

// cavs-server

Stateful HTTP origin

Serves one or more .cavs releases over HTTP/HTTPS. Negotiates the compact manifest, tracks per-session cache have-sets with a Bloom filter, runs the route planner, and exposes a Range-resumable bootstrap endpoint.

$ cavs-server game_v1.cavs game_v2.cavs \
    --listen 127.0.0.1:8990
// cavs-client

Native streaming client

Reconstructs by streaming to disk with a persistent content-addressable cache — verify / repair / gc, a crash-safe resume journal, and retry with backoff. Peak RAM stays constant regardless of game size.

$ cavs-client fetch http://127.0.0.1:8990 game_v2 \
    -o out/game_v2.pck --cache ./cache \
    --stats-json stats.json
Core engine

A workspace of Rust crates.

The delivery engine is a Cargo workspace. Libraries compose the format, store and protocol; three of the crates ship as the command-line tools.

CrateKindRole
cavs-hashlibBLAKE3-256 chunk identity, Merkle root, signature message
cavs-chunkerlibFixed-size and FastCDC chunking
cavs-storelibDedup index + on-disk store (refcount + GC; loose or .cavspack packfiles with coalesced range reads)
cavs-formatlibThe .cavs binary format: writer, hardened reader, Ed25519 signing
cavs-protolibCVSP wire protocol: manifests, sessions, binary batches, Bloom have-set, CAVS-E-* error taxonomy
cavs-manifestlibManifest formats: compact binary v2 (CAVSMF2) + JSON v1 compatibility
cavs-clitool · cavsPackage / inspect / verify / reconstruct / store / doctor / bench
cavs-servertool · cavs-serverStateful HTTP/HTTPS origin (Range-resumable bootstrap)
cavs-clienttool · cavs-clientNative streaming client: cache verify/repair/gc, resume journal, backoff
$ cargo build --release      # binaries in target/release/
$ cargo test                 # unit + integration + end-to-end
Engine plugins — Godot · Unity · Unreal

CAVS delivery,
inside your engine.

Each plugin brings deduplicated, verified content delivery to its engine's native containers over the shared Rust core — the player downloads only the chunks that changed and the payload is reconstructed byte-identically (SHA-256 verified). Godot ships today as a pure-GDScript client; Unity and Unreal are on the way. Each has its own install & usage guide.

Full guides: Godot, Unity, Unreal. The Godot plugin is the reference client today.

Build & Update Analyzer new in 0.9

Measure and fix update behavior
before you publish.

v0.9.0 makes CAVS a SteamPipe-style local build-update lab. Estimate a build transition under a public fixed-1MiB chunk model, diagnose the pack layouts that bloat updates (scattered churn, asset shuffling, distributed-TOC/offset cascades, global compression, metadata churn), preview every delivery route before release, and price the local disk I/O per device — entirely locally, uploading nothing. Every estimate is SteamPipe-style: a model from public documentation, never Valve's implementation. There is deliberately no separate steam-analyzer product.

# the numbers — fixed-1MiB model estimate
$ cavs bench steampipe-style ./build_v1 ./build_v2 --out results/
# the diagnosis — findings with causes and fixes
$ cavs analyze steampipe ./build_v1 ./build_v2 --out analysis.md
$ cavs analyze-packs ./build_v1 ./build_v2
$ cavs analyze godot-pck old.pck new.pck   # names the res:// paths behind the churn
# the decision — every route measured, one recommended
$ cavs publish-preview ./build_v2 --previous ./build_v1 --routes all
$ cavs io-estimate ./build_v1 ./build_v2
Same 64 KiB edit, different pack layoutSteamPipe-style estimateCAVS .cavsplanDiagnosis
Localized edit, stable layout1.00 MiB (97% reuse)131 KiBOK
4 KiB inserted at the front (everything shifts)32.88 MiB (0% reuse)7.4 KiBasset_shuffling
Per-asset headers rewritten each build32.00 MiB (3% reuse)2.13 MiBtoc_churn
Same edit, TOC centralized (the fix)1.88 MiB (94% reuse)132 KiBOK

Deterministic 32-asset packs, reproducible with cavs bench steampipe-cases. Layout — not content — decides fixed-chunk update cost; the analyzer names the cause and the fix, and content-defined CAVS routes absorb the pathology either way. A ~3-byte edit in a 256 MiB pack still costs 512 MiB of local I/O unless the pack is split — cavs io-estimate flags exactly that.

// workspace

Depots & branches, locally

cavs workspace init · depot add · branch add · build create — SteamPipe-like apps/depots/branches/builds as local metadata, with atomic branch promote / rollback and per-depot promotion previews. No accounts, no platform.

// sharing & install plans

Content reuse, priced

depot analyze-sharing reports shared bytes across depots (measured: windows ↔ linux 98.9%); cavs install-plan simulates what a player downloads by platform, language and ownership — with cross-depot chunk reuse (a demo owner with the full game: 0 B).

// serve & sign

Dev server & authenticity

cavs serve exposes the workspace over local HTTP (branches, depot files with Range, chunks by hash, update previews) for plugin testing — dev-only by design. cavs build sign / verify / encrypt add release authenticity and optional at-rest encryption — not DRM.

Quickstart

Try it locally.

Run CAVS against two versions of your build and compare full download vs update payload.

1 — Install

$ cargo install cavs-cli
$ cargo install cavs-server
$ cargo install cavs-client

2 — Pack two versions

$ cavs pack --raw game_v1.pck \
    --profile auto --bootstrap -o game_v1.cavs
$ cavs pack --raw game_v2.pck \
    --profile auto --prev game_v1.cavs -o game_v2.cavs

3 — Serve

$ cavs-server game_v1.cavs game_v2.cavs \
    --listen 127.0.0.1:8990

4 — Fetch & check stats

$ cavs-client fetch http://127.0.0.1:8990 game_v2 \
    -o out/game_v2.pck --cache ./cache \
    --stats-json stats.json
# { "delivery_mode": "chunks",
#   "payload_bytes": 1719664,
#   "reconstructed_sha256_ok": true }

5 — Offline patch — no server (sign · preview · diff · apply · verify)

$ cavs signature export ./Build_v1 --raw -o build_v1.cavssig
$ cavs preview ./Build_v2 --against build_v1.cavssig --changes-only
$ cavs diff-plan ./Build_v1 ./Build_v2 -o update.cavsplan
$ cavs apply --old ./InstalledGame --plan update.cavsplan --inplace --verify
# apply : OK — 6 written, 38 unchanged (no-op), 2 deleted
# bytes : 20.58 MiB — 19.00 from the old install, 1.58 from the plan

6 — Certify before release (v1.0.0)

$ cavs certify --old ./Build_v1 --new ./Build_v2 --profile release --out ./certification
# Result: PASS — integrity, routes, regression, SteamPipe-style analysis
# byte-identical output · recommended route: .cavsplan (2.26 MiB vs 126.89 MiB full)
# exit codes: 0 pass · 1 fail · 2 warnings · 3 missing dep · 4 bad input · 5 internal

7 — Auto-route delivery (publish · policy · route-plan)

$ cavs publish-dir ./Build_v2 --previous ./Build_v1 --out-dir releases/
$ cavs patch-policy --versions v1,...,v10 --distribution shares.json
$ cavs route-plan --installed ./InstalledGame --new ./Build_v2 \
    --patch releases/v1_to_v2.cavspatch --profile low-memory
# cavspatch  7.67 MiB  ram 551.67 MiB  [excluded] over the 128 MiB budget
# chosen : cavsplan — 7.63 MiB over the wire, fits low-memory (40 MiB peak)