Guardian Avatars Changelog
Every release of the Guardian avatar SDK is archived immutably and can be pinned from portals.json with { "guardiansSdk": "x.y.z" }. This page lists what each version changed. Versions that are not listed were never released: the number was skipped, so pinning it fails the publish.
Names in backticks are exports or options of @portals/avatars; see the Guardian Avatars guide for how to use them. A version listed with two entries was cut on two parallel branches on the same day; the first version that contains both is called out below it.
0.46.13 — 2026-09-18
- First-person camera faced the wrong way: the eye was placed half a turn from the heading the movement code uses, so W walked backwards and A/D were swapped. The view now matches
getFlatForwardin both camera modes. Games that flipped the camera themselves after the SDK placed it should drop that workaround when pinning this version.
0.46.12 — 2026-09-04
- Finishing a ledge climb no longer snaps the body back to where the jump started when the final stand-point check fails. The character lands at the target, is pushed out of anything it grazes, and the normal collision loop takes over. Fixes the "teleported back to the jump" reports.
0.46.11 — 2026-09-03
- Ledge probing runs every Nth airborne frame instead of every frame, with the first airborne frame always probing, so a jump at a ledge still catches it. New controller option;
1restores per-frame probing. - Falling grabs only take ledges within 80° of the heading (was 150°), so the body no longer spins around after a grab. Rising grabs keep 55°.
- The stand point on top of the ledge is found before the climb plays, not after. Irregular tops aim the climb at a nearby spot that fits and refuse the grab when none does.
- The camera eases in behind the body over the climb instead of snapping, and only for moderate turns.
0.46.0 — 2026-08-29
- Ledge climbs are gated on a capsule sweep of the path the root will travel: up the wall and over the lip. New optional collision hook
sweepCapsule(from, to, radius, height);SceneCollidersupplies one, and without it the controller stepsdepenetratealong the path. A blocked path refuses the grab. - After landing, the stand point is verified again. A body that is not free there moves to the nearest standable spot on the ledge, or falls back from where it grabbed.
0.45.0 — 2026-08-29
- Touch controls gain a fullscreen toggle next to the camera toggle wherever the browser offers the Fullscreen API. iPhone Safari has no element fullscreen, so the button is absent there.
0.44.0 — 2026-08-28
- Ledge climb safety: the climb drives the root without collision, so the landing is now checked when the body is handed back. Depenetration fixes a landing that clips the ledge's back wall; a landing still inside the level is undone immediately by the stuck rescue instead of a second later.
- For one second after a climb the buried watchdog treats a walkable face overhead as proof of burial on its own.
- The buried check no longer misreads a swimmer, or a body under a single-sided slope with its head above the surface, as buried.
0.43.0 — 2026-08-26
- Rigid wearable attachments fixed. A mesh-bearing node authored under a bone such as
mixamorig:Headis followed as one logical part, even when the loader expands it into a multi-primitive group, and its authored local transform is preserved without attaching the wearable's duplicate armature.attachBoneandoffsetstill override it. - A flat GLB with no authored bone uses the natural bone for its declared slot. Body-sized or slotless items keep avatar-root coordinates instead of defaulting to the head.
0.42.0 — 2026-08-26
avatars.onAfterUpdate(cb)runs a callback after the animation mixer tick, so procedural posing, ragdoll blending and tooling can write bones without being overwritten. Returns an unsubscribe function.- The Pose Tuner dev tool ships alongside this release and depends on it.
0.41.0 — 2026-08-25
- No SDK code change. The hosted
three/addons/mapping gains the postprocessing set:EffectComposer,RenderPass,ShaderPass,MaskPass,Pass,UnrealBloomPass, plus theCopyShaderandLuminosityHighPassShadershaders. Games reaching for a bloom effect no longer 404 on publish.
0.40.0 — 2026-08-24
- Collision fixes for the character controller and NPCs.
- NPCs gain a
stepDownoption and a buried-floor recovery: an NPC dropped through a floor is put back on the floor it was standing on. The recovery uses theisUnderSurfaceprobe thatcollider.controllerOptions()already hands over. GroundProbetype exported fromSceneCollider.
0.39.0 — 2026-08-21
- Merge release. The first version that contains both branches of 0.36.0 and 0.37.0 below, together with 0.38.0. No other changes.
0.38.0 — 2026-08-18
HealthController: hit points, flinch reactions, a death take and respawn for one Guardian. Reactions play on the base animation layer so they travel withanimations.getCurrent()in multiplayer, and the body is locked for exactly as long as a reaction plays. Callwarm()when combat becomes likely.MeleeSweep: continuous melee hit detection. The weapon is a capsule measured off the equipped GLB, the target is capsules over the posed skeleton, and the blade path is swept every frame of the strike so fast swings cannot tunnel.readRootYaw()andwriteRootYaw()on the character controller.- Animation sync fix.
0.37.0 — 2026-08-17 and 2026-08-19
Two parallel branches. The first version with both is 0.39.0.
- Stuck rescue (2026-08-17). New collision hook
isUnderSurface(position, maxDistance?)and controller optionstuckRescue(defaulttrue): a character falling for over about 0.7 s with a walkable surface overhead is put back at its last grounded position. Landing also uses a per-frame continuous ray along the feet's true displacement, so a fast or diagonal fall cannot cross a floor without landing on it.depenetratepushes a body whose capsule centre crossed a floor straight back up. - Shouldered scope and shooting from the barrel (2026-08-19).
ScopeTuningfor the shouldered aim stance, andMuzzleWorldOptionsplusShotOriginParamsto read the shot origin from the weapon's barrel.
0.36.0 — 2026-08-17
Two parallel branches. The first version with both is 0.39.0.
- Ragdoll, weapon posing and shooter strafing.
RagdollOptionsandRagdollTuning;aimWeaponwith three stances (GunPoseName,LoadGunPosesOptions,AimBendTuning,CarryTuning,RecoilTuning,ShotKick); arm IK; shooter-grade strafing throughstrafeTuning(StrafeTuning,StrafeCollapse);WearableOffset. - Swimming collision fix and collision optimisation. New optional collision hook
depenetrateSegment.
0.35.0 — 2026-08-13
- Swimming collision fix. New optional collision hook
resolveMovement({ current, proposed, radius, airborne }).
0.34.0 — 2026-08-12
- Ground probing is capsule-shaped:
getGroundHeight(x, z, y?, radius?)receives the capsule radius andSceneColliderprobes the centre plus four rim rays, so a landing half on a ledge stands on it instead of falling through. - Avatar-vs-avatar collision. Controllers and NPCs created through
PortalsAvatarspush out of every other avatar's capsule automatically (XZ only, hidden avatars skipped). Opt out per character withcollideWithAvatars: false; hand-built setups wire the obstacle set withsetAvatarObstacles(). NPCs are solid by default. - Camera rig adjustments.
- The README describes these features as 0.32.0. That number was never released; the bump went from 0.30.0 straight to 0.34.0.
0.30.0 — 2026-08-11
- Camera rig fix.
ControllerOptions.cameraCollisionandcontroller.cameraRig.collision.enabledcontrol obstacle avoidance, on by default wherever araycasthook is wired. The boom shortens on contact and drops to first person when squeezed.
0.29.0 — 2026-08-11
- The
depenetrate(position, radius, height)hook is documented and run after the vertical step each frame: walls push horizontally, ceilings push down, floors stay the job ofgetGroundHeight. - Animation controller fix for camera avoidance.
0.28.0 — 2026-08-10
- Capsule collider. New optional collision hook
depenetratefor capsule overlap recovery, which the swept probes cannot do on their own;GuardianAvatarexposes its capsule dimensions.
0.27.0 — 2026-08-10
- Merge release. The first version that contains both 0.23.0 and 0.26.0. No other changes.
0.26.0 — 2026-08-10
- Camera obstacle avoidance (
CameraCollisionOptions) and camera rotation limits (CameraLimitOptions). - Swimming.
- Falling, stairs and step-downs.
- Touch control and catalog adjustments.
0.23.0 — 2026-08-09
- Current Portals player.
avatars.createAvatarFromPlayer(player)builds the avatar a signed-in player saved on/avatar;nullmeans guest. TypesPortalsPlayerProfile,PortalsPlayerAvatar,PortalsPlayerFullAvatar,PortalsPlayerAvatarWearableandPlayerAvatarLoadOptions.
0.22.0 — 2026-08-07
- Touch controls for mobile:
TouchControlswith a virtual joystick and action buttons, wired into the character controller.
0.21.0 — 2026-08-07
- NPCs:
NPCControllerfor code-driven avatars. - Loading performance: asset fetching moves to a worker.
- Eye material and wearable loading adjustments.
0.20.0 — 2026-08-05
- Run styles.
RunStyleandHiddenRunStyleswap the jog band of the locomotion set. - Catalog expansion.
0.13.1 — 2026-08-04
- Melee: a single click strikes with alternating side slashes; holding the press for
controller.meleeHoldTimeseconds (0.3) launches the authored combo.useItemCombo()triggers the combo directly. - Remaining references to the Invector controller the port was based on were removed.
0.10.0 — 2026-08-04
- New animation clip set and the
ANIMATION_SETSopt-in behaviour groups. - Throwing an item away and picking it up again (
ReleasedWearable). - Strafing (
StrafeMode). - Movement speed and stride controls.
0.9.0 — 2026-08-03
- Overlay clips accept
sync: trueto take their phase from the base locomotion clip, so a carry clip with an arm swing stays in step with the run. - Throwing tested and fixed.
0.8.0 — 2026-08-01
- Avatar switching fix:
adoptFromcarries controller state over when the avatar is swapped. boneAdjust: corrective Euler rotations applied to named bones' keyframes when a clip is registered.- Hand-item overlays are declared up front through
DEFAULT_HAND_ANIMATIONS, so the carry pose is found the moment something lands in the right hand.
0.5.0 — 2026-08-01
portalsItemIdon wearable definitions: equip a catalog item by its inventory id. Hand grab.
0.4.1 — 2026-08-01
- Ledge grab:
probeLedge,LedgeGrab,LedgeProbeParams. SceneColliderreplaces the earlier box collider world.getGroundHeightcollision hook.
0.2.0 — 2026-08-01
- Avatar setup pipeline,
preloadAnimations, face animation controller, andTHREEre-exported from the SDK so a game has one Three.js instance.
0.1.0 — 2026-07-31
- Initial release: body types, skin, hair and eye colours, hair styles, the wearables system with the never-naked basic set, retargeted locomotion clips, hand items, facial animation, and the first and third-person character controller with camera rig.
