Fewer copies in memory.
Read uncompressed, unsealed files directly from a memory-mapped archive. Compressed or sealed files decode into a buffer.
Pack your game’s files into one archive. Load them by path, check their integrity and protect them with your own key—in the engine you already use.
mount → read(path)Optional archive sealingYour engine.
Your workflow.
01 / The archive layer
A single place to package, mount and read your assets, with control over updates and protection.
Read uncompressed, unsealed files directly from a memory-mapped archive. Compressed or sealed files decode into a buffer.
Mount archives in layers. A patch or mod overrides the same path in the base game without rebuilding the original archive.
Build chunk patches that contain only changed content. Your game or launcher delivers them; CyclePack handles the archive tools.
Use Lua 5.4 scripts for build steps or integrate through Rust and the C API. The library runs offline with no licence server.
Choose the right archive mode. Chunk patches save nothing on sealed archives, which are encrypted afresh on each pack. Archives written by Lua use an older format without per-file fingerprints or sealing.
02 / How it fits
Your engine sees files, not a pile of archives. CyclePack resolves each path to the highest-priority mounted layer.
Create a CPK3 archive with integrity fingerprints and optional sealing.
Keep the base game, DLC and patches in separate archives.
Ask for an asset. The highest-priority matching archive wins.
patch.cpkUpdated character meshdlc.cpkAdditional contentbase.cpkOriginal game assetsmeshes/hero.meshRead from patch.cpkExample mount order. Your game chooses the archives and their priorities.
03 / Integrity & protection
Verify each file against its recorded fingerprint. Seal the archive under your own key when its contents need protection.
A clean archive passes. Change one byte and the check names the file.
$ cyclepack verify --input game.cpk Verifying archive... Structural validation passed. Archive format: CPK3, Entries: 8 Content integrity: 8 of 8 entries verified against the digests in the archive. Verification passed: all 8 entries decoded and matched the digests CPK3 records
exit 0
$ cyclepack verify --input bad.cpk Verifying archive... Structural validation passed. Archive format: CPK3, Entries: 8 FAIL meshes/hero.mesh: E_DIGEST_MISMATCH: BLAKE3 digest mismatch Error: Verification failed: 1 of 8 entries do not match the digest the archive records for them (meshes/hero.mesh: E_DIGEST_MISMATCH: BLAKE3 digest mismatch)
exit 1
Without the key, nothing inside can be listed or checked. With it, every file is checked.
$ cyclepack verify --input sealed.cpk Verifying archive... Structural validation passed. Archive format: CPK3 (sealed manifest), Entries: not readable without the key Error: Verification failed: the manifest is sealed and no entry was checked. Nothing is known to be wrong with this archive; pass --key-file to verify it, or --structural-only to accept the header and length checks alone.
exit 1
$ cyclepack verify --input sealed.cpk --key-file key.bin Verifying archive... Sealed manifest authenticated (ChaCha20-Poly1305, generation 7). Structural validation passed. Archive format: CPK3, Entries: 8 Content integrity: 8 of 8 entries verified against the digests in the archive. Verification passed: all 8 entries decoded and matched the digests CPK3 records
exit 0
The doctor reports the capability backing on this Mac: what runs on real hardware here, and what runs on the CPU.
$ cyclepack doctor … Memory Mapping: [OK] POSIX mmap / MapViewOfFile (Lease-backed Zero-Copy) … └─ Linux io_uring: [--] Unavailable (io_uring is a Linux-native kernel interface; running on macos) [Capability Backing] [EM] DirectStorage Emulated CPU queue with the same semantics; DirectStorage is a Windows interface … [EM] BaM / io_uring Emulated pread/mmap with no ring; no io_uring ring could be set up here [EM] CXL shared memory Emulated process-local or file-backed shared memory, not a CXL fabric [EM] NVMe ZNS Emulated in-memory zone model; zoned block devices are a Linux interface … [EM] Computational storage Emulated host-CPU byte loop (XOR, not a cipher); no NVMe TP 4091/4092 device is used [EM] GPUDirect Storage Emulated host-memory bounce buffers; cuFile / GPUDirect Storage is not linked [EM] RDMA / RoCE v2 Emulated in-process transport; no verbs provider or RoCE v2 NIC is used … The doctor reports what these probes established; it opens no archive and moves no I/O.
exit 0
Recorded on 1 October 2026. Pasted as printed; a line reading “…” marks a cut.
Sealing is not DRM. A game that opens sealed archives ships the key. Anyone who extracts it can read the assets. Verify archives at installation: direct memory-mapped reads skip the per-read integrity check.
The Rust library uses Linux io_uring when the kernel permits it and falls back to ordinary reads. It has run on one Linux kernel in a container; the C API and engine plugins do not use this backend. CXL memory can map a Linux DAX device, but has not been tested on real CXL hardware.
DirectStorage, GPUDirect Storage, NVMe ZNS, RDMA and computational storage are CPU models labelled Emulated. GPU-memory requests are refused unless you explicitly allow an emulated path. No speed benchmark has been published for this release.
04 / Engine integrations
Beta plugins for Unreal, Unity and Godot. A C API for your own engine, with one header and one library.
// In YourProject.Build.cs
PublicDependencyModuleNames.AddRange(new string[] { "CyclePackRuntime" });
// In your Game Mode or startup module (UE 5.4+, IPlatformFile layer):
if (FCyclePackPlatformFile* Vfs = FCyclePackPlatformFile::Get())
{
Vfs->MountCpk(TEXT("World/"), TEXT("Content/Paks/WorldData.cpk"));
}
Current status: reads CyclePack archives through Unreal’s file layer and I/O dispatcher. It has not run inside Unreal yet; part of the code was compile-checked against stand-in headers. It does not read .pak or .utoc files.
// In Packages/manifest.json:
// "com.cyclechain.cyclepack": "file:../integrations/unity/com.cyclechain.cyclepack"
using CyclePack;
var vfs = new CyclePackRuntime();
vfs.Mount("assets/", Application.streamingAssetsPath + "/game_assets.cpk");
byte[] modelBytes = vfs.Read("assets/characters/hero.mesh");
Current status: mounts archives and reads files from C#. Tested outside the Editor with .NET 8 on macOS. Unity Editor and IL2CPP runs are still to come.
# Godot 4.3+ GDScript, through the GDExtension in integrations/godot/CyclePack
var vfs = CyclePackRuntime.new()
vfs.mount("assets/", "res://data.cpk") # res:// is globalized for you
var texture_data: PackedByteArray = vfs.read_file("assets/skybox.exr")
Current status: mounts archives and reads files from GDScript. Runs on Godot 4.7.2 in headless mode. Exported games have not been tested yet.
#include <cstdio>
#include <cyclepack.h>
int main() {
// A single-file CPK3 archive is its own index: the same path goes in twice.
CyclePackUnpacker* vfs = cyclepack_create_unpacker("game.cpk", "game.cpk");
if (!vfs) return 1;
// Borrows the mapped bytes: no copy, nothing to free. NULL for an absent,
// compressed or sealed entry; valid until cyclepack_destroy_unpacker.
uint32_t size = 0;
const uint8_t* bytes = cyclepack_get_data_ptr(vfs, "meshes/hero.mesh", &size);
if (bytes) {
std::printf("borrowed %u bytes of meshes/hero.mesh\n", size);
}
cyclepack_destroy_unpacker(vfs);
return 0;
}
borrowed 5000 bytes of meshes/hero.mesh
Checked: compiled with c++ -std=c++17 -Wall -Wextra against cyclepack.h and libcyclepack, no warnings, then run on game.cpk, the archive the integrity check above verifies. Borrowed bytes are valid until the unpacker is destroyed; compressed, sealed or absent entries return NULL.
Before you integrate: plugins currently mount unsealed archives. Keyed mounts are available through the C API. The library was tested on Apple silicon macOS and arm64 Linux in a container. Windows, Intel Macs and x86-64 Linux are not yet tested; console, iOS and Android builds are unavailable. Rust, Python and Node packages and a browser WebAssembly reader are also included. Web mode is a preview and is not DRM.
Explore the whitepaper05 / Licensing
Start free as an indie studio. Evaluate before buying as a larger team. Pro and Enterprise licences are per title.
$0
Unlimited titles
For studios with revenue plus funding under $200,000 over the last 12 months.
$2,500
Per title · One time
For titles with a production budget up to $2,000,000.
from $15,000
Per title · Studio agreements available
For production budgets over $2,000,000 and teams that need source access.
Archive format · Zero-copy reads · Integrity checks · AES-256-GCM / ChaCha20-Poly1305 sealing · Beta Unreal, Unity and Godot plugins · C API · Lua scripting · Layered mounts · Patching tools
| Licence & support | Indie | Pro | Enterprise |
|---|---|---|---|
| Titles | Unlimited | One licence per title | Per title or studio agreement |
| Runtime royalty | 0% | 0% | 0% |
| C++ drivers | Not included | Included | Included |
| Source code | Not included | Not included | Each licensed release; not repository history |
| Support | Community | 48 hours | 8 hours, priority |
| Evaluation | Not needed | 30 days above the Indie threshold; no commercial release | |
Pro renewal is optional: shipped titles keep working on the version they shipped with. Nothing in v0.10.0 checks a licence or locks a command, tool or feature.
06 / A few useful answers
What CyclePack does, where it fits and what this release supports.
A Rust SDK for packaging, protecting and loading game assets. Your engine mounts an archive like a folder and reads files by path. Use an engine plugin or integrate through the C API.
No. Only uncompressed, unsealed entries can be borrowed directly from the memory-mapped archive. Compressed and sealed entries decode into a buffer. Direct reads skip the per-read integrity check, so run cyclepack verify when installing an archive.
They need the key, but a game that opens its own archives ships that key. Anyone who extracts it can read the contents. Sealing protects against access without the key and unnoticed changes; it is not DRM.
Beta plugins target Unreal 5.4+, Unity 6 and Godot 4.3+. The C API supports custom engines. This release was tested on Apple silicon macOS and arm64 Linux in a container. Windows, Intel Macs and x86-64 Linux are untested. No console, iOS or Android build is available.
No. CyclePack builds and applies chunk patches; your game or launcher delivers them. Chunk patches save nothing on sealed archives because each pack encrypts them afresh.
The library opens no network connection, sends nothing home and uses no licence server. Every tier has a 0% runtime royalty. Indie is free under the $200,000 revenue-plus-funding threshold; Pro is $2,500 per title and Enterprise starts at $15,000.
Build with CyclePack
Tell us about your engine, platform and title. Start with an Indie licence or a 30-day evaluation.