Install and update PAK / IoStore content by downloading only the chunks that changed between builds — straight from a static CDN export, with no game server. A C++ UCavsClient (over the shared Rust core via a stable C ABI) plans the missing set locally, downloads it over concurrent HTTP Range requests, verifies every chunk (BLAKE3) and reconstructs your files byte-identically. Blueprint-friendly with progress, completion and cancellation delegates.
Beta, currently untested. The module compiles against the CAVS C ABI and mirrors the shipping SDK bindings, but it has not yet been built with UnrealBuildTool or run in-editor. It ships with the native libraries bundled so you can try it — feedback and fixes are welcome.
A Blueprint-exposed UObject over libcavs_sdk. FetchStatic runs on a background thread; progress / completion / failure fire on the game thread as delegates.
Publish once with cavs store export --static-plans; host the tree on S3 / R2 / Pages / nginx. The client updates straight from it.
Every chunk BLAKE3-verified, every file reconstructed byte-identically (a torn file is never promoted) — the same guarantee as the Godot client.
The download bundles the native libcavs_sdk for Win64, Mac and Linux under the plugin's ThirdParty folder.
1 — copy the plugin2 — regenerate + build3 — enable itYou need the CAVS command-line tools once, to package and export builds. Build them from the repository root with cargo build --release.
Avoid IoStore offset-cascade update bloat: diagnose with cavs analyze steampipe and cavs analyze-packs before you ship.
The first launch installs the whole build; later launches download only the chunks that changed, reusing the persistent cache. Bind the delegates and call FetchStatic.
UCavsClient* Client = NewObject<UCavsClient>(); Client->OnProgress.AddDynamic(this, &AMyActor::HandleProgress); Client->OnCompleted.AddDynamic(this, &AMyActor::HandleCompleted); Client->OnFailed.AddDynamic(this, &AMyActor::HandleFailed); FCavsFetchStaticRequest Req; Req.Base = TEXT("https://cdn.example.com/game"); // a store export --static-plans tree Req.Asset = TEXT("game"); Req.OutputDir = FPaths::Combine(FPaths::ProjectPersistentDownloadDir(), TEXT("cavs/install")); Req.CacheDir = FPaths::Combine(FPaths::ProjectPersistentDownloadDir(), TEXT("cavs/cache")); Req.Connections = 8; Client->FetchStatic(Req);
Retries are safe by design: verified chunks stay in the content-addressable cache, so a retried fetch — even after the app was killed mid-download — only fetches what is missing.
| Member | Description |
|---|---|
| FetchStatic(FCavsFetchStaticRequest) | Start a serverless install/update on a background thread |
| Cancel() | Request cooperative cancellation of an in-flight fetch |
| OnProgress(Percentage, Phase) | Multicast delegate, fired on the game thread |
| OnCompleted(FCavsFetchResult) | ChunksFetched, ChunksReused, WireBytes, LogicalBytes, SavedPercent |
| OnFailed(Code, Message) | Stable CAVS-E-* code plus a message |
| Version() | The native SDK version |