Axiom/SDK
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.

Conventions that hold everywhere

Convention
Rule
Handedness
Right-handed, +Y up. Packs convert; conformance checks it.
Angles
Radians, always
Distance
Metres
Matrices
Column-major
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
Marker
Meaning
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.