A simple theatrical lighting console I've been building for my school and my community theatre group. I wanted something small, fast, and easy enough that students and amateur operators could pick it up easily, but also useful enough that I could run my own shows. It's a hobby project. The scope is deliberately narrow: small venues, simple shows, and a user-friendly interface.
- Combined Lighting & Audio cue list with simple navigation, timing and auto-follows
- Record & update cues from current channel state
- EOS-style command line (
1 Thru 10 At 50) and mouse-friendly adjustments - Fixture patching with parameter-based control (color pickers, intensity sliders)
- Channel grid, fixture list and magic sheet for live control
- Effects: sine/square/sawtooth/random waveforms on intensity, hue, saturation, or pan/tilt — with phase spread for chases, cue-triggered with fade in/out
- Remote control: run the console from any phone or tablet browser on the venue wifi — no app install. Cue playback, fixture/color control, raw channel grid, patching, and the command line, all live-synced
- Script viewer: load a PDF of your show script, drop cue markers on it, and click them during the show to fire cues — selection is synced with the Cue list
- Save and load show files (JSON, human-readable)
- USB DMX output (Enttec USB Pro, Enttec Open DMX USB, and generic FTDI-based Open DMX clones e.g. DSD TECH USB-to-DMX512)
- Check for updates (Help menu, plus a quiet once-a-day background check) — notify-only, links to the GitHub release page
- Pallettes or presets
- Video playback — planned, not started
- Support more than 1 universe
- Moving light features (can do basic pan/tilt, and other straight DMX channels, but that's it)
- Just visit the releases page to download an executable for Windows, Mac or Linux. (note: Windows drivers for ENTTEC DMXUSB Pro will need to be downloaded from the source
You'll need Rust. The default build has no media dependencies:
cargo build --release
cargo run --releaseWith audio support (requires ALSA on Linux):
cargo run --release --features audioWith everything:
# Linux: needs libudev-dev, libasound2-dev (video support also needs GStreamer)
cargo build --release --features fullFor the default build (USB + audio):
sudo apt-get install build-essential pkg-config libx11-dev libxi-dev \
libxcursor-dev libxrandr-dev libxinerama-dev libgl1-mesa-dev \
libudev-dev libasound2-devFor video (when that's eventually working):
sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-devOn Linux, you'll also need to be in the dialout group for USB DMX:
sudo usermod -a -G dialout $USEROpen DMX USB support on Linux also depends on getting exclusive access to the FTDI serial port. If another service probes the adapter at startup, wait a moment and reconnect, or disable that service.
Cheap FTDI-chip "USB to DMX512" cables (e.g. DSD TECH's) have no onboard microcontroller — same as the genuine Enttec Open DMX USB — so pick Enttec Open DMX USB in Settings, not Enttec USB Pro (which expects Enttec's framed protocol and firmware). Select the device's serial port from the dropdown; it'll show up even if its product string doesn't say "Enttec" since any USB-serial port is listed.
| Key | Action |
|---|---|
| Space | GO (fire next cue) |
| Shift+Space | BACK (fire previous cue) |
| S | STOP |
| Escape | Pause — freeze lighting in place, fade out audio |
| ↑ / ↓ | Move selection and set on-deck cue (cue list) |
| Ctrl+G | Open goto prompt — type a number then Enter to fire |
| Ctrl+R | Record cue |
| Ctrl+S | Save show |
| Ctrl+O | Open show |
| Command | Action |
|---|---|
go12 / goto12 |
Go to and fire cue 12 |
q12 |
Arm cue 12 as on-deck without firing it |
g1 |
Select group 1 (existing group command, unchanged) |
EOS-style command syntax. Type directly — no need to click a text field first.
4a50 → Channel 4 at 50%
1thru10a75 → Channels 1-10 at 75%
1t10a75 → Same (t is shorthand for thru)
1-10a75 → Same (hyphen works too)
1+3+5afull → Channels 1, 3, 5 at 100%
4aout → Channel 4 to 0%
a50 → Set currently selected channels to 50%
4a255 → Channel 4 at raw DMX 255
Click channels to build a selection, then type just the level (a50 then Enter). Shift+click adds a range; Ctrl+click toggles individual channels. The command line always reflects your current selection.
The command line is context-aware: lighting commands activate when the Channels or Lighting Cues panel is focused.
Put audio files in the media/ directory next to your project. Show files reference them by filename only (song.mp3 rather than a full path), so shows stay portable across machines. Absolute paths still work.
EasyCue3 can route each audio cue to any combination of output devices (speakers, a USB interface, etc.) independently, with its own volume/pan per route, and crossfade between them with an Adjust cue — useful for multi-room or multi-speaker setups.
Multi-channel interfaces are supported natively: each stereo pair of the device (e.g. a Rubix24's front and rear output pairs) shows up as its own entry in the output dropdown — "Rubix24 · Out 1-2", "Rubix24 · Out 3-4" — and cues can play on or crossfade between pairs just like between separate devices. If you only ever use the default device, none of this appears; the dropdown stays as simple as before.
On Linux, secondary devices need a small one-time ~/.asoundrc setup (PipeWire doesn't expose them to ALSA apps by default, and multi-channel devices need their channel count pinned). See docs/AUDIO_DEVICES.md for the setup steps and known limitations (no hot-plug; Windows/macOS need no setup).
13 fixture profiles ship with the app: dimmer, RGB/RGBA/RGBW/RGBAW/RGBAWUV variants, LED PAR, and moving head. Add your own in fixture_profiles/ (bundled) or ~/.config//fixture_profiles/ (user, survives updates).
{
"id": "my_fixture",
"manufacturer": "MyBrand",
"name": "Custom RGB",
"channel_count": 3,
"parameters": [
{ "parameter": "Red", "channel_offset": 1 },
{ "parameter": "Green", "channel_offset": 2 },
{ "parameter": "Blue", "channel_offset": 3 }
]
}Restart EasyCue and the profile appears in the Patching panel dropdown. See fixture_profiles/rgb.json for a working example.
Control the console from a phone or tablet on the same wifi network — no app to install, no App Store. Enable it in Settings → Remote Control..., then scan the QR code or open the shown IP address in the phone's browser. For the full-screen app-like experience, use the browser's "Add to Home Screen" option.
- Cue playback: GO / BACK / STOP, double-tap a cue to jump to it, grand master, blackout
- Fixture control: intensity, color picker, and profile-driven parameter sliders
- Raw channel grid across all active universes
- Patching: add, edit, renumber, re-address, and remove fixtures
- Command line, mirroring the desktop's EOS-style syntax
An optional PIN can be set to stop other people on the venue wifi from connecting. This is a LAN-only feature — there's no internet/remote-WAN access.
Run a show straight off your PDF script instead of (or alongside) the cue list. Open View → Script Viewer, load the show's script, and click anywhere to drop a marker linked to a cue — the marker sits on the exact line you want the cue to land.
- Two-way sync with the Cue list: clicking a marker selects its cue everywhere (Cue list, Cue Properties); selecting a cue from the list or keyboard (row click, context menu, or ↑/↓ arrows) highlights the matching marker and brings it into view if it isn't already on screen.
- Click to fire: in playback the markers are read-only — click one to fire its cue exactly as if you'd hit it from the cue list.
- Navigate with
←/→orPageUp/PageDown; scroll to zoom, drag to pan. Zooming in re-rasterizes the page at display resolution so text stays sharp. - Markers persist in the show file, and the PDF is referenced by filename via the
media/directory (same portable convention as audio cues).
The script feature needs a PDFium library, which is bundled in a lib/ subdirectory of every download — nothing to install separately.
An operator-safe mode for running the show. Toggle it from View → Show Mode: the workspace swaps to a minimal two-panel layout (Cue list + Script Viewer), the Cue list shrinks to big GO / BACK / STOP buttons with read-only labels, and the Script Viewer is locked to Playback mode. Only transport operations remain — GO, BACK, STOP, goto, cue-list scrolling and script page-turning. Design and Show layouts save independently, so switching back restores your full workspace. See docs/SHOW_MODE.md.
JSON format, lives in shows/. Human-readable and git-friendly — you can diff them between rehearsals.
This is a hobby project I've built and tested at my local theatre group and school. I've put genuine care into making it reliable, but I can't guarantee it'll work flawlessly in production. If you do use it, I'd really appreciate hearing about any issues you run into — bugs and feedback help me make it better. But please test thoroughly before relying on it for a show.
EasyCue is built on top of excellent open source projects. Thank you to all maintainers and contributors.
- Rust - Systems language used for the application.
- egui - Immediate mode GUI framework.
- eframe - Native app framework for egui.
- egui_dock - Dockable/tabbed panel layout.
- egui_extras - Extra widgets such as table support.
- egui-phosphor - Phosphor icon integration for egui.
- rodio - Audio playback (feature-gated).
- lumina-video - Video playback backend (feature-gated).
- serialport-rs - USB serial communication for DMX interfaces (feature-gated).
- artnet_protocol - Art-Net packet structures and protocol support.
- serde - Serialization framework.
- serde_json - JSON read/write support.
- tokio - Async runtime.
- rfd - Native file dialogs.
- image - PNG/image loading.
- dirs - Cross-platform user config/data directory resolution.
- axum - Web server framework for the embedded remote-control server (feature-gated).
- futures-util - Async stream/sink utilities for the WebSocket bridge.
- qrcode - QR code generation for the pairing dialog.
- Framework7 - Mobile UI framework powering the phone/browser client (vendored, MIT licensed).
- anyhow - Application-level error handling.
- thiserror - Custom error types.
- log - Logging facade.
- env_logger - Logger implementation for development/runtime logs.
- chrono - Date/time utilities.
For a complete, reproducible dependency graph (including transitive crates), see Cargo.lock.
GPL-3.0-or-later
