How extensions work
An extension asks vrOS for the specific things it needs — audio output, its own panels, network access — and you grant or deny each one. vrOS starts it, supervises it, and restarts it if it falls over.
A third-party extension is a separate program: it runs on its own, talks to vrOS over a local socket, and cannot take vrOS with it when it crashes. The two extensions that ship with vrOS are bundled instead — supervised tasks inside the app, on the same API and the same discipline, isolated from a panic rather than by a process boundary. See Build an extension for what separates the two tiers.
This page is the user side. To build one, see Build an extension.
What ships
Section titled “What ships”| Extension | What it does | Status |
|---|---|---|
| VRChat OSC | Chatbox, avatar parameters, camera, trackers, OSCQuery discovery | In the v2.0.0 launch set |
| Soundboard | Pads with per-output routing and gain | In the v2.0.0 launch set |
| OBS control | Scene switching, stream and record state, any number of OBS instances | In the v2.0.0 launch set |
| Twitch chat | Chat on a panel | Being built; no release date yet |
v2.0.0 is the foundation done well, not parity with vrOS 1. Creator features return as extensions, one at a time. Release notes says what actually landed in the build you have.
The consent screen
Section titled “The consent screen”An extension asks the first time it launches, not when you install it. Until you decide, it stays stopped. It does not run, and it does not take a rail slot.
The screen lists every capability it requests, each with its own toggle and a plain-language line saying what that means in practice. Capabilities it did not request are listed too, marked as not requested, so you can see the whole shape of what it could ever ask for. Then: deny all, or allow selected.
If a later version wants something new, you are asked again for the difference only. What you already granted stays granted.
What a capability covers
Section titled “What a capability covers”| Capability | Granting it allows |
|---|---|
| Bus | Receive the vrOS events it listed, such as VR attached and detached. Its own events are always its own. |
| Overlays | Draw its own panels in your space. It cannot see or touch other overlays. |
| Capture | Ask for a capture overlay of a specific window. |
| Audio | Play through the vrOS audio engine and its output routing. |
| Secrets | Store a password or token in your OS credential store, under its own name. |
| OSC | Open OSC sockets. |
| Network | Talk to the network. |
Bus, Overlays, Capture, Audio, and Secrets are enforced by the host: when an extension asks the vrOS API for something it was not granted, the call is refused at the wire.
First-party extensions
Section titled “First-party extensions”VRChat OSC and the soundboard ship with vrOS. They are pre-granted, so you are not asked on first launch, but they are real extensions: same manifest, same capability chips, same revoke button in Settings. Turn one off and it stops.
They are also how the extension API stays honest: they are built on the same API a third party gets, with no private back door. If a first-party feature cannot be built on that API, the API is wrong.
Settings → Extensions
Section titled “Settings → Extensions”Every installed extension is listed with its author, version, and capability chips: granted, requested (still waiting on your decision), or neutral when the extension is disabled. A pending decision badges the category row and the Dash header, so it is findable from anywhere.
Per row you can review, which opens the full consent screen, enable or disable the extension, and revoke a capability you granted earlier. Revoking is the same switch you used to grant it. See Settings.
The rail slot
Section titled “The rail slot”An enabled extension with a Dash tab gets a slot on the rail: core tabs first (overlays, performance, playspace), then a divider, then extension slots in your order, with Settings pinned to the bottom. Core tabs and Settings never move.
Extensions get their rail tab in the desktop app too, by default. See The desktop app.
This release draws a placeholder outline glyph next to the extension’s short label. Custom extension icons are not in it.
Panels
Section titled “Panels”An extension can draw two kinds of panel: a tab inside the Dash, and a spawnable overlay panel you place in your space. Spawn overlay panels from the extension’s own Dash tab.
An overlay panel is a normal vrOS overlay. Anchor it to the world, your head, or either wrist, grab it, lock it, and it comes back where you left it after a restart. See Overlays.
When VR detaches, an extension’s panels hide and the extension keeps running. Its state is never torn down by putting the headset down. An extension marked to run without VR never learns whether SteamVR exists at all.
Commands and bindings
Section titled “Commands and bindings”Extensions register named commands, which you can trigger from their panels and from the Dash. To reach one from a controller, assign it to one of eight pre-declared actions in Settings → Extensions, then bind that action in SteamVR under Controller Bindings, the same as everything else vrOS exposes. Unassigned actions do nothing. vrOS does not invent gestures. See Input.
Installing a third-party extension
Section titled “Installing a third-party extension”Put the extension’s folder in:
- Windows:
%LOCALAPPDATA%\vrOS\extensions\<id>\ - Linux:
~/.local/share/vros/extensions/<id>/
A folder that is present is an installed extension. It is listed disabled, with the capabilities it requests shown as chips, until you enable it and walk the consent screen. Signed distribution through a store is a later milestone; this release is local folder installs.
When one misbehaves
Section titled “When one misbehaves”A crashed extension restarts on a backoff, according to the policy in its own manifest. Its stored data lives in vrOS, so a restart resumes rather than resets.
One that keeps crashing stops being restarted and lands at disabled, with the reason shown in the pane. An extension built against a protocol version vrOS no longer supports is listed the same way. Nothing is silently dropped from the list.
To stop one right now, disable it in Settings. See Troubleshooting if the problem outlives that.