2
OSC Control
Aiden edited this page 2026-05-08 19:03:26 +10:00

OSC Control

OSC lets external tools control shader parameters without using the browser UI. The listener is local-only and binds to:

127.0.0.1:<oscPort>

By default:

127.0.0.1:9000

Set oscPort to 0 in config/runtime-host.json to disable OSC.

Address Format

Send messages to:

/VideoShaderToys/{LayerNameOrID}/{ParameterNameOrID}

Examples:

/VideoShaderToys/layer-1/brightness
/VideoShaderToys/vhs/wiggle
/VideoShaderToys/fisheye-reproject/panDegrees
/VideoShaderToys/video-transform/pan
/VideoShaderToys/text-overlay/titleText
/VideoShaderToys/trigger-ripple/drop

Layer Matching

The layer part can be:

Key Type Example
Internal layer ID layer-1
Shader package ID vhs
Shader display name VHS

Exact matches are tried first. If that fails, matching ignores spaces, underscores, hyphens, and casing.

If multiple layers use the same shader ID or name, OSC controls the first matching layer in the stack. Use the internal layer ID when you need to control a specific duplicate.

Parameter Matching

The parameter part can be a parameter ID from shader.json or the parameter label shown in the UI. The UI's OSC button is the safest way to copy the exact address.

Values

Supported OSC argument types:

OSC Type Meaning
f 32-bit float
d 64-bit float
i integer
s string
T / F boolean true / false

Single-argument messages become scalar values. Multi-argument messages become JSON arrays, which is how OSC drives vec2 and color parameters.

Examples:

/VideoShaderToys/fisheye-reproject/panDegrees 45.0
/VideoShaderToys/fisheye-reproject/fisheyeModel "equisolid"
/VideoShaderToys/video-transform/pan 0.25 -0.5
/VideoShaderToys/safe-area-guides/lineColor 1.0 0.8 0.1 1.0
/VideoShaderToys/text-overlay/titleText "LIVE"
/VideoShaderToys/trigger-ripple/drop 1

For trigger parameters, the value is treated as a pulse. A simple integer or boolean message is enough.

Values are validated through the same parameter path as the REST API. Invalid addresses or values are ignored and reported to native debug output.

Open Stage Control Examples

Simple scalar widget:

{
  "address": "/VideoShaderToys/fisheye-reproject/panDegrees",
  "target": "127.0.0.1:9000",
  "decimals": "2f"
}

XY pad controlling one vec2 parameter:

var x = Array.isArray(value) ? Number(value[0]) : 0;
var y = Array.isArray(value) ? Number(value[1]) : 0;
send(
  "127.0.0.1:9000",
  "/VideoShaderToys/video-transform/pan",
  {type: "f", value: x},
  {type: "f", value: y}
);

XY pad controlling two scalar parameters:

var pan = Array.isArray(value) ? Number(value[0]) : 0;
var tilt = Array.isArray(value) ? Number(value[1]) : 0;
send("127.0.0.1:9000", "/VideoShaderToys/fisheye-reproject/panDegrees", {type: "f", value: pan});
send("127.0.0.1:9000", "/VideoShaderToys/fisheye-reproject/tiltDegrees", {type: "f", value: tilt});