DORAH

The lighting console you program by talking.

Describe the song. It patches the rig, builds the presets, writes the cues and the effects. Nothing hits the stage until you press GO.

388fixtures
70universes out
40Hzrefresh
5.7msper 25 ms tick
100%packets received
0interruptions

One stadium rig, extended test on site — no audience · summer 2026 · counted at the receiver

PLAYBACKstadium rig · test on site

sACN E1.31 · Art-Net · GDTF · MVR · NDI · SMPTE LTC

Four moves. That's the whole desk.

  1. 01

    You talk

    Plain language, or the command line if you prefer. Same engine underneath.

  2. 02

    It programs

    Patch, groups, presets, cuelists, effects, timecode — real show objects, not macros.

  3. 03

    You verify

    Every change lands on the tracking sheet in blind, before it exists on stage.

  4. 04

    You GO

    The stage moves on your finger. The AI writes everything and arms nothing.

Watch it program.

Three real exchanges on a loop. The lines are the exact commands DORAH runs — and the sheet below is what you check before GO.

✳ DORAH AI bridge connected · GM 100%
Operator Chorus: white strobe bump on the back trusses, and keep the amber floor from the verse.
DORAH AI Done — ✓ store cue 7 --name "CHORUS" --fade 0.5 — strobe bump on 46 spots, amber floor held. It's in blind: review it, then GO.

The numbers, in the open.

Forty times a second the console rebuilds every universe through the layer stack and puts it on the wire. Packets counted at the receiver, on a Mac mini M4. The same bench lives on the Network page — the numbers FOH watches.

RigUniversesCost per 25 ms tickReceptionBandwidth
Stadium rig — on site · 388 fixtures705.7 ms med · 7.4 P95 · 23%long run, zero interruptions
1,000 heads × 100 ch bench2001.32 ms · 5.3%100% · 40.3 Hz41 Mbit/s
4,000 fixtures × 40 ch bench3342.74 ms · 11.0%100% · 40.2 Hz69 Mbit/s
Output engine alone 8 workers4,0000.70 ms · 2.8%640k / 640k packets819 Mbit/s

Full pipeline rows: merge + 2 FX on every fixture + resolver + real sACN. Green row = the rig on site. scripts/bench-network.js · M4 · Node 24 · 2026-07-24. Ceiling ~7,700 universes per tick single-thread; past gigabit → 10GbE or session shard.

The wire
sACN E1.31 and Art-Net to the letter — identity, priority, sequence, clean end-of-stream, compliant ArtPoll/ArtPollReply. No ghost sources.
The stack every 25 ms
Playback → programmer, FX and pixel → guest sACN → house → Fixed Look → safety → resolve. Whoever is higher wins on those fixtures: a locked look cannot be moved by an effect.

Twenty-six views. One desk.

Six hubs, grouped the way a show is run. Every shot below is the real stadium showfile — 388 fixtures, nothing staged for the camera. Click any one to open it full size.

▶ Show ◧ Prog ∿ FX ⌗ Rig ◎ Guard ⚙ Sys

When it has to hold.

Two things carry the night: a look nothing can move, and a second machine ready to take the wire. Neither is a mode you hope is on — both say so on screen.

The look you lock

A Fixed Look doesn't live in a cuelist. It has its own bank: you bake it from the stage as it stands, from a cue or from the programmer, and it becomes absolute values on the fixtures you choose. Arm it and those fixtures leave the show — playback, programmer, effects, pixel, guest input and house lights all keep running, they just can't reach them.

It gets the last word
The lock is applied at the end of the tick, over everything upstream. Blind doesn't lift it, and a look carried inside a showfile never arms itself: at boot it is off.
Master-proof
It can ignore the Grand Master, so pulling the master down doesn't dim the locked light. Panic, freeze and evac leave it alone unless you decide otherwise.
Two presses to let go
The first off only arms the release, and it expires in five seconds. Same rule from the command line, a MIDI pad or the screen.
Not the AI's switch
The AI can build the look. It cannot arm it, release it or clear it — that stays a human hand.
GUARD ▸ FIXED LOOK384 fixtures baked

The desk that takes over

Stations find each other on the network by themselves — a beacon once a second — and form a session: one master, the others follow. A station that joins pulls the whole show, then rides it live, event by event, with the full volatile state twice a second: faders, selection, running effects, where each cue sits.

Takeover
Every station signs with its own sACN identity and the backup waits parked on priority. When the master goes quiet the backup takes the wire in 1.3 s — measured, mid-song.
Split the rig
Universes can be shared out across machines, and a command typed on any station is executed by the master — one show, several desks.
Shut by default
Without a shared secret the session network doesn't open at all: no server, no beacon. With it, every frame after the handshake travels signed.
One universe, one failure
The send loop is isolated per universe and per output: one that fails doesn't silence the others. A receiver left in silence freezes the last look after two and a half seconds — that is the gap being defended.
SYS ▸ NETWORKmaster · 70 universes · 2592 pkt/s

Private beta, ahead.

On macOS with Apple Silicon. The way to get on the list lands here shortly.