Web remote & boards
Open http://<machine>:8090/remote from any phone, tablet or laptop on the studio LAN (type
the http:// explicitly; there is no page at the bare root). The page is served from the
plugin’s Resources/WebRemote.html on every request - hot-editable, no recompile.
Boards & modules
A board is a tab; a module is a card on its 4-column canvas (width 1-4). Modules
hold exactly the position you give them (accepted Aug 2026): empty space persists - deleting
or shrinking a card leaves its cells free right where they were - and nothing ever moves
unless you move it. Tablets and phones instead stack the modules in reading order (canvas
editing is a desktop-width concept), and module internals restack for touch by card width - a
full-width card never overflows a small display. The default Studio board is synthesized -
your first edit materializes it, and deleting it restores stock. Module library (16): Health ·
Audio mixer · Scenes · Presets 1-16 · Cameras + Go Live · Camera moves (ARM A/B) · Transport
(incl. BOUNCE, lit from a live director-state read) · Record · SDI output · Timing &
speed · Show triggers (Blueprint) · TV / screen router · Cut banks (per-screen 6-slot
banks with poster thumbnails and an amber on-air ring - a tap fires <Screen>.Cut.N, OFF is
guarded) · Quick media shelf · Custom controls · Section label.
Editing happens on the page itself (reworked and accepted Aug 2026): ✎ Edit → add tabs and modules. Drag a module by its title (a ✥ move icon appears on hover; press-and-drag the title on touch): dropped on another card the two swap; dropped on empty space the card moves there - and a region narrower than the card still accepts it, shrinking the card to the free span (the green preview shows the landing footprint). Drag a card’s bottom-right ◢ to resize - it snaps live from 1 column up to the grid edge or the next occupied cell; neighbors never move. Dashed ghost cells mark every free cell: tap one to insert a module right there, or drag the ghost’s own ◢ first to pre-widen the slot - the new module lands at that width. Inserting opens the module gallery - every module with a mini-mockup and a one-line description, in a dialog that scales to the screen (no scrollbar on big monitors, a vertical stack on phones). The − on every module header minimizes it to just the header while keeping its cell - available outside edit mode too as show-time cleanup, persisted with the board. ⧉ Duplicate deep-copies the current board as “<Name> 2”. ✎ on a card renames it, 🗑 removes it (its space stays open) → SAVE BOARDS. Boards persist project-side and travel in show files. Long-press any trigger button to copy its Stream Deck URL.
Typed controls
New in Aug 2026, the custom-controls module speaks the full bus type family: text,
integer, vector (X/Y/Z) and color controls sit alongside trigger/toggle/slider. A
text control targeting LowerThird.Headline writes the exact value a Blueprint reads with
Get VSK Text - from a phone. Values persist on the bus and travel in .vskshow; text fields
commit on Enter/blur and the state poll never overwrites a field you are typing in; colors
stay sRGB-consistent between the browser picker and Blueprints. Transformation channels stay
in the editor’s VSK Control panel by design.
Audio module
Per-strip fader · MUTE · SOLO · AFV · gain · delay, plus (Aug 2026) the Ch channel-routing select (Stereo / L→both / R→both / Mono sum - spread a mono camera mic to both ears) and split L/R meters on every strip and the master. The meters show the final post-DSP level from the same peak source as the editor mixer - phone and panel always agree.
Camera moves module
ARM A · ARM B · OFF · GO LIVE. The ARM buttons are lit from a live read of the director’s armed state, not a click echo - a Blueprint-side disarm (PLAY, preset switch, scene recall) unlights the web within a poll tick, and every device shows the same truth.
Guarded buttons
Destructive controls are two-tap (Aug 2026): the first tap arms the button - red, pulsing, TAP TO CONFIRM - and the second tap within 3 s fires; tapping anywhere else (or waiting) disarms silently, and only one button can be armed page-wide. Guarded by default: REC ■ (only while actually recording), OUT ■ (only while the output is live), camera-moves OFF and screen-off triggers. Custom trigger/toggle controls have a per-control Guard checkbox in edit mode, saved with the board.
Latency & connection loss
Commands land in ≈25 ms (one LAN POST + a frame); indicators poll at 4 Hz, audio meters at 10 Hz. If 2 consecutive state polls fail (≈½ s - a dropped Wi-Fi link, a closed editor), a fullscreen CONNECTION LOST - controls disabled overlay blocks all input and counts the seconds since last contact; the first successful poll clears it instantly. Audio meters zero while the link is down, so frozen bars never masquerade as live signal.
HTTP API
Everything the page does is plain HTTP on the same port - usable from Bitfocus Companion, scripts, or anything that can POST:
| Route | Method | Does |
|---|---|---|
/remote | GET | The control-board page |
/api/state | GET | Full UI state JSON (tally, presets, scenes, TVs, NDI list, typed values, armed state, cut banks, bounce…) |
/api/trigger?name=Cam.2 | POST | Fire any bus trigger |
/api/logical?name=X&v=1 · /api/scalar?name=X&v=0.5 | POST | Set bus values |
/api/text?name=X&v=… · /api/integer?name=X&v=… · /api/vector?name=X&x=&y=&z= · /api/color?name=X&v=RRGGBB | POST | Set typed bus values (Aug 2026) |
/api/tv?name=Wall&source=SDI:2 | POST | Route a screen (optional &fade=) |
/api/boards | GET / POST | Read / save board layouts |
/api/audio/levels | GET | Live meter levels - final post-DSP [L, R] pairs per strip + master |
/api/audio?src=Cam1&volume=…&ch=… · /api/audio/add?device=… · /api/audio/remove?src=… | POST | Mixer control (incl. ch= channel routing) |
/api/upload?name=x.png | POST | Upload media to the Quick Media shelf |
/media/thumb?name=clip.mp4 | GET | Poster thumbnail for a shelf media file (path-sanitized; feeds the Cut banks module) |
Content-Length is present (curl -X POST -d "x" "http://host:8090/api/trigger?name=Play").