Welcome to the Developer Update for November 6, 2025.
Today’s featured world is Cozy Coast by +Vera+.
Announcements
WIZARDS
STRASZ THE PURPLE has ENCHANTED YOUR EYEBALLS so that you MUST WATCH THIS VIDEO:
But yes, we have a lot of content for November! The Flask of Effervescence! The Emoji Grimoire Pack! The Sigil of Teleportation! The RUNIC GATEWAY! Of course, the Wizard Sticker Pack! And… a Penlight? Yeah, okay.
You’ll have until December 4th at 1PM PST to purchase all the goodies, so go get 'em.
Euoooooaaaaaahm… Oooooooaooooahm
There’s also something else in there for VRC+ subscribers. It’s not magical. Your friends are going to hate you.
:)
Event and Group Sharing
You will soon be able to share Groups and Events via the Sharing System! Groups and Events can both be shared via Pedestals or shared directly to other users.
Sharing Groups and Events will not require VRC+, so go crazy and share all of the cool things that you’re interested in with your pals!
Public Events and Public Groups are pretty straightforward to share if you’re already familiar with our Sharing System. Simply find the Group or Event that you’d like to share and hit the new “Share” Buttons on their respective info pages.
(PS: the event page share button used to open your web browser. This functionality has been moved to a new View on Website button!)
You can then drop them as pedestals…
…or you can share them directly with others!
Private Groups cannot be shared at this time.
It’s also important to note that these shares are not invitations to groups or events, rather, they serve as a quick way to get other people to the info pages for their respective content.
Users can choose to join the group or register interest themselves after they get a chance to view the shared content’s details.
This also means that public groups that are invite-only can still be shared, but that doesn’t mean that users viewing the details via a share are automatically invited.
This might be handy for club owners, for example, to share show-running groups and information about them but not necessarily have every user join as a member!
Group-only events can only be shared via pedestals for now. Only members of the group hosting the event will be able to see these pedestals. If roles are defined on the event, the pedestals should only appear for group members that have the respective roles.
More Steam Audio Behind the Scenes!
Some further work on realistic player voices! We wanted to get it just right, so we snagged a dataset of human voice properties (Leishman et al, you can see it here).
…and crunched the numbers to find the best possible fit!
We learned a couple neat things in the process - human voice, at least in the mid-to-high range, tilts slightly up due to how your neck/skull absorb sound.
Secondly, while Steam Audio uses raw amplitudes (and visualizes them that way), most papers you find are going to visualize in decibels. Tweaking the Steam Audio visualizer to fit this made it a little easier to see what was going on!
Here’s our results: it’s subtle, but internal feedback has been saying it’s a game-changer with big crowds in tight quarters. You might not even reach for earmuffs!
The blue section (Steam Audio highs, which are >8khz) aren’t even visualized in the paper, as the paper cuts off right at 8khz. This is likely because higher frequencies mostly only matter for syllabics (e.g. ssss noises) so tend to be overlooked.
Note that this is a good simulation of sound in a big, open area (concert, club, open field, outside) and less so of close indoor scenes, but either way it’s closer than a flat curve ever was!
Upcoming Creator Fixes
“Thumbnail image required” Avatar Upload Failures
In SDK 3.9.0, it’s possible for an avatar project to get stuck in a state where uploads always fail with the error “Thumbnail image is required for avatar creation”, even if a thumbnail had actually been selected.
This issue is related to how the SDK now generates avatar IDs remotely instead of locally, which is something we’ve mentioned in a previous Dev Update.
If a new avatar upload is interrupted, it can potentially leave a partially uploaded avatar behind, which can then cause strange behavior in the SDK when you try to upload it again.
A future release of the SDK will handle these partial avatars correctly, which should deal with this problem.
The SDK Builder Page Writes Defaults on Avatars
In SDK 3.8.2, a new validation check was introduced for avatars to verify that the avatar’s armature is a direct child of the game object that contains its animator.
This is necessary to allow pose syncing to work properly, or in other words, to make sure the pose you’re seeing yourself doing locally matches what other people see you doing. As part of that validation check, the SDK began calling Rebind() on the avatar’s animator.
Unfortunately, rebinding the animator also causes it to write defaults, which had the effect of reseting everything on the avatar affected by its animator back to its defaults every time validation ran. This one slipped past us – sorry for the issues it’s been causing!
The next SDK release will update it to rebind in a way that does not write defaults.
VRCMirrorReflection Can Modify Built-In Materials
The SDK contains a component called VRCMirrorReflection, which makes various changes to the material used by the attached object to turn it into a mirror.
It’s main purpose is to be used by the VRCMirror prefab included in the SDK, which you can drag and drop into your world to quickly and easily create a new mirror. Based on that assumption, this component worked by searching for a Renderer on the same game object as it and then directly reassigning its shader to the one used by VRChat’s mirrors.
Things would get weird if you directly added this component to one of Unity’s built in primitives like the Cube or Quad! Unity primitives use a material that’s built into the game engine that you should normally never edit.
When adding VRCMirrorReflection to one of them, that material would be updated to use the mirror shader instead of Unity’s Standard shader. That change would then apply to every other primitive shape in your world since they’d be using the same material!
A future SDK release will update this component so it only tries to directly replace the shader if the material is marked as editable (more specifically, if hideFlags doesn’t include NotEditable).
If the material isn’t editable, the component will generate its own copy of the material with the shader assigned and use that instead, leaving the original unchanged.
OSC /avatar/change Endpoint Wasn’t Triggering
The OSC end-point /avatar/change lets you switch avatars automatically by passing an avatar ID to it. The way this was intended to work is that it would let you change to an avatar if it’s:
- In any of your favorites lists,
- One you’ve used recently,
- One you’ve purchased, or
- One you’ve uploaded yourself.
An issue affecting this method made it so only the first of those cases was working. That’s fixed in an upcoming client release, so you’ll be able to use it for recent, purchased, and uploaded avatars again!
Data Dictionary Struct Key Issues
Data dictionaries can be used in Udon to map keys to values just like an ordinary C# dictionary. There’s been an ongoing issue with them where if you use a struct type as the key, attempts to get values out might fail when they shouldn’t.
For example, when doing something like this:
DataDictionary dict = new DataDictionary();
dict[new DataToken(new Vector3Int(2, 4, 6))] = new DataToken("test");
// Later...
if (dict.TryGetValue(new DataToken(new Vector3Int(2, 4, 6)), out DataToken value)) {
Debug.Log($"UDON: Success! {value}");
} else {
Debug.Log($"UDON: Failed!");
}
…the script would log “Failed!”, even though there is actually an entry in the dictionary with that key.
When two DataTokens contain references to structs, they were being compared by doing an equality check between those references using ==, which compared them by reference instead of by value.
The fix coming in the future is to compare those references by using Equals() instead, which means data dictionaries can get values correctly when they key is the same as a key already in the dictionary.
String and Image Loading Have No Content Headers
You can use string loading and image loading to request strings and images from the Internet from Udon and display them in your world in some way.
An upcoming client release will set the Accept header of string and image requests:
- String requests will have the
Acceptheader set to*/* - Image requests will have the
Acceptheader set toimage/*
The goal of this is to let the server processing the requests tell whether the client is asking for a string or an image. In some worlds, this might help to reduce the number of VRCUrls that are needed by letting requests for each kind of content go to the same URL.
No Stream Tomorrow!
Woah, you made it down here? Well, if you did, we’re just letting you know that there’s no stream tomorrow. See you next week!
Conclusion
…and that’s it! Our next Dev Update will be on November 20.









