OS reports an event
Win32 keyboard hook, Web MIDI, HTML5 Gamepad polling, or node-serialport on a chosen COM port. Capture mode is per-node, so two inputs can listen to different sources at the same time.
XOSC opens a UDP socket and turns whatever the operating system reports — a key on a USB keypad, MIDI Note 60 on channel 1, button 9 on a generic gamepad, the ASCII line "BTN1_DOWN\\n" coming out of an Arduino at 115 200 baud — into an OSC packet at 127.0.0.1:7000. Designed for Resolume; works for any OSC receiver.
A switching matrix of what gets captured today. Discrete triggers fire OSC packets one-shot; continuous values forward the raw payload as f.
✓ wired — fires now △ partial — value forwarded raw; mapping UI v0.2 — not applicable
One window, one listener per input class, one mapping graph, one UDP sender. No agents, no daemons, no service to install.
Win32 keyboard hook, Web MIDI, HTML5 Gamepad polling, or node-serialport on a chosen COM port. Capture mode is per-node, so two inputs can listen to different sources at the same time.
Every event becomes a stable signature (midi:noteOn:1:60, kbd:F13, serial:COM4:BTN1_DOWN). The graph router fans it to every wired output node.
Each output node owns its host:port. Pulse, Toggle, or Hold determines the arg payload. Multiple outputs fire in parallel — fan out to two Resolume machines, an Avolites desk, and a QLab cue stack at the same time.
Resolume tip: open Shortcuts → Edit OSC, click any control on the canvas. The address you need appears in the bottom-right of the Resolume window. Copy → paste into XOSC's output node. The whole binding takes 8 keystrokes.
Each one is a flat token map applied to :root. Click a swatch row — the entire site (and the in-app demo) repaints without a reload.