Developer Update - 24 September 2026

Welcome to the Developer Update for September 24, 2026.

Today’s featured world is uhh… our artist forgot to make a thumbnail, Flare had to make one.

(They think it’s “painfully bad,” but personally I think it owns.)

Announcements

Spookality

The Spookality Jam is ongoing!

We announced it last time, but we just want to keep it fresh in your mind while it’s going on. Here are the important dates:

  • Submissions Open: Sept 3 - Oct 1
  • Judging Period: Oct 2 - Oct 15
  • Showcase Period: Oct 16 - Nov 2

Also, once again, in the spirit of the jam, we’ve decided to feature ALL eligible entries in the Home/Hub world for Spookality, even if they didn’t win a prize.

Steam Frame… Today!

Well, last week. But you get it! Well, maybe you got it. I DIDN’T. GABE.

Regardless, we’ve had a lot of questions about our support for the Frame!

You can find most of your questions answered here!

But to knock out the two biggest ones:

Yes, the standalone version of VRChat is accessible on the Steam Frame.

No, you cannot run “PC” VRChat on the Steam Frame.

The Frame is an impressive device! It runs the standalone (“Android”) version of VRChat very, very well. We also think it provides a fantastic experience for PC users who like to wirelessly stream VRChat to their headset. Seriously. Steam Link with that fancy dongle is magic.

2026.3.3 Beta!

Yup! We’re still in beta. You can read about our progress in the notes here!

We’ve been doing a lot to incorporate your feedback into the new HUD + keyboard. Yes, we brought the old mic icon back.

In the last beta update, we also introduced a new feature… or should I say, a news feature. Ah ah ahahhah ha… I’m sorry. You’ll now see the patch notes (and any other update stuff we throw your way) in the client! With video!

Anyway, this lets us finally talk to most users (you know – the folks that aren’t about to read my yapping in the Discord, or whatever).

There, um, have been a few bugs. This was a particularly rare one that I wanted to share.

I truly mean the next sentence. Seriously. Please. Please listen to me.

:warning: EXTREME VOLUME WARNING. NO, SERIOUSLY. :warning:

:warning: EXTREME VOLUME WARNING. NO, SERIOUSLY. I’M WARNING YOU DOWN HERE, TOO. NO EXCUSES. :warning:

anyway it’s not supposed to do that but we fixed it i think. my bad if i kill your ears. i didn’t mean to. i just wanted you to know about the patch notes. anyway, on to some Cool Stuff!

High Fidelity Face Tracking

You may be familiar with the “Selfie Expression” feature, which allows you to use your webcam for face tracking (and finger tracking) that animates your avatar. This works by using the old viseme (lipsync) and eyelook support already on many avatars.

While this meant that the feature supported a bunch of old avatars, the old systems weren’t created with full high fidelity face tracking in mind.

That means… it’s time for an upgrade.

Beyond Legacy Selfie Expression

We’re introducing a new “Face Tracking” section to the Avatars SDK which adds support for expressive and creative authoring of avatars that respond to high fidelity face tracking.

This new system allows integrated interaction with visemes, eyelook and eyelids, and the full set of Unified Expressions tracking keys from the standard established by VRCFT.

There’s a lot of detail to cover here, so let’s just dive right in, explaining elements in the screenshot from top to bottom:

  • Use All Tracking Keys: this checkbox exposes all of the Unified Expressions keys for use. Checking this box establishes that this avatar is a full face tracking avatar.
    • This exists mainly to separate out avatars that are just trying to do advanced eye or viseme control (the new systems are the only way to use multiple meshes with visemes, for example). Without the checkbox those avatars would be surfaced as full face tracking avatars in the avatars UI etc.
  • Face Tracking Meshes: you can add multiple meshes to be affected by the face tracking system.
    • Also, when visemes are handled via the face tracking system (there’s a dropdown option in the old visemes section to use the advanced face tracking systems instead) this means that you can drive visemes on multiple meshes as well.
    • Anything in the system that drives a blendshape will drive blendshapes with that same name across all meshes in this list.
  • Viseme Dampen: you can select how visemes driven by audio interact with face tracking driven by tracking (to prevent overdrive issues).
    • The options are “Dampen Visemes” (strong mouth tracking activity dampens viseme activity) and “Dampen Tracking” (strong audio viseme activity dampens associated mouth tracking strength). With a slider to tune in how much dampening works best for the avatar
  • Blendshapes Sets: You can define multiple entire sets of mappings between the tracking data and blendshapes.
    • For example, you could make a “happy set” or “angry set” or just a partial layered set such as “bored eyelids” etc. Each blendshape mapped in a set also gets a “Multiplier” value, so you could make a copy of a set that just drives everything at 10x.
    • Blendshapes Sets simultaneously layer together so that “max wins” for anything trying to set a final blendshape value on your meshes. You can dynamically change the weight of an entire set using a new animator state behavior:
      • In the example image, when the state behavior is triggered, it would take the value from a “CheekPuff” avatar parameter, remap the range from 0.5~0 into a weight going from 0~1 and smoothly move the blendshapes set named “normal” towards that target weight (speed setting is 3 in the screenshot).
      • In this way, you can use the animator as a state machine to control the overall state for how face tracking layers onto the avatar, while leaving the heavy lifting of sampling tracking data and applying blendshapes to faster systems that live outside the animator.
  • Parameter Behaviors: these allow you to avoid complicated animator setups for combining and mathematically manipulating face tracking input. On the left, you can choose a target. Options are:
    • Forward to Animator: sends the result of the calculation to an animator parameter to use in the animator however you’d like. In this example, we’re taking the maximum of CheekPuffLeft and CheekPuffRight tracking keys, and combining that into a single CheekPuff parameter for the animator to use
    • Apply Blend Set Weight: lets you apply the result as the weight value for a Blendshapes Set
    • Apply to Blendshape: directly applies the result to a blendshape, without using the animator
    • Limit Blendshape (Min), Limit Blendshape (Max): these options apply the result as a limit to the min or max value of a blendshape. Useful for preventing clipping from blendshapes that should limit each other and not be fully active at the same time
  • Parameter Behaviors allow you to select a combine mode. Options are:
    • Max: take the maximum value from all the input tracking keys (you can optionally invert them)
    • Min: use the minimum value fro all the input tracking keys
    • Add: add up all the tracking keys
    • Multiply: multiply together all the tracking keys
    • Custom: create a custom math expression such as: “max(EyeClosedLeft, EyeClosedRight) * 0.5” you can use tracking key names directly and the operations: + - * / abs() min() max() clamp(). The final output is clamped between -1 and 1

What about synced parameters? Performance ranks? Webcam support? OSC support?

Synced Parameters

The new system sends the entire set of Unified Expressions face tracking keys across the network to remote viewers of your avatar, so the same native SDK tracking features and animator interaction are active on remote, too.

This means you don’t need to use any synced parameters for this system. The Unified Expressions data will be transmitted similarly to how NetIK is transmitted (meaning it can be lossy depending on factors such as how close you are to the remote avatar).

We’ll tune this behavior over time with your feedback, but the goal is that nearby avatars have very high fidelity, without wasting network bandwidth on avatars you’re not really looking at.

From an avatar creator’s perspective, network degradation should be similar to someone switching from very accurate face tracking hardware to less accurate hardware, meaning if the avatar is built to work with a range of tracking hardware, it should work in a range of network conditions, too.

If however you want to be extra sure some tracking value is not subject to dynamic lossy behavior, you can forward it to the animator with a Parameter Behavior, and set the animator parameter as synced (using your synced parameters budget in that case).

For the majority of cases this shouldn’t be necessary though.

Performance Ranks

The new system keeps track of two things: Face Tracking Operations, and Forwarded Parameters. The goal is to prevent abuse of the new systems while still allowing enough freedom to incentivize using the new stuff rather than relying on the old animator-heavy setups (which will still remain possible).

  • Face Tracking Operations: roughly means a single math operation that the face tracking system performs. This includes:
    • Each blendshape mapping in each Blendshapes Set
    • Each input into a Parameter Behavior
    • Each custom operation in a custom Parameter Behavior
    • Operations affecting a blendshape get multiplied by the number of meshes mapped to the face tracking system
    • Current limits (subject to change):
      • Excellent ≤ 2,000
      • Good ≤ 4,000
      • Medium ≤ 8,000
      • Poor ≤ 16,000
      • Very Poor > 16,000
  • Forwarded Parameters: how many tracking parameters are forwarded into the animator by the Parameter Behaviors using target mode: “Forward to Animator”
    • The idea here is to incentivize not just forwarding every last tracking parameter right into the animator and creating even more heavy animators than before.
    • Current limits (subject to change):
      • Excellent ≤ 10
      • Good ≤ 20
      • Medium ≤ 30
      • Poor ≤ 40
      • Very Poor > 40

Webcam Support

The new system works with Selfie Expression webcam face tracking, and because we’re not trying to fit everything into a small number of viseme mappings, the fidelity will be much much higher! This should allow all our desktop PC users to enjoy highly expressive avatars with just a webcam!

OSC Support

The new system also accepts a simple binary blob OSC message with one byte per Unified Expressions tracking key. So OSC based VR face tracking will work as well!

WHEN???

Soon :tm:!

This has been in closed beta testing for awhile (thank you to those testers!) and we’ve been gathering helpful feedback from prominent community members such as Hash and the VRCFT team and many others as we’ve been working on it. Stay tuned in our official discord open-beta-announcements channel for when general public testing opens up.

Lastly, here’s an example video using the new face tracking SDK, provided by Hash showing their face tracking work on the Lapwing avatar from Kuji:

Udon Methods for Friend Info

VRChat Worlds are best experienced with friends, so we’re adding functionality that world creators can use to reward you for bringing and making friends!

The new methods are:

  • Get “Bucketed” Friend Count gives worlds an approximate count of how many friends you have in the world, like this (exact numbers TBD):
    • None (0-1)
    • Few (2-4)
    • Some (5-9)
    • Many (10+)
  • Events for Friend Requests triggers when a friend request is sent or accepted in the current instance, without revealing the other side of the connection
    • Event when the local player sends a friend request (but not to whom the request was sent)
    • Event when the local player accepts a friend request (but not from whom the request was sent)

We’ve planned these features very carefully to balance user privacy with fun new abilities for worlds. However, if you don’t want worlds to be able to access this info at all, you can turn off the new “Allow Worlds to Count Friends in Instance” setting which will launch at the same time as the feature.

Name Mapped Parameter Buffers

We talked a bit about Variable Width Avatar Parameters in a previous Developer Update. Since then, we’ve also been looking at extending the system further to support mapping synced avatar parameters by name.

Previously if you’ve made an avatar available for multiple platforms with synced avatar parameters, you’ve had to be careful to keep the parameter buffer (the block of 256 bits that contains your data) the same across all platform builds for that avatar. This is because the VRChat client currently operates on the assumption that this buffer is the same for all platforms, which can lead to unexpected behavior in situations where they don’t match.

A future update aims to address this by mapping these parameters by their names rather than by where they appear in the buffer.

As long as the parameter has the same name across all platforms for the avatar, the game client will be able to correctly read it from other users in the instance even if they’re running a different platform than you. This is being designed in a way that means it should happen transparently, without requiring any changes on the avatar creator’s side.

This feature is being set up in combination with variable width parameters - keep an eye out for both in a future update!

Speaking of variable width parameters, here are a few recent developments with those:

  • Based on your feedback, we’ve been looking at allowing variable representation, which means you can choose whether the value is signed (positive and negative values) or unsigned (positive values only). For integers, this controls whether the values start at zero or are roughly equally distributed around zero. For floats, switching to unsigned allows the range to be reduced from [-1,1] to [0,1], which trades off the negative numbers but gives double the original precision so the value can be more precise.
  • We’ve found during development that it’s unfortunately unlikely this will be able to support bit widths above 8, due to dependencies on how synced parameters are currently networked. However, it’ll still be possible to reduce them below 8, which we hope will help to save on buffer space for some of the more complex avatars.
  • These options will be hidden by default in the SDK, with a control to show and hide them, to avoid overwhelming new creators. Here’s a quick updated preview of the interface for avatar parameters (as always, this is subject to change):

Conclusion

That’s it for this week! see you in a few weeeeeeks

25 Likes

Oh my Lord that make me laugh xD that’s so loud damn

6 Likes

63 Likes

this is awesooome!!

Is there any privacy reason why VRCPlayerAPI.IsFrienddoesn’t exist? :3

I’ve always wondered that and it may tie well with the new privacy setting~ (?)

4 Likes

LMAOOO!! I’m so happy you posted it!
And for everyone else, I promise it was NOT that loud on my end HAHAHA! Best and the loudest bug ever <3

I clicked on the video before reading anything and paid dearly it.

Anyway, so excited to see face tracking escape the animator with proper implementation.

Aaa! The unsigned float change combined with bit depth is a very welcome addition. Many of my float radials have been getting away with half precision all this time so they can probably become unsigned with half the depth or even less.

1 Like

Could we just have a one-time permission prompt instead? Something like: “Allow this world to see which players in the instance are on your friends list?”

14 Likes

Can we also get the laugh viseme too? I know it’s an old request but i don’t see why we can’t have that.

Will there be a dampening/blending parameter too? Either way this solves a lot of problems we’ve had for years with some avatar facial expressions.

1 Like

Due to hardware limitations, the PC version of VRChat is not supported as a standalone option on the Steam Frame.

This is false. The Steam Frame uses an ARM64 architecture, which by default is not compatible with the PC version built for x86-64 processors. But the whole point of the Steam Frame is that it has a compatibility layer that allows x86-64 games to run on its ARM64 processor. That is precisely the point of the headset: it can run PC VR games. That said, VRChat may not work properly, and the easiest approach may have been to make an Android build of the game for this system.

6 Likes

Probably a privacy thing. Like if the world can get your friends status and you have untrusted url on it may be possible for a world creator to get that data out of vrc and into a database of some kind. Though I guess it could still be done w/ the 1-2 friends bucket in a 1-3 person instance…

1 Like

I’m super excited for native face tracking, but I have a huge concern.

Jerry’s VRCFT templates, which are currently used on thousands of avatars, don’t just drive blendshapes. They also have their own custom limits and emulation that make people way more expressive. For example, your pupils get smaller when you open your eyes wide, and your pupils get bigger if you frown. If you stick your tongue out, your jaw opens extra so it doesn’t clip. There are tons of things like that built into those prefabs. Will it be possible to recreate that exact behavior using the new system without affecting avatar rank too much? I’m very particular about my identity and exactly how my face moves. :( It would suck so much if I had to change that just to use the new system in perf-limited instances.

Here’s a screenshot of the blendtree that handles limits and emulation.

7 Likes

Could you provide more detail about what you mean here, and what the specific use case is?

As far as the dampening effect’s strength set by the slider, that’s currently set once during upload and not dynamic. The dampening itself is dynamic though of course (the stronger the potentially overlapping viseme or face part is activated, the stronger the dampening type target is dampened)

1 Like

It’s not supported by us. Just because you can doesn’t mean you should! While the Steam Frame is a powerful device, the PC version of VRChat is a little too much for it, especially in a crowded instance. We don’t think it’s a good experience.

5 Likes

Can we get more human made art for update. Its kinda cute

8 Likes

I like this suggestion, I’ll bring it to the team. Thanks!

6 Likes

The Parameter Behaviors, Blendshapes Sets and the state behavior for modifying Blendshapes Sets weight are all intended to enable exactly those kinds of things without needing to do it all in the animator. Some things like bone rotations etc are still best suited for doing in the animator however.

The new system isn’t necessarily trying to keep you completely out of the animator, but just to provide other ways and lighten the load on the animator.

6 Likes

So isn’t because of “hardware limitations”, but because of you. People plays VRChat in potato PCs, and the game works. It doesn’t show an error like “because of hardware limitations, you can’t launch VRChat”.

People is already trying to launch the PC build, the problem right now is EAC. I’m waiting for them to fix it.

4 Likes

Initially I wanted all the visemes to have weights/floats because there would be scenarios where a hard integer may not be enough to blend in between states, as iirc there are phonemes that mix two or more visemes so having a viseme weight would’ve been ideal. But after rereading, it seems that having multiple meshes would resolve this, but my dampen/blending thing would be for more the animatable material aspects for custom float tree stuff.

Love all the new avatar features! About the new udon methods, I dont really see much use apart from some gimmicks. It will be waaaay more useful to add things like GetInstanceType and in the case of Group instance ability to get group name or id, would be super useful for public or collaborative maps to be able to switch decorations and representation depending on what group opens the instance. It could also help avoid showing more sensitive world content on Public instances. Hope to hear what you think on this one, I think there area already some canny posts about it ^-^

7 Likes