Platform vs Engine SDK
The single most important concept in HELIX — what belongs to the engine-agnostic Platform API versus an engine-specific runtime.
Everything in the HELIX SDK falls into one of two buckets. Knowing which bucket you're in tells you where to find the docs, whether the code is portable, and what to expect on another runtime.
Platform API — engine-agnostic
The Platform API is the shared layer. It has nothing to do with rendering. It's the same behavior, the same guarantees, and the same function names on every runtime:
| Capability | Namespace | Docs |
|---|---|---|
| Authentication & identity | Helix.auth, Helix.profile | Authentication |
| LIX & economy | Helix.wallet, Helix.marketplace | LIX & economy |
| Durable storage | Helix.cloudSave | Cloud Save |
| Volatile storage | Helix.memoryStore | Memory Store |
| Items & inventory | Helix.inventory | Inventory |
| Social & presence | Helix.social | Social |
Write against the Platform API and your logic is portable: it behaves identically whether your world runs on the web or inside Unreal.
Engine-specific runtime
A runtime is where your world actually renders and executes. Runtimes add the things only an engine can provide — scene graph, input, physics, rendering — plus engine-flavored conveniences.
- Web SDK — TypeScript. This is the canonical contract. It also ships a full multiplayer & networking API (HELIX's own implementation) that is web-specific.
- Native (Unreal) SDK — the same Platform API exposed to C++, Blueprint, PuerTS (TypeScript) and UnLua (Lua), plus engine-specific helpers like replication wrappers. Native worlds use the engine's own networking rather than the web stack.
Web is the source of truth
The Web TypeScript SDK is frozen first and treated as the canonical API surface. The Native runtime mirrors it 1:1 — every function, including character and world functions. When the two ever differ, the web signature wins and the difference is documented in the feature matrix.
The same call, five ways
Because the Platform API is identical across runtimes, the same operation looks like idiomatic code in each language. Here's reading the current player's LIX balance:
const wallet = await Helix.wallet.getBalance();
console.log(`You have ${wallet.lix} LIX`);UHelixWallet* Wallet = UHelix::Get()->Wallet();
Wallet->GetBalance(FOnBalance::CreateLambda([](const FHelixBalance& B) {
UE_LOG(LogHelix, Display, TEXT("You have %lld LIX"), B.Lix);
}));Helix → Wallet → Get Balance (latent node)
↳ On Success → Break Helix Balance → "Lix" → Print String// PuerTS runs the same TypeScript API as the Web SDK, inside Unreal.
const wallet = await Helix.wallet.getBalance();
console.log(`You have ${wallet.lix} LIX`);local wallet = Helix.wallet.getBalance()
UE.Log(string.format("You have %d LIX", wallet.lix))This groupId is shared across the docs: pick PuerTS once and every runtime-tabbed example on
every page follows you.
How to use this distinction
- Reading about a concept (auth, LIX, storage)? You're in the Platform API. It applies to every runtime.
- Reading about rendering, input, networking, or engine conveniences? You're in a runtime section — Web SDK or Native SDK.