Developer Update - 23 October 2025

Welcome to the Developer Update for October 23, 2025.

Today’s featured world is the VRChat Home world by us!!!

Announcements

The Spookality Row is Up!

Spookality is our annual celebration of the dark, spooky, and ██████. This year, creators had a chance to submit avatars and worlds between September 22 and October 13. They did – a lot!

Yesterday, we announced the winners!

The avatar winners:

ARCON Experiment Tera by cubee_cb
AVTR_FORGOTTEN_FINAL․FBX by Katten?
Edgar by YemmieGoat
Zap by MayoCube
Signal Beast by DekaWolf
Happy Garry by Chá Math
VCR Repairman by Octuplex
PlayBack by Murdoll
Dr Whaddastein’s Maculate Investigator by Whaddageek
Lynarie by SilverCherry

…and the world winners:

Specter Spectare by Crazium
The 3rd Answer by Maki Maki
Dark Caves by Puppet~
[REDACTED] by Salena
Chiaroscuro by Katchy
Chrono Hollow by へむへむ
Madness Manor by Keako
Project T․U․B․E․S by Mr Mycelium
Outrun by Jordo
Phantom Boat by NoobPete

You can see the full winners announcement post here! Go check 'em all out – and don’t forget, the world/avatar rows contain a lot more than just the winners!

A Reminder to Upgrade to the Latest SDK!

Last week we reminded you about upgrading to the latest version of the SDK. We’re doing it again!

In about a week, we will start blocking new avatars from being uploaded by older SDKs. That means you need to update to our latest version, SDK 3.9.0!

You’ll be able to edit old avatars without issue – but if you try to upload a new one, it will be blocked. So get to updating!

2025.3.4 Released!

2025.3.4 brings with it a brand-new tab in VRChat: the Shop!

What can you find in the Shop? Stuff! What kind of stuff? Well, you’ll see!

In short: you’ll be able to buy all kinds of things in the Shop: that might mean Items, it might mean Emoji, it might mean Stickers, it also might mean crazier things like, say… Portals.

…it also brought CANDY QUEST!

Begin Your CANDY QUEST

Grab your FREE Candy Codex from the Shop! Alongside the Candy Codex, you’ll notice a bunch of new listings for Spookality! Two that might immediately jump out at you are Treats and Kath.

Treats and Kath are both Companions. Companions follow you around and can be interacted with in some way. In the case of Treats and Kath, they’ll give out candy to others… if they’re patient.

When you see a Treats or Kath in the wild, pull out your Candy Codex! Either Companion might signal that they want to give you a treat. When they do, give 'em a head pat, and you’ll be rewarded with a piece of candy. As a note, you can’t get candy from your own Companion – you’ve gotta get them from others!

Fill out your Candy Codex to unlock a special badge!

Or, to put it another way, you’ve gotta get out there and do a little trick-or-treating. Go visit your friends! Go check out a new world! Go find something spooky to attend via the Event Calendar!

You can read more here!

2025.4.1 is in Open Beta!

This release, currently in beta, brings a lot: Boops, the Live Now tab, signing into VRChat via Discord, Warp Effects, a new reporting flow, instance linking, and so much more.

Go read all of it here!

Sign into VRChat… with Discord!

We’ve released Login with Discord on Web for all users! When visiting the VRChat website, you can click Log in with Discord on the login page.

If you’ve never logged in with Discord before, VRChat will automatically look up your existing VRChat account using your Discord account’s verified email.

After performing the required security checks, you will have successfully linked your Discord account to your VRChat account!

If you’re logging in with Discord for the first time, and your verified Discord account’s email does not link to an existing VRChat account, you will be prompted to create a new Discord Linked VRChat account.

If you would like to link your Discord account to your VRChat account, but your Discord account’s email does not match your VRChat account’s email, you can head to the User Settings page of the VRChat website and link your Discord account from there. From this same page, you can also unlink your Discord account.

Logging in with Discord via the VRChat client is also currently available in Open Beta, head over there to try it out!

Steam Audio Experimentation

We’re experimenting with some changes to Steam Audio to make it behave more like human speech!

Users of Steam Audio may have noticed that other users’ voices are louder in front, quieter from behind. This is what’s called a ‘cardioid’ pattern - and Steam Audio supports using this on any sound source. Steam Audio also supports setting EQ bands on any audio source - so you can have audio sources that are more bassy or more tinny.

Unfortunately doing both at once isn’t supported on Steam Audio, presumably as it’s quite niche - but this is how human speech works! Bass frequencies are nearly omnidirectional, but high frequencies are almost entirely forward.


(Source for image!)

Fortunately as Steam Audio is open source, we’ve been able to make changes to support this change internally. Internal testing feedback currently ranges from “the actual effect of the cardioid three-band suppression seems overwhelmingly just obviously better” to “so far i cant tell any difference between the 3 band cardioid enabled or disabled”.

We’re hoping this makes crowded situations a bit more intelligible without the use of Earmuffs, as users facing away from you will be more muffled. The current experience is somewhat like if everyone in earshot was facing directly at you and talking at the same time. Give it a listen yourself though, see what you think!

Upstream Providers, and What the Recent AWS Outage Means for the Future of our Infrastructure

At VRChat, we (nowadays!) try to build infrastructure that doesn’t heavily rely on third-party SaaS or other types of service providers.

This wasn’t always the case. A couple years ago, it was common for VRChat infrastructure to be created using third-party providers because we didn’t have a dedicated DevOps team just yet.

We don’t want to throw any specific vendor under the bus, so often we call them “upstream providers” when something goes wrong.

These days, we aim for full control over the service stack we utilize over the simplicity and ease of use you get from using third-party providers. One reason for that shift is that the vast majority of outages at VRChat are caused by service failures at upstream providers.

In short, since we don’t have full control over these systems when stuff goes wrong, recovering from downtime can get complicated. We’re often at the mercy of the providers when things go wrong… and in computer science, things will go wrong.

One of these upstream providers is Amazon Web Services – or just AWS. AWS provides a set of wonderful and easy-to-use services and tools. For example, we continue to utilize the Amazon Simple Queue Service (SQS) due to its deep integration into some of our legacy service stacks.

We use SQS in combination with Valkey for cross-server communication, especially for long-running tasks that we don’t want our API endpoint servers to spend CPU cycles on. So, we kick those tasks over to dedicated worker nodes instead via AWS-powered communication channels.

When AWS suffered from a wide-spread outage earlier this week, VRChat was initially mostly unaffected.

We had one other upstream provider that we use for security related things also go offline at the same time due to this AWS outage, which prevented some users from logging in and joining instances. However, once you were already in, nothing stopped you from staying there and hanging out with your friends.

However, shortly after this, we started seeing errors relating to trying to write new messages to our SQS queues. That meant that some critical functions of our server-side application didn’t properly run their tasks anymore and instead gave up, throwing application errors back to users. This was less ideal for us because it meant user experience was below what we strive for, but it still didn’t prevent our users from interacting with unaffected API endpoints.

Fast forward to 2 hours and 30 minutes later, the upstream provider we use for security related things suddenly started to recover, users were trying to flock in again… but, our own application was still unhappy because SQS was still largely unavailable.

This meant that our own server-side application stack was now throwing a significantly higher amount of errors than normal. Eventually, these errors crossed a threshold that marked servers as “unhealthy.” Our load balancer attempted to replace these “unhealthy” application servers, but no new instances were able to get online because they never managed to satisfy the health check requirements to be considered in-service. Rinse and repeat.

Within minutes, our server-side application stack lost over half of its capacity with the remaining servers being put under more load because they were now responsible for serving more than double the amount of API requests than what they were sized for.

A few minutes later, our application stack emptied out – 0 healthy servers. We immediately began rolling out our cold start procedure in an attempt to get our application online again.

This cold start procedure consists of various steps, but the most critical ones are: blocking all user requests at the load balancer, scaling our application to twice the typical capacity, and then unblocking all requests.

We do it this way (rather than gradually ramping up traffic for a slow-start) because some of our users’ third-party applications end up flooding our application with instant retries rather than backing off properly.

By the way, if you create third-party applications that interact with our API and you’re not doing retries with proper backoffs, please fix it. Thanks!

Anyhow, our method allows us to “tank” the additional capacity up front until things stabilize, then we can scale back down after.

The problem here was that because several AWS internal control planes were acting up from this issue, we suddenly saw an extremely large portion of our compute capacity in our Auto Scaling Group disappear due to a scale-down request that reduced our capacity by 80% within seconds. Normally, this happens over a few hours.

This left us with no compute capacity to back our application instances with. Once we noticed what was happening, we tried scaling this Auto Scaling Group back up to 400% of what we needed (to give us headroom), but AWS wasn’t spinning up new compute instances for us. We were eventually left with just 3% compute capacity to serve our application traffic with.

This was obviously not enough. We proceeded to manually spin up and set up new instances, register them in the Scaling Group, allowing our application instances to finally start spinning up more capacity.

This task was very tedious due to several factors that impacted our ability to spin up compute instances, especially ones that came up healthy and not in a broken state. It took us about an hour to bring enough compute capacity online to barely serve our users with a severely degraded experience.

To get to this point, we had to take several systems offline, including the friends list and the avatars list endpoints. We also had to block certain regions from accessing our application to manage capacity. This is why while some users were able to log on, none were able to see their friends or avatars.

For the next few hours, we worked on manually bringing up more compute capacity to unblock all regions from accessing our application, eventually bring those remaining services (friends, avatars) back online as well. Eventually, everything returned to normal.

Within the last few years, we’ve migrated several services from third-party SaaS providers to in-house managed systems. We’ll continue to do so, allowing us to refine the configuration of such systems to fit our own needs. This will give us a lot more control, increasing our overall uptime, and reducing our mean time to recovery (MTTR).

As a short-term fix, we’re going to make our application more resilient to SQS interruptions, followed by a long-term solution to migrate from SQS to another in-house managed service.

Conclusion

That’s it for this Dev Update! See you November 6!

17 Likes

I always love those indept outage explaination. Thanks for posting those.

6 Likes

Guilty of that, we now have a manual restart in place after too many failed attempts so that we don’t immediately bombard the API once it comes back online.

Could be automated but with how chronically online I am it was easier to just add a restart button to our admin panel and to wait till stuff had recovered.

As usual thank you for the detailed breakdown to the poor soul that wrote this up!

4 Likes

If you are going to require users to do that, first fix the SDK issue that exists since 3.8.2 that randomly resets and/or locks properties of gameobjects when the SDK window is selected. Otherwise it’s really hard to justify using anything above 3.8.1.

Edit : For reference, here’s the link to the canny talking about it : SDK 3.8.2 affecting emissions of Poiyomi | Voters | VRChat

1 Like

LOVE the work being done to improve voice audio.

You should have included the new Steam trailer in this post.

2 Likes

const delay = 2 ** attempt * 1000;

It’s not that difficult!

2 Likes

But my funny big red restart button :frowning:

Edit.: we will implement proper handling but during testing phase the button is fun to have

Already have a fix for it, will ship in the next update :)

5 Likes

Perfect then, will finally being to upgrade once that SDK version ships. Just make sure to ship it before blocking uploads from previous versions please, otherwise thanks a lot ^^

1 Like

Ok, that kind of voice eq/vol manipulation based on relative position, YES PLEASE. I’m actually surprised Steam Audio doesn’t have that baked in as a 3D audio function?

Very interesting!

Although I have one suggestion regarding Steam audio, and that is that sometimes it’s better to disable it, because it ends up over processing the audio and making it slightly muddy.

This may be an issue with things like raves.

I don’t know if you guys are only doing all the HRTF stuff for voices, and not the world or whatever, but it would be nice if there’s a toggle for certain things.

But yeah, thanks for the explanation! And it’s quite nice as it is already, good job :+1:

3 Likes

Actually, that’s been up for a hot second! It’s a similar trailer to the one that’s on all other platforms. It’s just that someone realized it and started spreading the word.

Also: there’s one more thing I forgot to put in the Dev Update, but that’s okay… as it’s a bit of a surprise. Tomorrow, we’ll be announcing something on stream (2PM PST – though the announcement will happen around 3PM, probably). Twitch ;)

2 Likes

Oh, should have posted about it when it changed then. ; P Unless you did and i forgot. Ooh interesting nyan.

Love the video! But could you provide a video that swaps between the two systems (maybe make an animation that moves and rotates the audio source so that way the recordings will be identical) so we can directly compare the difference? I feel like that’s going to provide people with the best understanding of the difference :grin:

I would like to know if there are any more information regarding the discord account linking feature. Are there any additional plans to expand on this feature in the future?
(for example: accessible discord name of user from a world creators side, integration of discord as an in-game chat between users, …)
Cheers!

1 Like

As a techie, I love the in depth explanation.

As a user just trying to read a patch report, can you remember to get to the point and select your target audience appropriately? I don’t think the vast majority of that information was necessary to state: "AWS went down, it affected us, hopefully it won’t next time, sorry.”

Service stability is a major issue with the internet these days.

I have a server running a Discord bot, and also an API backend. There was a random IP routing issue, which caused the Discord bot to stay online (as it only connects to Discord servers), but the API backend couldn’t respond to the request, because the IP couldn’t be resolved. My bot ended up throwing random permission errors when users started interacting with it, due to it falling back to its default configuration.

It took me about an hour to get it back online, because I don’t have physical access to the server, only my friend does.

Also, little sidenote here, you should look into adding Discord’s activity proxy (*.discordsays.com) to the URL allowlist. I made a ticket with a better explanation if that hasn’t been seen already.

1 Like

Cardioid three-band suppression sounds like it could be a great addition, and I’m glad to see VRChat is attending to the subtler aspects of audio. :heart:

One aspect of audio that appears to be missing from Steam Audio is near-field rendering, which accounts for the changes in sound perception that occur when a sound source is closer than about one meter. While using the Steam Audio beta and conversing with a small group of people in a tight circle, I felt as though I was listening to them through a movie theatre speaker system. Their voices had no sense of closeness.

ONSP supports near-field rendering, and an overview of their approach is discussed in this article:

Given that Steam Audio is open source, I hope that VRChat could implement a solution to simulate near-field effects.

Someone has already posted about this issue on the Steam Audio Canny board, but without identifying it as ‘near-field rendering’.

This is a great writeup! Probably a little out of scope for us to implement ourselves, but I’ll certainly see what’s possible. Close interaction is important in social VR, after all.

SDK 3.9.0 has a troublesome bug that prevents new uploads.

In that Canny thread, there are comments by anatawa12 containing detailed information(reproduction steps and estimated causes, etc.).

Therefore, without fixing this bug and releasing an updated version, please do not block new uploads from SDK versions lower than 3.9.0!
Otherwise, it will cause confusion for users.

2 Likes