Skip to content

WASM CCK Changelog

TL;DR: This page tracks every CVR Preview.N-WASM.M CCK build released on the closed-testing branch. Each entry shows the developer-posted changelog and the Steam build ID when available. Steam branch keys are redacted; branch names and build IDs are preserved. Entries tagged [verified] or [unposted] are observations from cross-checking the package contents against the developers’ chat posts.

VersionBuild IDHeadline
Preview.11.WASM.1First drop. Wasm module auto-downloaded + method-call into WASM via [ExternallyVisible].
Preview.11-WASM.2Local testing + Play Mode testing fix, menu item to create WasmBehaviour.
Preview.11-WASM.3Interactable ↔ WASM method calls actually work.
Preview.11-WASM.420022802Brought in develop changes, fixed WasmScriptingBridge initialization.
Preview.11-WASM.520023329OnBecameVisible/Invisible events hooked, LocalPlayer GetPosition/GetRotation.
Preview.11-WASM.6Fixed world builds corrupting lightmap data. Added project descriptor, possible Linux support.
Preview.12-WASM.8CCKWasmProjectDescriptor component ships. Verbose Wasm build toggle.
Preview.12-WASM.9Regenerated binder links.
Preview.12-WASM.10(NAK 20249206)LocalPlayer Get/Set properties; source generator fixes.
Preview.12-WASM.12Portal events, bound CustomRenderTexture / Texture2DArray / Texture3D. Reflection-free WasmBehaviour init.
Preview.12-WASM.1320599241Fixed serialization of List<Object> and List<WasmBehaviour>.
Preview.12-WASM.1420599241Permissions system introduced. Binding exceptions forwarded into VM. Struct serialization.
Preview.12-WASM.15Editor attributes omitted from WASM module unless UNITY_EDITOR_ATTRIBUTES define is set.
Preview.13-WASM.1620913710WasmBehaviour with Instantiate/AddComponent/GetComponent. CVR Input API. FileStorage dir creation.
Preview.13-WASM.1720940079Fix VR inputs + FileStorage nullptr file.
Preview.13-WASM.1821097861GraphicsBuffer, GeometryUtility, CVRCamera bindings. Content-context scripting defines.
Preview.13-WASM.18.1Newtonsoft.Json assembly conflict fix.
Preview.16-WASM.18.1Fix uploading in Unity 2022 versions.
Preview.16-WASM.19Unity.Mathematics added. Multi-partial serializable types. Reflection-free behaviour.
Preview.16-WASM.20Inheritance chains to WasmBehaviour + Object.Instantiate reflection-free fixes.
Preview.16-WASM.20.1Game events fix.
Preview.16-WASM.20.2All WasmBehaviour events fix.
Preview.16-WASM.21Serialization rework + test framework. UnityEvent serialization on WasmBehaviours.
Preview.22-WASM.2222346714WorldPermissions API. User-Identity gate on Username/UserId. Handle manager rework. Fuel → epoch interruption.
Preview.27-WASM.2322724834Prop collision exclude-layer APIs.
Preview.27-WASM.2422727107WasmUtils API (context queries). Unity-side binding exception logging.
Preview.27-WASM.2522791065LocalPlayer IgnoreCollision, SetHeadHiddenCamera, Respawn. WorldSettings API. Removed dead FileStorage permission stubs.
Preview.27-WASM.2622792582LocalPlayer SetPositionAndRotation, SignalDiscontinuity. Networking server-time methods.
Preview.27-WASM.2722810120Breaking: CVR APIs properties → Get*() methods. CVR.Avatar bindings live. Username freed from User-Identity gate.

All Preview.27-WASM.2x builds shipped on the feature_wasm Steam branch. Earlier builds preceded the consolidation to this branch.

First public-testing drop.

Dev post:

  • Added CVRDataStore component (not bound to anything; modder-only).
  • TimeSinceAFK added to CVRParameterStream.
  • DisplayGroupDetailPage added to CVRInteractable.
  • Pano preview in build panel.
  • Portal capture reworked for new depth portal panoramics.
  • VRAM usage validation skipped for Worlds.
  • Fixed CVRInteractable conflicting network-id autofix.
  • Upload procedure tweaks (per-file server-side status, new upload endpoint supporting variable updates / partial uploads).
  • Refactored test mode so content is processed before lifetime events.
  • Fixed LTCGI adapter error with latest LTCGI.

WASM:

  • Fixed testing in Play Mode.
  • CVRInteractable can method-call into WASM: invoke TriggerScriptEvent on your WasmBehaviour with the method name; methods must carry [ExternallyVisible].
  • WASM module now auto-downloaded and extracted into %APPDATA% (%LOCALAPPDATA%/ChilloutVR/CVRBuildTools/ in later versions).

[verified] Ships with Wasmtime 22.0.0 (Packages/Wasmtime.22.0.0/). Native libs for Windows, Linux, macOS-x64, macOS-arm64.

Dev post:

  • Fixed not being able to local-test or Play-Mode-test Worlds due to original scenes being unloaded.
  • WASM: MenuItem to create WasmBehaviour from basic template.

Dev post:

  • WASM: updated module so using Interactable actually works.

Branch: WASM · Build ID: 20022802.

Dev post:

  • Delay EnvConfig to prevent a crash when switching build target during editor startup.
  • WASM: Potentially fixed world builds not initializing WASM correctly (local testing + normal uploads).

[verified] Brought WasmScriptingBridge initialization back online (referenced by later events code).

Branch: WASM · Build ID: 20023329.

Dev post:

  • OnBecameVisible and OnBecameInvisible hooked up.
  • LocalPlayer.GetPosition() and GetRotation() added.

Dev post:

  • Fixed world builds corrupting lightmapping data of the target scene.
  • WASM: Added project descriptor component. Possible Linux support (untested).

Skipping 7 (never shipped publicly per the archive).

Dev post:

  • WASM: Fixed CCKWasmProjectDescriptor — add to content root for debugging toggle, forced script inclusion, project-defines, external project directory override.
  • More Linux support fixes.
  • “Verbose Wasm Build” option added.

Dev post:

  • WASM: Regenerated links with fixed WasmBinder. Updated module version.

Branch: NAK (temporary) · Build ID: 20249206.

Dev post:

  • LocalPlayer.Get/SetVelocity added.
  • LocalPlayer.Get/Set properties (position, rotation, velocity).
  • Serializer source-generator fixes:
    • Namespaced WasmBehaviours now work.
    • Instance auto-properties no longer confuse the serializer.
    • Fixed AssetBundle build failure caused by “unserializable types” in the generated shadow class.

[context] This temporarily shipped on a NAK branch because the WASM branch build config had regressed.

Skipping 11.

Dev post:

  • OnPortalCreated(Portal portal) and OnPortalDestroyed(Portal portal) events.
  • Bound CustomRenderTexture, Texture2DArray, Texture3D.
  • Reworked WasmBehaviour initialization, deserialization, and method calling — no longer requires reflection on the module side.
  • Added Enable Reflection toggle on the project descriptor for escape hatch.

Branch: WASM · Build ID: 20599241.

Dev post:

  • Fixed serialization of List<Object> and List<WasmBehaviour>.

Branch: WASM · Build ID: 20599241 (reused).

Dev post:

  • Permissions system introduced. Some existing behaviour broke intentionally (e.g. Instantiate on props/avatars); most was unintentional because default permissions weren’t appropriate for every binding yet.
  • Exceptions thrown from bindings no longer kill the VM — they’re forwarded into the guest and thrown there.
  • Struct serialization added (was overlooked).
  • Fixed [SerializeField] attribute not working properly.

Dev post:

  • Fixed serialization of sbyte failing.
  • Unity Editor-only attributes (ColorUsage, HideInInspector, Property, Space, Tooltip, Header) are no longer included in the built WASM module — gated behind UNITY_EDITOR_ATTRIBUTES define for opt-in.

Branch: WASM · Build ID: 20913710.

Dev post:

  • WasmBehaviour handling with Instantiate, AddComponent, GetComponent.
  • Fixed GetComponent not returning an object whose actual type matched the retrieved component.
  • CVRInput API added. WASM has its own input module; world and self-avatar scripts can set inputs.
  • Fixed FileStorage not creating its working directories.

Branch: WASM · Build ID: 20940079.

Dev post:

  • Fixed VR inputs not working with the WASM input module.
  • Fixed FileStorage returning a file with a null pointer.

Branch: WASM · Build ID: 21097861.

Dev post:

  • Fixed GraphicsBuffer bindings (needed for compute shaders).
  • Added GeometryUtility bindings.
  • Added CVRCamera bindings.
  • Added defines for running Avatar / Prop / World contexts (CVR_SCRIPTING_CONTEXT_{AVATAR,PROP,WORLD}).

Dev post:

  • Fixed Newtonsoft.Json assembly bundled in CCK conflicting with other Newtonsoft.Json assemblies.

Dev post:

  • Fixed uploading in Unity 2022 versions.

Dev post:

  • Unity.Mathematics added to the WASM module.
  • Fixed serializable types with multiple partial definitions breaking the module.
  • Fixed the “reflection must be enabled” requirement for several runtime paths.

Dev post:

  • Fixed behaviours that don’t directly inherit WasmBehaviour not working.
  • Fixed Object.Instantiate not having the no-reflection fixes.

Dev post:

  • Fixed game events not working.

Dev post:

  • Fixed all WasmBehaviour events not working.

Dev post:

  • Reworked serialization. Test framework in place to catch regressions.
  • UnityEvent serialization on WasmBehaviours — usable only inside your own code, intended for drag-and-drop prefabs that non-WASM users can hook up.
  • Fixed GetComponent methods without the no-reflection fix.

Branch: WASM · Build ID: 22346714.

Dev post:

  • Added ISerializableCallbackReceiver (OnBeforeSerialize / OnAfterDeserialize) events.
  • WorldPermissions API added. Query current permissions, request changes once per session.
  • OnWorldPermissionsChanged WasmBehaviour event.
  • UserId and Username gated behind User Identity permission.
  • File Storage gated behind File Storage / Read Raw Files / File Storage Limit permissions.
  • World file-storage path moved to AppData\Local\ChilloutVR\WorldData\[guid]\LocalStorage.
  • Network players now handled by DarkRift client ID instead of player GUID hash.
  • World Permissions UI added (World Details menu → Permissions). Worlds can prompt once per session via WorldPermissions.RequestPermissions(...).
  • Handle management for WASM access manager rebuilt.
  • VM limiting switched from Wasmtime fuel → epoch interruption (better performance).
  • Serialization refactor to simplify implementation and remove magic numbers.

Branch: feature_wasm · Build ID: 22724834.

Dev post:

  • Three new Prop APIs exposed (for World use):
    • SetCollisionExcludeLayers(LayerMask mask)
    • GetCollisionExcludeLayers()
    • ResetCollisionExcludeLayers()
    • (Also built for Avatars, but not yet bound properly.)

Branch: feature_wasm · Build ID: 22727107.

Dev post:

  • WasmUtils API:
    • CVRScriptObjectContext GetObjectContext()
    • CVRScriptScopeContext GetScopeContext(UnityEngine.Object unityObject)
    • CVRScriptOwnerContext GetOwnerContext()
  • Unity-side logging when an exception is thrown in a bound binding — reports the binding class so you don’t need to wrap every guest call in try/catch.

Branch: feature_wasm · Build ID: 22791065.

Dev post:

  • Added to LocalPlayer (World-only):
    • IgnoreCollision(Collider collider, bool ignore) — wraps Physics.IgnoreCollision against all player colliders.
    • SetHeadHiddenCamera(Camera camera, bool hideHead) — the head-hiding system will hide the local player’s head when the passed camera’s OnPreCull fires.
    • Respawn().
  • New WorldSettings API (World-only): SetPropVisibility(bool), SetPlayerVisibility(bool) (same effect as CVRWorld.SetPlayerPropVisibility and SetPlayerRemotePlayerVisibility).
  • Removed dead CanUseFileStorage and RequestUseFileStorage stubs from FileStorage.

[verified] The current CCK shim (CVR.CCK.Wasm/Scripting/Links/APIs/CCKStubs/FileStorageCCK.cs) carries no CanUseFileStorage / RequestUseFileStorage helpers. Call WorldPermissions.Request(new WorldPermissions { FileStorageApiAllowed = true, ... }) and gate on WorldPermissions.CurrentPermissions.FileStorageApiAllowed in OnWorldPermissionsChanged.

Branch: feature_wasm · Build ID: 22792582.

Dev post:

  • Added to LocalPlayer (World-only):
    • SetPositionAndRotation(Vector3 position, Quaternion rotation, bool updateGround = false) — more efficient and predictable than back-to-back SetPosition/SetRotation. Set updateGround = true to recalculate ground/platform attachment.
    • SignalDiscontinuity() — call after moving the player. Dynamics on the avatar and remote-player interpolation skip the in-between movement, producing a seamless “snap” for local and remote viewers.
  • Added to Networking:
    • long GetServerStartTime() — Unix timestamp (ms) when the server started.
    • long GetServerUptime() — server uptime (ms).

Branch: feature_wasm · Build ID: 22810120.

“This build contains a bunch of breaking changes to existing APIs. As mentioned before, because we are still in the initial design & development phase, these sort of changes will occur quite often and usually require a recompile and touchup when APIs change.”

Breaking — properties → Get*() methods. Reason stated by the team: make marshalling cost obvious; the convention applies to CVR-provided APIs only, not UnityEngine/library ones. A further refactor is under discussion: postfixing all CVR APIs with Api (e.g. PlayerApi, AvatarApi, PropApi, PortalApi, CloneApi) to avoid naming conflicts with UnityEngine.Avatar and the CVRAvatar component.

Prop refactor:

OldNew
Spawner propertyGetSpawner()
RootObject propertyGetRootObject()
RootTransform propertyGetRootTransform()
Name propertyGetName()
ContentId propertyGetContentId()

Player refactor:

OldNew
UserIdGetUserId()
UsernameGetUsername()
NetworkIdGetNetworkId()
GameObjectGetGameObject()
VoicePointGetVoicePoint()
ViewPointGetViewPoint()

Avatar refactor:

OldNew
WearerGetWearer()
RootObjectGetRootObject()
RootTransformGetRootTransform()
NameGetName()
ContentIdGetContentId()

Also added on Avatar: SetCollisionExcludeLayers(LayerMask), GetCollisionExcludeLayers(), ResetCollisionExcludeLayers().

Other changes:

  • CVR.Avatar API and bindings now hooked up. Example: Avatar localAvatar = LocalPlayer.PlayerObject.GetWornAvatar();.
  • Fixed lifetime checks not functioning properly since the access-manager handle rework.
  • Removed Username from User Identity world-permission gateGetUsername() no longer requires AccessUserIdentity. GetUserId() still does.
  • Fixed Avatar / Prop / Player bindings not being wrapped in exception interop.
  • Tweaked error logging on binding exceptions to report the binding class.

Diffing CCK_4.0.0_Preview.11.WASM.unitypackage vs CCK_4.0.0_Preview.27-WASM.27.unitypackage surfaces reorganizations the per-build posts didn’t call out:

  • Wasmtime upgraded 22.0.0 → 34.0.2 at some point between Preview.12 and Preview.27. Along with the upgrade, only win-x64 and android-aarch64 native libraries remain in the package — the linux-x64, osx-x64, and osx-arm64 libraries present in Preview.11 were dropped.
  • Editor scripts relocated: Assets/CVR.CCK.Wasm/Editor/Assets/CVR.CCK.Wasm/CCK/Editor/. CCKWasmProjectDescriptor.cs moved from top of the Editor folder to CCK/CCKWasmProjectDescriptor.cs (runtime type) with its editor now a separate file.
  • Bindings subfolder introduced: Assets/.../Scripting/Links/APIs/*Bindings.csAssets/.../Scripting/Links/APIs/Bindings/*Bindings.cs. This happened around the WorldBindings / PermissionsBindings / UtilBindings additions — probably during the Preview.16 → Preview.22 consolidation.
  • CCKStubs relocated: Assets/.../Scripting/Links/CCKStubs/Assets/.../Scripting/Links/APIs/CCKStubs/, matching the Bindings relocation.
  • WasmBuildProcessor sits in CCK/Editor/ now instead of Editor/ directly.
  • New in CCK/Editor/Templates/: WasmBehaviorTemplate.cs.template — the template file behind Assets > Create > CVR Wasm Behavior (C#).
  • New in CCK/Editor/: SkipValidation.cs, WasmMenuItems.CreateWasmBehavior.cs.
  • New attributes folder: Scripting/Attributes/ExternallyVisibleAttribute.cs arrived alongside Preview.11 work but the author-facing doc didn’t highlight it until Preview.27-WASM.24.
  • UnsafeUtils added: Scripting/Links/UnsafeUtils/ (Span ↔ NativeArray helpers for binder code).
  • WasmSourceGenerator.dll shipped at some point — a Roslyn source generator that emits the companion partial for each WasmBehaviour subclass (plugged into serialization).
  • WasmVM split into a partial: WasmVM.cs + WasmVM.Events.cs. The events half is where all the scripting_call_* export lookups and dispatch methods live.
  • EventForwarder/* classes (OnAnimatorIKForwarder, OnRenderImageForwarder, etc.) added under Scripting/EventForwarder/ to bridge Unity events that need specific dispatch shapes.
  • Dev post sections quote the developer announcements from CVR’s closed-testing channel, preserved as the builds shipped. There is no upstream official changelog file for the WASM CCK; these posts are the only linear record.
  • [verified], [unposted], and [correction] tags mark observations that don’t come from the dev posts but from inspecting the shipped builds and the current decompile. Where the post and the shipped bits disagree, the bits win and the disagreement is called out.
  • Steam branch keys are intentionally omitted. Branch names (WASM, NAK, feature_wasm) and Build IDs are preserved.
  • API Conventions — the current state the refactors converged on.
  • Architecture — what the runtime looks like today.
  • Validator — interactive check against the current surface snapshot.