BodyLink Developer Docs
BodyLink brings full-body and hand tracking to XR. As a game developer, you build a small web game, package it as a self-contained Runtime v1 iframe bundle, and ship it to the BodyLink catalog — where it runs inside any BodyLink host with live body-pose input streamed to your game.
Your game receives tracking frames (hand/body pose) over a sandboxed iframe bridge and sends back gesture and gameplay events. You never touch the host runtime or the tracking pipeline directly — you target one small, stable SDK surface, and the platform does the rest.
This site is the public front door for building on BodyLink:
- Developer Guide — the end-to-end story: build a valid bundle, run the validation gate locally, and submit through the developer portal.
- Validation Reference — the named-check codes the submission gate emits, what each means, and the recommended fix. Consult this when a submission is rejected.
What you ship
A shipped BodyLink game is a Runtime v1 iframe bundle: an offline,
opaque-origin iframe rooted at games/<slug>/, containing:
index.html— the entry point (anentry.kind: "iframe"entry).bodylink.game.json— the game manifest (id, version, entry, capabilities, thelauncherdisplay/tracking block, the iframe-session security policy).bodylink.bundle.lock.json— an integrity lock that SRI-pins the runtime SDK.- Your built game assets, all bundle-relative.
Bundles are immutable per <slug>@<version> — a new release is a new
version under the same slug. You do not hand-assemble a bundle: the SDK
toolchain scaffolds, builds, and exports it for you.
Quickstart
The path from nothing to a live game is: scaffold → build → validate → submit.
1. Scaffold
Start from the canonical game template (Node 20+ required). The scaffolder creates a standalone game project wired against the BodyLink SDK:
npx create-bodylink-game ring-rally
cd ring-rally
npm install
npm run dev # standalone dev server; open the in-game developer tour
Your game imports only the SDK surface (game-kit and iframe-sdk). Most games
use the high-level createBodyLinkGame(...) entry point; a lower-level client is
available when you need direct control of the bridge.
2. Build the bundle
When your game is ready, export it. The export step builds your game and emits a downloadable, self-contained bundle — every module specifier resolved and inlined, the runtime SDK SRI-pinned:
npm run export:zip # build -> SDK-only bundle -> <id>@<ver>.zip
This is the single most important habit: a real bundle is built output, not raw source. Opaque-origin iframes cannot fetch modules at runtime, so unbuilt source (bare imports, dev-server paths) is always rejected.
3. Validate locally
Run the exact same gate the developer portal runs, before you ever upload:
node scripts/validate-submission.mjs <bundle-dir> --report
The gate is fail-closed: it rejects by default and only passes a bundle that satisfies every static check. Each failure names the failing check and a one-line recommended fix — the same report the portal shows you. See the Validation Reference for every code.
4. Submit
Upload your <slug>@<ver>.zip through the BodyLink developer portal. The
portal re-runs the full validation gate, and — on a passing bundle — routes it to
a BodyLink reviewer. On approval, your game is published to the live catalog and
appears in consuming host pages within about a minute.
You do not get direct write access to the catalog. Every game reaches production through the portal's register → upload → validate → review → publish pipeline.
Ready to build? Start with the Developer Guide.