nodes.json Schema Reference

NORTHSTAR SHOW SYSTEMS

nodes.json Schema Reference

Complete field-level schema for the show configuration file

v1.0 — May 2026

nodes.json Schema Reference

The nodes.json file defines the entire show: buildings, nodes, channels, groups, sequences, and schedules. It is authored in Compose (the show designer app), uploaded to HelmOS via POST /api/config, and stored at C:\ProgramData\Helm\nodes.json in production. HelmOS never writes to this file directly except through the validated upload endpoint.

Top-level structure

SectionTypeDescription
projectObjectShow metadata: name, description, modifiedAt (ISO-8601)
networkObjectNetwork config: ssid, subnet, nucIp, dashboardPort
buildings[]ArrayLogical groupings of nodes (rooms, zones, floors)
nodes[]ArrayIndividual Polaris field nodes with channel configs
groups[]ArrayNamed collections of channels across nodes
sequences[]ArrayOrdered step lists with absolute timing
schedules[]ArrayTime-based automation rules

buildings

FieldTypeDescription
idStringUnique identifier
nameStringDisplay name
descriptionStringOptional description
colorStringHex color (#RRGGBB) used as the building’s band color in Cuemaster
ipRangeStartStringStarting IP for nodes in this building (informational)

nodes

FieldTypeDescription
idStringUnique identifier (duplicates rejected)
nameStringDisplay name
ipStringStatic or DHCP IP address on TrueNorth
typeEnumaudio | video | gpio | mixed
buildingStringBuilding name (must match a buildings[].name)
zoneStringSub-location within building
descriptionStringOptional description
channels[]ArrayChannel definitions (see below)

channels

FieldTypeDescription
chIntegerChannel number (1-based)
pinIntegerPhysical GPIO pin on the Polaris node
typeInteger0 = active LOW, 1 = active HIGH
deviceTypeEnumPEMENOL | NEUMI | GPIO | Relay
nameStringHuman-readable channel name
modeEnumpulse | latch | timed
pulseMsIntegerDuration for pulse mode (milliseconds)
cooldownMsIntegerMinimum time between triggers (milliseconds)
enabledBooleanWhether this channel is active

groups

FieldTypeDescription
idStringUnique identifier
nameStringDisplay name
descriptionStringOptional description
channels[]ArrayArray of {nodeId, ch} references. Each must resolve to a real node and channel.

sequences

FieldTypeDescription
idStringUnique identifier
nameStringDisplay name. A sequence named exactly "boot" is auto-fired on SHOW_START.
descriptionStringOptional description
loopCountInteger0 = infinite loop, otherwise exact repeat count
steps[]ArrayOrdered list of timed actions (see below)

steps

FieldTypeDescription
idStringUnique identifier within the sequence
targetTypeEnumchannel | group
nodeIdStringTarget node ID (when targetType = channel)
chIntegerTarget channel (when targetType = channel)
groupIdStringTarget group ID (when targetType = group)
delayMsIntegerABSOLUTE delay from sequence start (not relative to previous step)
actionEnumtrigger | latchOn | latchOff
durationOverrideIntegerOptional override for pulse duration (milliseconds)

Important:delayMs is absolute from sequence start, not relative to the previous step. A step with delayMs: 5000 fires 5 seconds after the sequence begins regardless of when earlier steps fired.

Important:Group steps fan out in parallel — one HTTP call per member channel, not serialized.

schedules

FieldTypeDescription
idStringUnique identifier
nameStringDisplay name
descriptionStringOptional description
enabledBooleanWhether this schedule is active (can be overridden at runtime)
targetTypeEnumchannel | group | sequence
nodeIdStringTarget node (when targetType = channel)
chIntegerTarget channel (when targetType = channel)
groupIdStringTarget group (when targetType = group)
sequenceIdStringTarget sequence (when targetType = sequence)
triggerModeEnuminterval | specificTimes | daily
intervalMinutesIntegerFiring interval (interval mode only, must be >= 1)
specificTimes[]ArrayArray of "HH:MM" strings in 24-hour format (specificTimes mode)
activeStartStringWindow start "HH:MM" (interval and daily modes)
activeEndStringWindow end "HH:MM" (interval mode only)
activeDaysArray[7]Boolean array, Monday-based: [0]=Mon, [1]=Tue, ... [6]=Sun

Trigger mode behavior

  • interval:Fires every intervalMinutes from activeStart, only while current time is within [activeStart, activeEnd] and activeDays[dayOfWeek] is true.
  • specificTimes:Fires at each HH:MM in the specificTimes array, only on active days. The activeStart/activeEnd window is ignored.
  • daily:Fires once at activeStart on each active day.

Validation rules

HelmOS validates the entire file with Zod on upload (POST /api/config). Key rules:

  • Group channel references must point to existing (nodeId, ch) pairs.
  • Sequence step targets must resolve to existing nodes/channels or groups.
  • Schedule targets must resolve to existing nodes/channels, groups, or sequences.
  • Duplicate node IDs are rejected.
  • Interval schedules require intervalMinutes >= 1.
  • Deduplication by YYYY-MM-DDTHH:MM key prevents double-firing on minute boundaries.