SDK / Overview
SDK reference
Every call in the surface, grouped by what it is for. Generated from the IDL, so the bindings, the header and this page always agree.
Everything on these pages is generated from the IDL. One definition produces host dispatch, the WASM import table, the C ABI header, every language binding, and this reference, so they cannot drift.
The surface
Two kinds of thing. Questions are about a game and are answered by a pack. Primitives are about a process and come from the backend for free. A mod calls both the same way and cannot tell which is which.
Entities
Enumerating the world, holding handles safely across frames, reading and writing transforms.
entitiestransformcomponents13 calls4 bulk
Frame and camera
Per-frame callbacks, the camera, world-to-screen projection, line of sight, the surface.
framecameraprojectworldsurface16 calls
Overlay and canvas
The retained widget tree for panels, and the draw list for mods that want their own pixels.
overlaycanvas22 calls
Types and assets
Named access to the game's own structs and enums, asset replacement, input and keybinds.
typesassetsinput17 calls
Memory, symbols, hooks
The low-level primitives. Packs live here; most mods never touch them.
processmemorysymbolshooks19 calls2 bulk
Mod and Framework
The lifecycle you implement, the handle you are given, and the result type everything returns.
ModFrameworkResultconfig
Conventions that hold everywhere
Handedness
Right-handed, +Y up. Packs convert; conformance checks it.
Screen space
Top-left origin, pixels, DPI-scaled
Strings
UTF-8, length-prefixed across the boundary
Handles
EntityId is (index, generation), safe to hold across frames
Everything fallible
Returns Result. Nothing throws across the boundary.
Reading a signature
bulk fn transforms(ids: [EntityId]) -> [Result<Transform>]
^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^
one crossing name params per-item results
bulk fn
Takes and returns arrays; one boundary crossing whatever the length. Always prefer it in a loop.
Result<T>
Succeeds with T, or carries Denied or Failed
@1
Major version of that question or primitive. Two majors can coexist in one session.
A slash in a name
Came from one pack, so it only exists on that game
The one performance rule
Anything called in a loop should be its bulk form. At 144 Hz you have 6.9 ms; a crossing is 1 to 3 µs, so 400 scalar calls is most of the budget and 1 bulk call is nothing.