Skip to content

WASM CCK Changelog

TL;DR: This page tracks every CVR Preview.N-WASM.M (and now Release-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.
Release-WASM.28First Release-tagged WASM CCK. All exceptions wrapped in ScriptException with source file/line, offending line preview, and per-frame call stack. Runtime module bumped 0.0.65 → 0.0.66.
Release-WASM.29Fix: exception handling broke on projects with a lot of code. Runtime module 0.0.66 → 0.0.67.
Release-WASM.30Fix: Unity math types were broken. Runtime module 0.0.67 → 0.0.68.
Release-WASM.3123402374First surface change since .28. Bound JointSpring, WheelCollider, WheelFrictionCurve, WheelHit, and the RequireComponent attribute. Reworked Unity event rewiring for properties on the target Behaviour. Runtime module 0.0.68 → 0.0.71.
Release-WASM.32CCK base version 4.0.0 → 4.0.1. Serializer overhaul: proper Unity fake-null handling, references now carry a .Value wrapper. New preview-filename generator (PreviewNumber). CVRLineRendererHelper [AddComponentMenu] label fix. Runtime module 0.0.71 → 0.0.72.
Release-WASM.33Hotfix. Serializer’s return on null became continue — lists with a null element were truncating at the null (silent save-data corruption). Build processor pre-serializes every WasmBehaviour once into a dict instead of inline per target. CCK-editor only — runtime module stays at 0.0.72.

All Preview.27-WASM.2x builds shipped on the feature_wasm Steam branch. Earlier builds preceded the consolidation to this branch. Release-WASM.28 is the first build to drop the Preview.N prefix in its filename — CCK_4.0.0_Release-WASM.28.unitypackage — signalling graduation from preview branding even though the underlying APIs are still under active design.

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.

First build released as CCK_4.0.0_Release-WASM.28.unitypackage (no Preview.N prefix). Branch and Build ID were not posted in the announcement.

Dev post:

  • Exceptions now possibly make sense.

  • All exceptions are now wrapped in a ScriptException which provides a better ToString. Output now includes the source file path, line number, the offending source line, and a per-frame call stack:

    KeyNotFoundException: Given key was not present in the dictionary
    at Namespace.Script.DoUpdate (C:/Projects/Game/Assets/Script.cs:45)
    'int value = dict[key];'
    at Namespace.Script.Update (C:/Projects/Game/Assets/Script.cs:23)
    'DoUpdate();'

[verified] Diffing CCK_4.0.0_Preview.27-WASM.27.unitypackage against CCK_4.0.0_Release-WASM.28.unitypackage:

  • The only meaningful CCK source change is in Assets/CVR.CCK.Wasm/CCK/Editor/WasmBuildUtility.cs:

    private const string CCKWasmModuleVersion = "0.0.65";
    private const string CCKWasmModuleVersion = "0.0.66";

    The CCK is just pinning the new runtime module version. The exception-wrapping logic itself lives in the auto-downloaded WASM module (%LOCALAPPDATA%/ChilloutVR/CVRBuildTools/), not in the CCK package — so there is no ScriptException.cs in the package source to look at.

  • All other content-hash differences (~194 *Links.cs files plus RegisterLinks.TMPro.cs) are binder regeneration artifacts. Line-by-line they’re identical to WASM.27; only file metadata moved.

  • No files were added or removed between WASM.27 and WASM.28 — file count holds at 1135 entries on both sides.

[unposted] The package nomenclature changed from CCK_4.0.0_Preview.27-WASM.27.unitypackage to CCK_4.0.0_Release-WASM.28.unitypackage. The dev announcement did not call this out, but it’s the first build in the archive without a Preview.N prefix.

Posted 2026-12-05 by Exterrata. No branch or Build ID given.

Dev post:

  • Fixed the exceptions stuff breaking when your project has too much code.

This is a follow-up fix to the ScriptException work shipped in WASM.28 — large guest modules tripped up the new exception wrapper.

[verified] Diffing CCK_4.0.0_Release-WASM.28.unitypackage against CCK_4.0.0_Release-WASM.29.unitypackage:

  • The only changed file is Assets/CVR.CCK.Wasm/CCK/Editor/WasmBuildUtility.cs:

    private const string CCKWasmModuleVersion = "0.0.66";
    private const string CCKWasmModuleVersion = "0.0.67";
  • Zero *Links.cs regeneration this time — the binder surface is byte-for-byte identical to WASM.28 (e.g. AnimatorLinks.cs hash is unchanged). 0 files added, 0 removed; 1135 entries on both sides. The fix lives entirely in the runtime module 0.0.67, which the CCK pins.

Posted 2026-12-05 by Exterrata (≈3 hours after WASM.29). No branch or Build ID given.

Dev post:

  • Fixed a lot of issues with Unity math types being broken.

Targets the Unity.Mathematics types (float3, quaternion, etc.) added to the module back in Preview.16-WASM.19 — marshalling between guest and host had regressions.

[verified] Diffing CCK_4.0.0_Release-WASM.29.unitypackage against CCK_4.0.0_Release-WASM.30.unitypackage:

  • Identical shape to the .28 → .29 step. Only WasmBuildUtility.cs changes:

    private const string CCKWasmModuleVersion = "0.0.67";
    private const string CCKWasmModuleVersion = "0.0.68";
  • Zero binder regen, 0 files added/removed, 1135 entries. Fix is in runtime module 0.0.68.

[observed] WASM.28, .29, and .30 are all pure runtime-module bumps (0.0.660.0.670.0.68). The CCK package source is functionally inert across the three except for the one-line version pin — which means the Bindings Surface snapshot tagged for WASM.28 remains accurate for .29 and .30. WASM.31 (below) is the first build since .28 to actually change the bound surface.

Branch: feature_wasm · Build ID: 23402374. Posted by NotAKid.

Dev post:

  • Bound the following types:
    • UnityEngine.JointSpring
    • UnityEngine.WheelFrictionCurve
    • UnityEngine.WheelCollider
  • Bound the UnityEngine.RequireComponent attribute.
  • Reworked Unity event rewiring to correctly handle cases where the target property exists on the target Behaviour itself. This really only mattered for targeting enabled; several unsupported events will now no-op instead of rewiring into a broken state.

[verified] Diffing CCK_4.0.0_Release-WASM.30.unitypackage against CCK_4.0.0_Release-WASM.31.unitypackage:

  • 3 files added:
    • Scripting/Links/WasmBinder/UnityEngine/JointSpringLinks.cs (auto-generated; registered via JointSpringLink.BindFunctions in RegisterLinks.UnityEngine.cs).
    • Scripting/Links/WasmBinderManual/UnityEngine/WheelColliderLinksManual.cs (hand-written — also where WheelFrictionCurve is bound, which is why there’s no separate WheelFrictionCurve file).
    • Scripting/Links/WasmBinderManual/UnityEngine/WheelHitLinksManual.cs (hand-written — the struct WheelCollider.GetGroundHit returns; not named in the dev post but shipped alongside).
  • So the bound surface gains 4 types (JointSpring, WheelCollider, WheelFrictionCurve, WheelHit), not 3 — see Bindings Surface, now 285 → 289.
  • Meaningful source changes beyond the regen: WasmBuildProcessor.cs (the event-rewiring rework), BindingManager.cs + TypeMap.cs + WasmAccessManager.cs (registration/access for the new types and the RequireComponent attribute), RegisterLinks.UnityEngine.cs / RegisterLinks.CVR.cs, and a new CCK component CVRWheelController.cs (CVR.CCK/Scripts/Components/) that consumes WheelFrictionCurve.
  • 126 *Links.cs regenerated — type IDs shift when new types are inserted, so the binder re-emits. 0 files removed; entries 1135 → 1138.
  • Runtime module pinned 0.0.680.0.71 (skipped 0.0.69/0.0.70, internal iterations).

[observed] WheelCollider and WheelHit are bound as manual shims (*LinksManual.cs), like Debug / GameObject / GraphicsBuffer / Object — the source generator can’t auto-bind them (WheelCollider has overloaded/out-param methods such as GetGroundHit(out WheelHit)). RequireComponent is an attribute, not a callable type, so it doesn’t appear in the type list but is now recognised by the build’s component-requirement validation.

No Build ID posted in the announcement. Dev post not retained verbatim — reconstructed from the package diff against WASM.31.

Observed changes (full list from diffing CCK_4.0.0_Release-WASM.31.unitypackage against CCK_4.0.0_Release-WASM.32.unitypackage):

  • CCK base version 4.0.04.0.1. In Assets/CVR.CCK/Scripts/CVRCommon.cs:

    public const string BaseVersion = "4.0.0";
    public const string ReleaseType = ReleaseTypes.Release /*+ ".26"*/;
    public const string BaseVersion = "4.0.1";
    public const string ReleaseType = ReleaseTypes.Release;
    public const int PreviewNumber = 1;

    The old static property CCK_UNITYPACKAGE_NAME was replaced with a GetUnityPackageName(bool isWasm = false) method that adds a _WASM suffix when called from the WASM tooling and a .<PreviewNumber> suffix for Preview release types. So the next preview-tagged build could ship as CCK_WASM_4.0.1_Preview.1.unitypackage instead of the historical CCK_4.0.0_Preview.N-WASM.M.unitypackage shape. The current Release builds keep the CCK_4.0.0_Release-WASM.<n>.unitypackage filename because ReleaseType == Release takes the no-preview-number branch.

  • WasmSerializer rewritten for Unity null-equality semantics. Object-typed fields now go through:

    bool isNull = obj is UnityEngine.Object unityObj ? unityObj == null : obj == null;
    data.AddRange(BitConverter.GetBytes(isNull));
    if (isNull) return;

    (Note the return here — WASM.33 below changes it to continue.) The previous implementation cast directly to UnityEngine.Object and used obj == null, which silently passed Unity’s destroyed-but-not-null sentinel through serialization.

  • WasmSerializedObject restructured (~40 line diffs). References are now wrapped — see the build processor change below for evidence.

  • WasmBuildProcessor.cs reference rewiring. The serializedObject.references[i] array now exposes wrapped entries with a .Value property; the rewrite code goes:

    Object reference = serializedObject.references[i];
    if (reference is WasmBehaviour && replacementMap.TryGetValue(reference.GetInstanceID(), out (Type, WasmRuntimeBehaviour) runtimeBehaviour))
    serializedObject.references[i] = runtimeBehaviour.Item2;
    object reference = serializedObject.references[i].Value;
    if (reference is WasmBehaviour b && replacementMap.TryGetValue(b.GetInstanceID(), out (Type, WasmRuntimeBehaviour) runtimeBehaviour))
    serializedObject.references[i].Value = runtimeBehaviour.Item2;

    The cast widens to object, the instance ID is read off the resolved WasmBehaviour b, and the assignment goes through .Value. Reads of the field by a downstream consumer (the runtime that loads the serialized object) need the same .Value indirection.

  • CVRLineRendererHelper menu-label fix:

    [AddComponentMenu("ChilloutVR/CVR Leg")]
    [AddComponentMenu("ChilloutVR/CVR Line Renderer Helper")]

    A copy-paste-from-CVRLeg typo from an earlier release.

  • WasmSourceGenerator.dll updated (binary; can’t textual-diff). Likely tracks the new .Value wrapper and the serializer changes.

  • Hash-differs-but-line-identical (regen noise): RegisterLinks.UnityEngine.cs, RegisterLinks.CVR.cs, TypeMap.cs, WheelColliderLinksManual.cs, WheelHitLinksManual.cs, CVRParameterStream.cs, CCK_CVRParameterStreamEditorEntries.cs. No code change.

  • Runtime module pinned 0.0.710.0.72 (single increment this time).

  • 127 *Links.cs regenerated. 0 files added, 0 removed; entries hold at 1138.

[observed] The binding surface is unchanged from WASM.31 — no *Links.cs added or removed. The Bindings Surface page tagged for WASM.31 (289 types) is still accurate.

Hotfix on top of WASM.32. No Build ID posted; dev post not retained verbatim.

Observed changes (2 files, line-identical diff):

  • WasmSerializer.csreturncontinue bug fix. WASM.32’s null-handling used return inside the per-element loop bodies of array/list serialization paths:

    if (isNull) return;
    if (element == null) return;
    if (isNull) continue;
    if (element == null) continue;

    With return, the first null element in a list aborted the entire serialization — every subsequent element silently never got written. Any save data with a null inside an array would be truncated at the null. continue skips just that element. This is the single most user-visible change of .32/.33 — anyone whose save data appeared to be losing entries after upgrading to .32 had this bug.

  • WasmBuildProcessor.cs — pre-serialize all behaviours once, then look up. Was:

    // Pass eventContext to serializer
    dst.serializationData = WasmSerializer.SerializeBehaviour(src as IWasmSerialized, eventContext);

    inline at each target. Now:

    Dictionary<int, WasmSerializedObject> serializedData = new();
    foreach (WasmBehaviour behaviour in GetAllComponents<WasmBehaviour>())
    serializedData[behaviour.GetInstanceID()] = WasmSerializer.SerializeBehaviour(behaviour as IWasmSerialized, eventContext);
    ...
    dst.serializationData = serializedData[src.GetInstanceID()];

    Each behaviour is serialized exactly once and reused. Removes redundant work and any chance of inconsistency between targets if serializer state was non-deterministic.

[verified] Runtime module pin stays at 0.0.72WasmBuildUtility.cs is untouched. WASM.33 is purely a CCK-editor patch; no new runtime build needed to consume the fixes.

[observed] Binding surface unchanged from WASM.31/.32. Bindings Surface page snapshot remains accurate.

Diffing CCK_4.0.0_Preview.11.WASM.unitypackage vs CCK_4.0.0_Release-WASM.28.unitypackage surfaces reorganisations the per-build posts didn’t call out. File counts: Preview.11 ships 1069 entries, Release-WASM.28 ships 1135. Net +138 added and −72 removed outside the auto-generated WasmBinder/*Links.cs set.

  • Wasmtime upgraded 22.0.0 → 34.0.2 at some point between Preview.12 and Preview.27. Along with the upgrade, the native-library path shape changed: Packages/Wasmtime.X.X.X/runtimes/<platform>/native/<lib> (Preview.11) → Packages/Wasmtime.X.X.X/runtimes/<platform>/<lib> (the native/ segment was dropped).
  • Native targets reshuffled. Preview.11 shipped four desktop targets (linux-x64, osx-x64, osx-arm64, win-x64). Release-WASM.28 ships only win-x64 plus a brand-new android-aarch64 target — Linux and both macOS desktop libraries were dropped during the upgrade.
  • System.Runtime.CompilerServices.Unsafe 6.1.2 is shipped as a sibling package under Packages/.
  • Editor scripts relocated: Assets/CVR.CCK.Wasm/Editor/Assets/CVR.CCK.Wasm/CCK/Editor/. WasmBuildProcessor.cs and WasmBuildUtility.cs both moved.
  • CCKWasmProjectDescriptor split into runtime + editor: the component itself now lives at CCK/CCKWasmProjectDescriptor.cs (runtime type, can be attached to scene objects), and its inspector lives at CCK/Editor/CCKWasmProjectDescriptorEditor.cs.
  • New in CCK/Editor/Templates/: WasmBehaviorTemplate.cs.template — the file behind Assets > Create > CVR Wasm Behavior (C#).
  • New in CCK/Editor/: SkipValidation.cs, WasmMenuItems.CreateWasmBehavior.cs.
  • Scripting/Unsafe/ folder removed entirely. Its contents either moved or were obsoleted:
    • Unsafe/WasmBehaviour.csScripting/WasmBehaviour.cs (one folder up).
    • Unsafe/ExternallyVisibleAttribute.csScripting/Attributes/ExternallyVisibleAttribute.cs. Despite being present from the start, the author-facing doc didn’t highlight it until Preview.27-WASM.24.
    • Unsafe/SerializerShadowClass.cs, SerializationHelpers.cs, WasmSerializationData.cs deleted — replaced by the Roslyn source generator (see below).
    • Unsafe/WasmScripting.Unsafe.asmdef retired; the active asmdef is now Scripting/Links/UnsafeUtils/WasmScripting.UnsafeUtils.asmdef.
  • WasmSourceGenerator.dll ships under Scripting/ — a Roslyn source generator that emits the companion partial for each WasmBehaviour subclass, plugged into serialization. Preview.11 had a similarly named WasmSourceGenerators.dll (plural) which was retired in favour of the singular file.
  • WasmVM split into a true partial: WasmVMEvents.csWasmVM.Events.cs. The events half is where all the scripting_call_* export lookups and dispatch methods live.
  • New supporting types under Scripting/: IWasmSerialized.cs, WasmBehaviourInfo.cs, WasmSerializedObject.cs, EventDispatch.cs, and UnityEventSerializationContext.cs (backs the UnityEvent serialization shipped in Preview.16-WASM.21).
  • EventForwarder/* classes (OnAnimatorIKForwarder, OnRenderImageForwarder, OnAudioFilterReadForwarder, OnCollisionStayForwarder, OnTriggerStayForwarder, etc.) added under Scripting/EventForwarder/ to bridge Unity events that need specific dispatch shapes.
  • Bindings subfolder introduced: Scripting/Links/APIs/*Bindings.csScripting/Links/APIs/Bindings/*Bindings.cs. Many new bindings landed alongside the move: AvatarBindings, AvatarPointBindings, FileStorageBindings, LocalPlayerBindings, NetworkingBindings, PermissionsBindings, PlayerBindings, PortalBindings, PropBindings, UtilBindings, WasmUtilsBindings, WorldBindings, WorldSettingsBindings. The relocation likely happened during the Preview.16 → Preview.22 consolidation.
  • CCKStubs relocated: Scripting/Links/CCKStubs/Scripting/Links/APIs/CCKStubs/, matching the Bindings relocation. New stubs added on the way: AvatarCCK, CVRCameraCCK, CVRInputCCK, NetworkingCCK, PortalCCK, PropCCK, ProxyExtensions, WasmUtilsCCK, WorldCCK, WorldPermissionsCCK, WorldSettingsCCK. The original four (AvatarPointCCK, FileStorageCCK, LocalPlayerCCK, PlayerCCK) carried across.
  • WasmBinderManual/ folder added alongside WasmBinder/. Hand-written binder shims for things that can’t be auto-generated live here: DebugLinksManual.cs, GameObjectLinksManual.cs, GraphicsBufferLinksManual.cs, ObjectLinksManual.cs. The auto-generated *Links.cs files in WasmBinder/ are companion partials.
  • UnsafeUtils added: Scripting/Links/UnsafeUtils/ (Span ↔ NativeArray helpers for binder code) with its own asmdef.
  • New runtime helpers under Scripting/Links/: WasmStubs.cs (replaces the now-removed WasiStubs.cs), WasmBindingUtils.cs, WasmInstantiationHelper.cs (backs the no-reflection Object.Instantiate path from Preview.16-WASM.20), WasmAccessDeniedException.cs, WasmAccessManager.HandleManagement.cs (the access-manager handle rework from Preview.22-WASM.22), and CVRScriptContext.cs.
  • Scripting/Links/APIs/ gained: BufferReaderWriter.cs, CVRScriptContextEnums.cs, FileStorageManager.cs, WasmNetworkManager.cs, WorldPermissionsManager.cs. The three-axis permission/context model (CVRScriptObjectContext, CVRScriptScopeContext, CVRScriptOwnerContext) lives in CVRScriptContextEnums.cs.
  • Newtonsoft.Json renamed: Scripts/Dependencies/Newtonsoft.Json/Abi.Newtonsoft.Json.dllCVR.Newtonsoft.Json.dll. This is the underlying fix the Preview.13-WASM.18.1 announcement referenced.
  • New rendering primitives: Scripts/Components/Abstract/CVRRenderComponent.cs, Scripts/Components/CVRMaterialDataProvider.cs, Scripts/Components/CVRRenderController.cs, plus inspector editors under Scripts/Editor/GUI/Components/CCK_CVRMaterialDataProvider/ and CCK_CVRRenderController/.
  • New validation steps: Scripts/Editor/Validation/Steps/AudioImportSettingsStep.cs, BrokenMonoBehavioursStep.cs, ParticlePrewarmStep.cs, and RootSteps/ProjectSetupStep.cs.
  • New editor utilities: Scripts/Editor/Hacks/AudioValidationUtils.cs, SceneHierarchyExpansionHack.cs.
  • Old CCK Lua stubs removed: the entire Scripts/Editor/Scripting/LuaStubs/Common/library/ folder (CVR_CCK.lua, CVR.lua, CVR_Network.lua, FinalIK.lua, RCC.lua, System.lua, TextMeshPro.lua, UnityEngine_AI.lua, UnityEngine_UI.lua, UnityEngine.lua, plus the _CVRGlobals.lua, _CVRSpecial.lua, _globals.lua autocompletion roots) is gone. The Lua scripting reference stubs are no longer shipped inside the CCK package.
  • Removed: Scripts/Editor/GUI/Components/CCK_CVRBlitter/CCK_CVRBlitterEditorEntries.cs — folded into the main blitter editor.
  • New shader include: Assets/Shaders/CVRGlobals.cginc — global CVR shader macros for content shaders.

Preview.27-WASM.27 → Release-WASM.28 specifically

Section titled “Preview.27-WASM.27 → Release-WASM.28 specifically”

Zero structural changes. The whole-package diff is:

  • One real source change: WasmBuildUtility.cs bumps CCKWasmModuleVersion from 0.0.65 to 0.0.66.
  • 195 binder files show hash differences but line-identical content (regen artefacts).
  • 0 files added, 0 files removed; 1135 entries on both sides.
  • 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.