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.
// @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; }
Every feature in eo/script exists because a show control problem demanded it. No bloat. No abstractions for their own sake.
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.
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.
Scripts fire on cues, timecode hits, input events, or any trigger you define. Arm, disarm, or bypass per script. Priority ordering when triggers overlap.
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.
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.
Connect multiple consoles of the same or different types. A factory pattern creates proxy objects per connection. Your scripts orchestrate between them.
eo/script stays out of your way. Define your connections, write your logic, arm your triggers.
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.
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.
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
Scripts never touch the network directly.
They call methods on proxy objects and the engine handles the rest.
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.
eo/script is in active development. Request early access or read the file format spec.