Genies Web SDK v0.1.96
Updated: August 31, 2026
This is a large release that reshapes the SDK's public surface. It introduces a managed rendering path — where the SDK owns render models, pose updates, and frame submission for you — and consolidates the API around named exports. Read the breaking changes below before upgrading.
Breaking changes
update() no longer takes a renderer, and a number of low-level hooks moved under advanced. See What's Changed.
What's New
- Managed rendering. A new rendering path where native code owns the render models, pose updates, scene state, visibility, render plans, resource lifecycle, and renderer metrics — so you no longer have to drive them yourself. Custom renderers are still fully supported: pass
managedRenderFrontend: falseand useadvanced.rendering. - Unified avatar loading, and standalone wearables. Avatar definitions and CAMP IDs now work interchangeably across
loadAvatar(),loadAvatarProgressive(), andpreloadAssets(). CAMP (Content and Asset Management Platform) is the collection of Genies backend services and infrastructure. NewloadWearable()andNafWearableHandlelet you load and mutate a wearable on its own, without a full avatar. - Runtime behavior and animation tooling.
- Read and edit behavior at runtime. Behavior is the smart-avatar configuration that decides which idle, gesture, and talking clips play and when. You can now read the exact configuration currently applied — not just set it — and reapply edited values without discarding already-loaded animation assets.
- Rig-recipe tooling. A rig recipe is the setup for the avatar's skeleton: how the rig is assembled and corrected, which joints drive which, and how IK is wired. It can now be read and replaced at runtime.
- Body motion and full-body IK (FBIK) controls. Body motion is procedural idle movement — the small continuous adjustments (weight shifting, posture, fidgets, gaze) that keep a standing avatar from looking frozen. It is now configurable, with diagnostics for inspecting what the solver is doing.
- Behavior graph tooling. The live animation graph behind a behavior can be exported and have its scalar parameters tweaked. This is aimed at editor and debugging tools rather than typical app integration.
- Per-avatar composition diagnostics for inspecting how an avatar was assembled.
- Layered Mega Stylizer presets. A Mega Stylizer preset is a JSON document describing an avatar's authored visual look — toon shading, outline, and surface settings such as transparency. Presets can now be stacked in order via
mergeMegaStylizerPresets()andapplyShaderPresetLayers(), so you can keep an avatar's authored look as the base and layer a wearable's overrides on top. Includes per-mesh and per-material merging, plus read-back of the source preset. - Streaming, services, and voice. Added native SSE sessions, per-service endpoint and token configuration, typed voice configuration, and renderer capability / effective-state APIs.
What's Changed
initialize()is now the single startup boundary for WebGL, the managed render host, environment, authentication, and service overrides.update(deltaTime)no longer accepts a renderer. Managed WebGL state reset and frame submission now happen internally — drop the second argument.- Named exports are the supported way to use the SDK. Import what you need directly —
import { loadAvatar } from '@geniesinc/genies-naf-webgl'. TheNafInstanceobject returned byinitialize()is a convenience facade carrying only the most common APIs, so don't expect the full surface on it. Relatedly, build metadata is now read from theBUILD_CONFIGexport instead of the SDK setting a global variable as a side effect. - Low-level hooks moved under
advanced— renderer, pose, filesystem, profiling, material compatibility, configuration, and debug. - Removed deprecated top-level aliases, global shader helpers, duplicate animation constructors, mutable voice constants, and public shader lifecycle methods.
setEmotion(clip, timeMin, timeMax)now samples both emotion intensities from a single authored clip.
What's Fixed
- Cached progressive loads now report the actual starting LOD, skip obsolete lower-quality events, and update retained render data without resetting the animation.
- Equip, unequip, edits, and LOD changes now swap render state all-or-nothing: the new state either takes effect completely or the previous one stays, so a partially-updated avatar (for example a new mesh still showing old textures) is never displayed. The superseded GPU resources are released only after the swap succeeds.
- Malformed skeleton roots are now aligned to their bind pose — the rest pose each bone was authored in, stored as the mesh's inverse bind matrices. Corrections are reported by
getSkeletonRootCorrectionReport().