Entertainment Object Scripting

Write logic between
your consoles.

eo/script is a scripting engine that bridges lighting consoles, audio systems, and show control hardware through a single programmable layer. Write custom logic in JavaScript. Connect to Eos, MA, and anything that speaks OSC.

crossFadeHouseLights.js
// @eos-trigger: cue 5.3
// @eos-state: armed
// @eos-group: lighting
/**
 * @param {object} MainEos - Primary console connection
 * @param {object} BackupEos - Backup console connection
 * @returns {boolean}
 */
function crossFadeHouseLights(MainEos, BackupEos) {
    var cue = MainEos.Live();
    var level = MainEos.intensity;

    MainEos.Fade("house", 0, 3.0);
    BackupEos.Fade("house", 0, 3.0);

    MainEos.Log("House faded from " + level + " on cue " + cue);
    return true;
}

Built for programmers who run shows.

Every feature in eo/script exists because a show control problem demanded it. No bloat. No abstractions for their own sake.

{ }

Plain JavaScript

Scripts are standard ECMAScript 5 files. Edit them in the eo/script IDE, VS Code, or any text editor. JSDoc-compatible. Lintable. No proprietary language to learn.

OSC

Console Connections

Create named connections to any console or device that speaks OSC. Each connection becomes a proxy object in your scripts with methods and properties bound to native callbacks.

Trigger Engine

Scripts fire on cues, timecode hits, input events, or any trigger you define. Arm, disarm, or bypass per script. Priority ordering when triggers overlap.

Integrated Linting

JSHint runs in-engine against your code with full awareness of your project's connections and globals. Catch typos and undefined references before they hit a live show.

IDE

Visual Script Editor

The IDE manages the boilerplate. You see your logic, not the file format. Trigger state, parameters, and return types are GUI controls. The file on disk stays valid JS.

Multi-Console

Connect multiple consoles of the same or different types. A factory pattern creates proxy objects per connection. Your scripts orchestrate between them.

Three things. That's it.

eo/script stays out of your way. Define your connections, write your logic, arm your triggers.

Define connections

Point eo/script at your devices.
Each connection gets a name you choose and becomes a globally scoped object in your scripts. MainEos, BackupEos, AudioDSP — whatever makes sense to you.

Write scripts

Each script is a single JavaScript function in its own file.
Use the built-in IDE or your editor of choice.
Call methods on your connections, read properties, write logic.
Standard JS.

Arm and run

Assign triggers and arm your scripts. eo/script watches for events and fires the right function at the right time.
Boolean returns confirm execution.
Logs capture everything.

Connections

ETC Eos grandMA Hog 4 Generic OSC QLab

Clean separation. No magic.

Scripts never touch the network directly.
They call methods on proxy objects and the engine handles the rest.

Proxy objects, native bindings

When you call MainEos.Fade("house", 0, 3.0), the proxy object routes through a native callback into the engine's connection layer. Your script stays clean. The transport is handled.

Properties with getters and setters work the same way. Reading MainEos.intensity fires a native callback that queries the console in real time.

Script Layer
DetectPresetChange.js
    ↓ calls
Proxy Layer
Eos.Macro(801);
    ↓ fires
eo/script OSC Binding
/eos/macro/801/fire

Ship logic, not workarounds.

eo/script is in active development. Request early access or read the file format spec.