Software

HelmOS

The Node.js service that turns a Helm PC into a show controller. State machine, scheduler, REST + WebSocket API, Bridge driver, Cuemaster host. Hot-reloads nodes.json without restarting.

Node.js 20 LTS REST + WebSocket Port 3000 NSSM Service
Download Runtime Read the Docs
[helmos] starting helmos 1.0.0
[helmos.config] loaded nodes.json — 12 nodes, 64 channels
[helmos.bridge] opened serial COM3 @ 115200
[helmos.bridge] handshake — HELLO:BRIDGE:1.0.0
[helmos.health] all 12 nodes online
[helmos.api] listening 0.0.0.0:3000
[helmos.show] state: IDLE
[helmos.bridge] BTN:START
[helmos.show] IDLE → RUNNING
[helmos.sequence] firing "intro" — 14 steps
[helmos.trigger] fired node=001 ch=1 latencyMs=23
[helmos.trigger] fired node=001 ch=2 latencyMs=21
[helmos.trigger] fired node=002 ch=1 latencyMs=27
What it does

The Brain Between Buttons and Effects.

HelmOS sits in the middle: Bridge buttons come in over USB serial, Polaris nodes go out over HTTP, Cuemaster connects over WebSocket, and a single nodes.json defines the whole show. Every Northstar venue runs the same runtime.

Show State Machine

IDLE → RUNNING → STOPPED. RESET returns to IDLE from any state. MAINT and ERROR are first-class states. Transitions broadcast over WebSocket.

Three-Mode Scheduler

Cron for time-of-day, interval for repeating, manual for on-demand. Respects venue timezone. Skips when maintenance key is engaged.

Sequence Engine

Absolute-timing steps. Parallel fan-out. Group expansion. Loop support. Sub-millisecond dispatch precision.

Node Health Polling

5-second health check cycle. Tracks ONLINE / SLOW / OFFLINE per node. RSSI reported per check. Status transitions emit WebSocket events.

Hot Config Reload

POST /api/config with a new nodes.json. Schema validates. In-flight sequences finish. New config applies. Zero downtime.

Runtime Overrides

Adjust cooldowns, schedules, IPs at runtime. Persisted to runtime-overrides.json. Survive restart. Cleared explicitly or via Cuemaster.

The API surface

Twelve REST Endpoints. One WebSocket. That's the Whole Surface.

HelmOS exposes a small, documented JSON API that anything can drive. Cuemaster uses it. Compose can write to it. Third-party systems (LX consoles, ticketing kiosks, motion control) use it to integrate.

GET /api/statusSystem summary: show state, node count, bridge, version
GET /api/nodesEvery node with live status, RSSI, uptime
GET /api/triggerFire one channel on one node
POST /api/show/startBegin show — runs bootSequence, transitions to RUNNING
POST /api/show/stopHalt show, transition to STOPPED
POST /api/show/resetReturn to IDLE, clear stuck channels
GET /api/configReturn currently loaded nodes.json
POST /api/configUpload and hot-reload nodes.json (with ?dryRun=true)
GET / POST / DELETE /api/overridesList, set, clear runtime overrides
GET /api/scheduleSchedule list with next-fire times
POST /api/schedule/fireForce-fire a schedule immediately
GET /api/logsTail log lines by level / time / count
WS /wsLive event stream: show:state, trigger:fired, node:status, error
Production runtime

Runs as a Windows Service. Restarts Itself.

HelmOS is registered with NSSM as a Windows service. It auto-starts at boot before any user is logged in. If the Node.js process crashes, NSSM restarts it within 2 seconds. If it crashes repeatedly, NSSM throttles to prevent a tight loop.

Stdout and stderr are captured to rotating log files. The application logger writes a separate helmos.log with structured messages, and an append-only triggers.log records every effect fire for forensic reconstruction after an incident.

  • NSSM service named HelmOS, auto-start, auto-restart
  • Working dir: C:\ProgramData\Northstar\helmos
  • Logs at 10 MB rotation, 5 generations retained
  • Environment-variable configurable: log level, bridge port, node timeout, health interval
  • Server Reset (Bridge D7, 3 s hold) restarts the service from outside the OS
         ┌──────────────────────┐
         │    BRIDGE (USB)      │
         └──────────┬───────────┘
                    │  serial
                    ▼
        ┌───────────────────────┐
        │       HelmOS          │
        │  ┌──────┐ ┌────────┐  │
        │  │state │ │schedule│  │
        │  └──┬───┘ └───┬────┘  │
        │     │         │       │
        │  ┌──▼─────────▼────┐  │
        │  │ sequence engine │  │
        │  └────┬────────┬───┘  │
        └───────┼────────┼──────┘
       HTTP    │        │   WebSocket
                ▼        ▼
        ┌──────────┐ ┌─────────┐
        │ POLARIS  │ │ Cuemstr │
        └──────────┘ └─────────┘
Operations

Designed to Recover Without a Tech.

Crash Auto-Restart

NSSM brings HelmOS back within 5 seconds of any unexpected exit. Show state is reconstructed from nodes.json + overrides.

Network Resilient

Per-trigger HTTP timeout 1.5 s. Failed triggers do not halt the show. Cuemaster shows a slow-node warning instead of an outage.

Bridge Auto-Reconnect

USB disconnect during show? Show keeps running. HelmOS retries every 2 s. When Bridge replugs, LED state restores within 10 s.

Forensic Trigger Log

Every trigger is appended to triggers.log with timestamp, node, channel, source, latency. Hours of post-incident clarity.

Try HelmOS in mock mode.

Download the runtime, set HELMOS_MOCK=true, and run a full Northstar stack on your laptop without any hardware. Five minutes to a working Cuemaster dashboard.