HelmOS REST and WebSocket API

NORTHSTAR SHOW SYSTEMS

HelmOS REST and WebSocket API

HTTP and WebSocket interface for the Helm orchestration server

v1.0 — May 2026

HelmOS REST and WebSocket API

HelmOS serves its API on port 3000 at 10.0.0.1. All REST endpoints are under /api. Cuemaster (the runtime dashboard) is served from the same origin. No authentication is required — network isolation on TrueNorth is the security model.

REST endpoints

MethodPathDescription
POST/api/configUpload a new nodes.json. Replaces the file on disk after Zod validation. Append ?dryRun=1 to validate without writing.
GET/api/stateFull state snapshot: show state, config, node statuses, running sequences, last 50 activity entries.
GET/api/nodes/:id/statusLive /status poll of a single Polaris node (proxied through HelmOS).
POST/api/trigger/channelFire a single channel. Body: {nodeId, ch}. Returns 423 if maintenance mode is active.
POST/api/trigger/groupFire all channels in a group. Body: {groupId}. Returns 423 during maintenance.
POST/api/trigger/sequenceStart a sequence. Body: {sequenceId}. Returns 423 during maintenance.
POST/api/sequence/:runId/abortAbort a running sequence by its runtime run ID.
POST/api/show/startTransition show state to RUNNING. Fires the boot sequence if one exists. Blocked during maintenance.
POST/api/show/stopTransition show state to STOPPED. Cancels all running sequences.
POST/api/show/resetTransition to RESETTING (5-second window), then STOPPED. Cancels all running sequences.
POST/api/maintenanceToggle maintenance mode. Body: {on: boolean}. No dashboard toggle exists — this is for Bridge and admin chord only.
POST/api/schedule/:id/toggleEnable/disable a schedule. Body: {enabled: boolean}. Writes to runtime-overrides.json.
GET/api/activityPaginated activity log. Query params: limit (default 50), offset (default 0).
GET/api/healthzLiveness check. Returns {"ok":true}.

HTTP status codes

CodeMeaning
200Success
400Validation error (bad body, invalid ID, malformed config)
404Node, group, sequence, or schedule not found
423Maintenance mode is active — triggers and show start are locked
500Internal server error

POST /api/config detail

This endpoint is used by Compose to upload show files. The full nodes.json body is sent as application/json. HelmOS validates the payload with Zod before writing:

  • All cross-references resolve (group channels point to real nodes, sequence steps point to real targets, schedule targets resolve).
  • No duplicate node IDs.
  • Interval schedules require intervalMinutes >= 1.
  • On success, the file is atomically replaced on disk and the in-memory config is reloaded.
  • With ?dryRun=1, validation runs but no file is written. Returns {"valid":true} or the validation errors.

WebSocket

A single WebSocket endpoint at /ws. Broadcast model — no subscription topics. Cuemaster auto-reconnects every 2 seconds on disconnect.

Message types

TypePayloadWhen
stateFull state snapshot (same as GET /api/state)On any show state change
activitySingle activity log entryOn every operator-relevant event
nodeNode status update (id, online, rssi, uptime)After each 5-second poll cycle
scheduleSchedule status changeOn schedule fire, enable/disable
sequence:startSequence run started (runId, sequenceId, name)When a sequence begins
sequence:endSequence run ended (runId, reason: complete|aborted|error)When a sequence finishes
bridgeBridge event (command name)On any Bridge serial command

All messages are JSON with a type field at the top level. Clients should ignore unknown type values for forward compatibility.

Mock mode

When HelmOS runs with --mock or HELMOS_MOCK=1, Polaris HTTP calls are stubbed (30–80 ms jitter, 5% random failure), no serial port is opened, and POST /__mock/bridge/:command synthesizes Bridge button events for UI testing.