Engine plugins · Unreal beta · untested

CAVS for Unreal Engine.

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.

Client

UCavsClient

A Blueprint-exposed UObject over libcavs_sdk. FetchStatic runs on a background thread; progress / completion / failure fire on the game thread as delegates.

No server

static CDN export

Publish once with cavs store export --static-plans; host the tree on S3 / R2 / Pages / nginx. The client updates straight from it.

Verified

byte-identical

Every chunk BLAKE3-verified, every file reconstructed byte-identically (a torn file is never promoted) — the same guarantee as the Godot client.

Install

Drop the plugin
into your project.

The download bundles the native libcavs_sdk for Win64, Mac and Linux under the plugin's ThirdParty folder.

1 — copy the plugin
Unzip and copy CavsSdk/ into your project's Plugins/ folder (so you get Plugins/CavsSdk/CavsSdk.uplugin).
2 — regenerate + build
Regenerate project files and build. The native libraries are already staged under Source/ThirdParty/CavsSdkLibrary/lib/<Platform>/.
3 — enable it
Turn on CAVS Content Delivery in the editor's Plugins panel, then use UCavsClient from C++ or Blueprint.
Publish a release

Export a static tree,
upload it anywhere.

You need the CAVS command-line tools once, to package and export builds. Build them from the repository root with cargo build --release.

bash — publish copy
# package the cooked PAK / IoStore output
$ cavs pack-dir ./Cooked --profile auto -o build.cavs
# ingest into a packfile store and export a static tree
$ cavs store ./store add game build.cavs --storage packfiles
$ cavs store ./store export --out ./dist --static-plans
# upload to any static host — no cavs-server runs in production
$ aws s3 sync ./dist s3://your-bucket/

Avoid IoStore offset-cascade update bloat: diagnose with cavs analyze steampipe and cavs analyze-packs before you ship.

Runtime usage

Self-update
from your game.

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.

UCavsClient API

One object,
three delegates.

MemberDescription
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