Skip to content

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.

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.

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.

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.

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.

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.

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.

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.

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.

  • 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.