Welcome back to the first development update of 2026. We hope you had a good start into the new year and are exited to show you what we've been up to.
We would like to start this post with a little bit of an explanation why progress seems so slow.
A lot of people might not know this but the game was once intended to ship with some kind of multiplayer support. You can find traces of this in script and in the general system design.
A lot of core systems are designed with this in mind, but newer systems and especially stuff after the 2.0 update is written without any regards for MP.
This causes constant issues for us, to the point where we usually spend more time wrangling system behavior into place, rather than actually implementing networking.
Let us show you an example:
We spent a lot of time improving our appearance sync recently. The reason for the improvement wasn't a bad sync, but rather a complex "state corruption".
The game stores your character customization in a structure called CharacterCustomizationState. Only one of these exists, it is a member of the CharacterCustomizationSystem and only designated for your PlayerPuppet.
If you re-customize your character in your apartment mirror, the game will update this "finalized state" and invoke a function called gameuiICharacterCustomizationSystem::ReFinalizeState by the games scripts.
This structure will be read by more than 10 different gameuiICharacterCustomizationComponent's which are responsible for applying appearance onto puppets. These are more or less complex depending on their task. The most complex one is probably the TPPRepresentationComponent, which does a lot of the heavy lifting when it comes to selecting what kind of appearance to spawn, if it should be visible, render layers etc. These components also take care of applying changes to your inventory NPCPuppet
The issue however is, that they never intended to have more than one "unique" PlayerPuppet entity in the world, so when they added the re-customization of characters in 2.0, they added listeners that register to "finalized state" changes to re-apply the new appearance on your PlayerPuppet and NPCPuppet.
The result of that is, that if you customize your character, the changes you make will wildly spread across all other PlayerPuppet's in your scope.
It takes hours if not days of tracing with breakpoints, hooks and reverse engineering to locate all of the undesired "data flow" and build proper patches and filtering hooks with ownership and locality checks.
So whilst we might add new sync for some system in a day, we usually spend weeks tracing down unintended behavior we need to correct.
This is one of the many patches for appearance sync:
[image: 1769390058021-cbf8600e-0fad-4367-a690-5ab4e572cb31-carbon-2.png]
Changelog
Scripting
We have made major improvements to our scripting environment since the last development update.
We added:
class/struct property access
optional parameters
scriptref and enum parameters in hooks
enum types of different sizes in both msgpack (hooks) and WIT (regular function calls)
EBR based scripting bundle load/unload system to support safe hot-reloading of bundles with callbacks, hooks and event listeners without costly locks
ConVar sv_ugc_automatic_restarts to enable filesystem monitoring of changed bundles for developer QoL
Many more small improvements too specific to list
We also vastly improved the codegen that translates RTTI properties (classes, functions, enums, etc.) into WIT and guest languages and prepared CI builds for the initial guest-csharp target.
These CI builds produce nuget packages to depend on, reducing the complexity of setting up development environments drastically.
We will publish all sources and example projects when the time is right, but the tl;dr is:
You will only need NET Framework 10 and pull 4 nuget packages from a nuget repo. This works on linux and windows without any need for IDEs.
Net
We've made loads of improvement to our networking logic. Some of it being rather low level, quantization and proper bit packing have been added recently to reduce network load, some of it being more "game focused".
A few examples:
Improved appearance sync with garment application after substantial component changes
Vehicle door and window state sync
Various fixes for animation driven sounds playing "in ear" instead of spatial
StatPools sync for health, armor, stamina etc
IK injection for improved "camera direction" sync
Ownership migration of static entities (Ownership migration of other entities is planned and already considered in netcode design)
Initial combat sync for players, vehicles and static entities like turrets
Code and build system
We made numerous improvements and updates to our build system and codebase.
We upgraded to llvm-21
We now build for x86-64-v3 / avx2 on clang and msvc
We expanded our test suite to cover a lot more of our core logic
We added proper handling of rpath for linux builds to prevent issues with LD_LIBRARY_PATH
A lot of code cleanup and improvements for clang-tidy linting
We improved on CI builds and did a lot of preparation for upcoming OSS workflows
Media
https://www.youtube.com/watch?v=0PKxy0C-8mE