Studio video
Recording, livestreaming, on-camera reading.
- ·Saved scenes per take
- ·Voice-call agent during recording
- ·Consistent color temp across sessions
Lights-Pi · v2.14.0
A headless QLC+ controller for the Raspberry Pi. Drive your DMX rig from any browser on the network — or hand the keys to Claude, ChatGPT, or any MCP-capable agent over the built-in Streamable HTTP endpoint.
Endpoint
Lights Pi exposes the entire control surface as a Model Context Protocol endpoint over Streamable HTTP. Wire Claude Desktop, ChatGPT, Cursor, or a custom agent into the rig with a single line of configuration. The LLM gets structured tool calls — your rig stays the single writer.
{
"mcpServers": {
"qlc-lights": { "url": "http://lights.local:5001/mcp" }
}
}Tools · 48
get_statuslist_fixturesget_fixture_channelslist_groupslist_sceneslist_templatesget_channel_valuesactivate_sceneapply_templateadjust_brightnessadjust_colorcolor_temperaturepalettestrobefadegenerate_sceneset_channelsave_scenesnapshot_sceneblackoutbatch_actionidentify_fixturecreate_groupdelete_groupupdate_groupadd_fixtures_to_groupremove_fixtures_from_groupdescribe_scenedelete_scenerename_sceneduplicate_scenelist_chasesdescribe_chasecreate_chasedelete_chasestart_chasestop_chaselist_cue_listsdescribe_cue_listget_active_cue_listscreate_cue_listupdate_cue_listdelete_cue_listgo_cue_liststop_cue_listtest_dmxget_logsget_system_infoLive transcript
No quotes. No avatars. Just the actual exchange between an LLM agent and a Lights Pi rig — natural language in, structured MCP tool calls out, DMX over the wire in milliseconds.
The agent here is Claude Desktop, but any MCP-capable client works the same way.
Group the three front pars as 'key-lights', then set them to 3200K tungsten.
Creating the group, then dialing the white balance.
→ batch_action([
create_group("key-lights", fixtures: [0, 3, 4]),
color_temperature(3200, groups: ["key-lights"])
])Set three-point lighting — tungsten key, daylight fill, magenta back.
Assigning the palette across all three groups in one call.
→ palette({
"key-lights": 3200,
"fill-lights": 5600,
"back-lights": "magenta"
})Save this as 'evening edit'.
Snapshotting current channel state.
→ snapshot_scene("evening edit")Build me a cue list for a 30-second intro: open on daylight, sunset transition at eight seconds, strobe accent at twenty-two, fade out at twenty-eight.
Building the show. Press GO when your audio rolls.
→ create_cue_list("Intro", cues: [
{ at: "0:00", scene: "Daylight" },
{ at: "0:08", chase: "Sunset" },
{ at: "0:22", action: "strobe", parameters: { rate: 8 } },
{ at: "0:24", action: "strobe", parameters: { rate: "off" } },
{ at: "0:28", action: "fade", parameters: { target: "0", duration: "2" } },
{ at: "0:30", action: "blackout" }
])GO.
Running.
→ go_cue_list("Intro")Use cases
04 contexts
Recording, livestreaming, on-camera reading.
Portrait, product, editorial.
Let an LLM drive the rig.
Cue-driven, audience-facing.
Program / Cue Sheet
The whole sheet below is one MCP call — create_cue_list with cues at absolute timestamps. Press go_cue_list and the rig fires every line on cue.
identify_fixture(fixture_id: 0)00 / 00 / 02create_group(name: "key-lights", fixtures: [0, 3, 4])—color_temperature(3200, groups: ["key-lights"])00 / 02 / 00palette({ key: 3200, fill: 5600, back: "magenta" })00 / 03 / 00activate_scene("Spotlight")00 / 01 / 50create_chase("Sunset", steps: [Daylight, Warm, Amber, Off])—start_chase("Sunset")loopsnapshot_scene("evening edit")00 / 00 / 18strobe(rate: 12, groups: ["back-lights"])00 / 00 / 30batch_action([strobe("off"), stop_chase("Sunset")])—blackout()00 / 00 / 00fade(target: "0", duration: "8")00 / 08 / 00Two ways to fly it
The rig you build
Setup · 10 minutes
Unlimited fixtures · open source · no subscription
Bring your own DMX rig
The rig you buy
Setup · Vendor onboarding
Locked to vendor · cloud-dependent · per-seat pricing
Pricing varies. Pricing always varies.
On GitHub
Stars
Forks
Watchers
Curtain call
A Pi, an ENTTEC, and ten minutes. The MCP server is included.
Free forever · MIT · No telemetry