Table of Contents
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});