VRChat OSC
VRChat OSC connects vrOS to VRChat over OSC. Send chatbox messages from a panel on your wrist, watch your avatar parameters change live, drive the in-game camera, and let VRChat find vrOS on its own.
It ships with vrOS and is pre-granted, like every first-party extension. See How extensions work for the consent model and how to revoke it.
It runs without VR. The chatbox works with SteamVR closed.
Discovery
Section titled “Discovery”vrOS advertises itself as an OSCQuery service over mDNS and serves a small OSCQuery tree describing what it listens for. VRChat finds it, reads the advertised port, and starts sending. You do not type a port anywhere.
That buys you two things:
- vrOS listens on a port the system assigns rather than a fixed one, so it cannot collide with VRChat’s own listener.
- vrOS knows whether VRChat is actually there. It probes the service it discovered and watches inbound traffic. A single missed probe never flips the state, but VRChat closing is detected rather than assumed away.
Advertising is on by default. Turn it off in the extension’s settings if you would rather point VRChat at vrOS yourself.
Settings
Section titled “Settings”| Setting | Default | What it is |
|---|---|---|
| Send target | 127.0.0.1:9000 |
Where vrOS sends OSC. VRChat’s default receive port. |
| Listen bind | 127.0.0.1:0 |
Where vrOS receives. Port 0 means the system picks, and OSCQuery advertises whatever it picked. |
| Advertise (OSCQuery/mDNS) | On | Announce over mDNS and answer OSCQuery requests. |
| Contact prefixes | Empty | Comma-separated parameter prefixes to surface as contact events. |
Chatbox
Section titled “Chatbox”The chatbox exists on two surfaces sharing one state: a spawnable overlay panel, and the CHAT page of the Dash tab. Type in either. Anchor the overlay panel to a wrist and it comes back to that wrist after a restart.
The panel has a text field, SEND, and three toggles:
- TYPING shows the in-game typing indicator while you type. It clears when you send, when you empty the field, and when focus leaves the panel.
- SOUND controls whether the message plays VRChat’s notification sound on arrival.
- LIVE sends partial text as you type, instead of only on SEND.
VRChat’s chatbox takes 144 characters. Longer text is cut at a character boundary and the panel says so.
Rate limiting
Section titled “Rate limiting”vrOS queues instead of flooding. A short burst goes straight out, then sends settle to a steady cadence. Discrete messages queue in order. In LIVE mode the newest partial replaces the pending one rather than stacking up, so what arrives is what you last typed.
If the queue overflows, the panel tells you. Dropped sends are counted and shown, never silent.
The Dash tab
Section titled “The Dash tab”Four pages, with a custom-send row on the footer of each.
| Page | What is on it |
|---|---|
| CHAT | The chatbox, sharing state with the overlay panel |
| PARAMS | Live avatar parameters as name, type, and current value, plus the loaded avatar |
| CAMERA | Mode, the capture actions, the documented toggles, and the sliders |
| TRACKERS | Tracker sends and their cadence toggle |
The custom-send row takes an address and a value, for anything the pages do not cover.
PARAMS is a live view, not a log. It updates while the page is on screen and stops pushing when it is not, though the extension keeps learning values either way, so the page is correct the moment you open it.
Camera mode runs 0 to 6: Off, Photo, Stream, Emoji, Multilayer, Print, Drone. The sliders (zoom, focal distance, aperture, hue, and the rest) clamp to VRChat’s documented ranges before anything goes on the wire.
What it sends and receives
Section titled “What it sends and receives”| Surface | Direction | Notes |
|---|---|---|
| Chatbox input and typing | Out | Rate limited, as above |
| Avatar parameters | In and out | String and multi-argument parameters included |
| Avatar change | In and out | Both the send and the notice that your avatar loaded |
/input/* |
Out | 9 axes as floats clamped to -1..1, 20 buttons as ints 0 or 1 |
/usercamera/* |
Out | Mode, actions, toggles, and sliders |
| Trackers 1-8 and head, position and rotation | Out | Steady cadence, and only while the feature is on |
| Contact and haptic parameters | In | The prefixes you configure arrive as events |
Inbound addresses that match nothing are counted rather than discarded quietly, so a typo in a prefix is visible instead of mysterious.
Eye tracking is deliberately not here
Section titled “Eye tracking is deliberately not here”This extension does not send eye tracking to VRChat. That is VRCFaceTracking’s job, and duplicating it would only fight it.
Where vrOS itself consumes gaze over OSC, that is a dedicated listener inside the vrOS compositor, deliberately not this extension. Raw gaze never crosses the extension API and never reaches the event bus. Extensions receive focus and confirm events, never a gaze stream, and even those need their own capability grant.
Also not here
Section titled “Also not here”VRChat’s web API, its websocket, log parsing, and avatar JSON are all out of scope for this extension by design. It does OSC machinery and nothing else. Keeping the two apart is what stopped the OSC code in vrOS 1 from growing a dependency on every VRChat feature that happened to sit next to it.
If VRChat is not seeing vrOS
Section titled “If VRChat is not seeing vrOS”- Check the extension’s status line. It says whether VRChat has been found.
- Confirm OSC is enabled in VRChat itself. vrOS cannot turn it on for you.
- If advertising is off, VRChat has no way to discover the port vrOS is listening on. Turn it back on, or set VRChat’s send port yourself.
More in Troubleshooting.