Node template catalog
A node template is a reusable processing step that a runner implements. This page lists every platform template in one place, so you can find the right step without opening each runner hub.
HEAT ships 65 templates across five runners. A session template is a graph of these steps. Each step points at one template by name, and that name is a long-lived contract. Runner hubs hold the same rows with limitations and pipeline diagrams. This page is the index across them.
Which node do I need
The groups below name the first template to reach for. Follow the Details column in the tables for configuration and output shapes.
I have CSV or TSV uploads
- Start with
input-node, thentabular-to-dataserviceon core-utils for one tabular parent. - Use
system-tabular-to-dataservicewhen one input node receives many uploads and you want all of them in one dashboard payload. - Use
tabular-remaportabular-queryfirst when columns need renaming, deriving or filtering with SQL.
I have JSON
- Use
json-filterto scope a payload with one JMESPath expression. - Use
json-templateto build a new document from JMESPath leaves,json-flattento turn nested JSON into CSV, andjson-mergeto combine several JSON objects. - Use
heat-system-dataservice-envelopeto lift JSON paths into$heat-dataservicechannels without code. - Use
system-arbex-jswhen the reshaping needs real logic. See Arbex.
I have HEAT Capture protobuf
- Use
system-protobuf-extracton the platform runner orhydrate-protobuf-v2on core-utils to decode capture uploads into records. - Follow with an
entity-state-to-*transform for the widget you want, for exampleentity-state-to-mapdisplayfor a map orentity-state-to-chart-datafor a chart. - Use
hydrate-protobuf-journalwhen the session is live and the upload count keeps growing.
I want to publish a dashboard
- Use
dashboard-v2for your own session templates. It turns a data service payload and a layout into a dimension. heat-system-next-dimensiondoes the same job inside shipped platform templates. Do not add it to new integrator templates.- Use
heat-dataservice-mergeto combine several$heat-dataserviceproducers before the publishing node.
I want custom logic without building a runner
- Use
system-arbex-js. It runs sandboxed JavaScript on the platform runner and can emit$heat-dataserviceand layout directly.
I have audio
- Start with
convert-to-pcm, thenaudio-metrics,generate-transcriptandvoice-analysisin that order.
I have headset video
- Use
video-atlas-encodeas a direct child of the capture input node. Useadaptive-video-encodeonly to list the video streams a capture holds.
Template types
Every template declares one type. The type describes the step’s role in the graph, not which runner executes it.
| Type | Meaning |
|---|---|
| Input | Receives uploaded data through an ingest and stores it as node outputs. Only input-node has this type. |
| Transform | Reads parent outputs and reshapes them into a new output, for example decode, filter, flatten or compute. |
| Processing | Runs an algorithm or a gate over parent outputs, for example type validation or a reprocess trigger. |
| Aggregation | Combines several parent outputs into one result, usually the published dimension. |
The Inputs column below says whether a template accepts one parent (single) or several (multiple). This comes from acceptsMultipleInputs in the runner manifest.
core-utils
The core-utils runner (container image runner-core-utils) provides domain-agnostic transforms for tabular, JSON and protobuf data. It also carries the entity-state-to-* family that turns decoded capture records into widget-ready channels. Hub: core-utils.
| Template | Type | Inputs | What it does | Details |
|---|---|---|---|---|
tabular-remap | Transform | single | Rename, derive or drop CSV or TSV columns with per-row Python expressions. | tabular-remap |
hydrate-protobuf | Transform | multiple | Decode legacy protobuf types (gaze, folder upload, OpenDIS PDU, SimulationFrame, Signal PDU audio) to JSON, CSV or binary. | hydrate-protobuf |
hydrate-protobuf-v2 | Transform | multiple | Merge all capture parents and emit SimulationFrame, EntityState, EntityDataEvent or TrackingEvent records with capture envelope fields. | hydrate-protobuf-v2 |
hydrate-protobuf-journal | Transform | multiple | Live-session hydration. Each run appends only newly decoded rows as a part, and readers see one composed CSV or NDJSON artefact. | hydrate-protobuf-journal |
domain-tree-entities | Transform | multiple | Decode capture protobuf directly and fold it into one current-state record per entity, with health and position history. | domain-tree-entities |
domain-tree-hwio | Transform | multiple | Decode capture protobuf directly and carry-forward hardware input (HWIO) values into one flat current-state document. | domain-tree-hwio |
domain-tree-hwio-events | Transform | multiple | Decode capture protobuf directly and emit hardware input (HWIO) changes as a chronological event list for timelines. | domain-tree-hwio-events |
tabular-query | Transform | single | Run SQL SELECT statements over one CSV or TSV in SQLite and output named result tables as JSON. | tabular-query |
json-template | Transform | single | Build an output JSON document from a template tree whose string leaves are JMESPath expressions. | json-template |
json-flatten | Transform | single | Flatten nested JSON or NDJSON records into CSV or TSV columns. | json-flatten |
simulation-frame-merge | Transform | single | Pivot long-format SimulationFrame JSON into a wide CSV keyed by tick and entity. | simulation-frame-merge |
json-merge | Transform | multiple | Shallow or deep merge of several JSON object parents into one document. | json-merge |
converge-outputs | Aggregation | multiple | Re-expose every upstream output on one node without copying blobs. | converge-outputs |
session-summary | Transform | single | Evaluate configured metric definitions over entity records and emit a legacy top-stats payload. | session-summary |
threat-zone-detection | Transform | single | Compute distances between a threat entity and allied entities, detect zone crossings and emit response-time channels. | threat-zone-detection |
entity-state-to-mapdisplay | Transform | single | Build a mapdisplay channel with movement tracks for selected entities. | entity-state-to-mapdisplay |
entity-state-to-chart-data | Transform | single | Build series and events channels for ComposableChart from entity-state records. | entity-state-to-chart-data |
entity-state-to-stats-summary | Transform | single | Build value channels with engagement statistics such as time to detect and detection counts. | entity-state-to-stats-summary |
opendis-decode | Transform | single | Reshape hydrate-protobuf OpenDIS PDU output into the PDU list that entity-state-to-records reads. | opendis-decode |
entity-state-to-records | Transform | multiple | Convert decoded DIS entity-state PDUs into entity-state records with geodetic positions. | entity-state-to-records |
entity-state-to-flightpath | Transform | multiple | Build a flightpath channel with 3D trajectories for selected entities. | entity-state-to-flightpath |
entity-state-to-cognitive | Transform | single | Score cognitive load from gaze and pupillometry components with a bundled model and emit a timeline series. | entity-state-to-cognitive |
entity-state-to-adaptive-cognitive-load | Transform | single | Score cognitive load against a personal baseline from gaze, pupillometry and biometric records. | entity-state-to-adaptive-cognitive-load |
entity-state-to-flight-stats | Transform | single | Reduce one numeric field on one entity to min, max and average for a StatsSummary column. | entity-state-to-flight-stats |
cognitive-load-breakdown | Transform | single | Reduce a cognitive-load timeline to a duration-weighted score with time in each zone. | cognitive-load-breakdown |
entity-state-to-eyetracking | Transform | single | Compute the session-wide share of gaze direction across left, right, top and bottom zones. | entity-state-to-eyetracking |
entity-state-to-viewport-tracking | Transform | single | Compute duration-weighted horizontal and vertical gaze distributions for the viewport tracking widget. | entity-state-to-viewport-tracking |
entity-state-to-lookout | Transform | single | Detect lookout scan events from fast gaze direction changes and emit an events channel. | entity-state-to-lookout |
tabular-to-dataservice | Transform | multiple | Build $heat-dataservice from tabular parents for dashboard-v2. | tabular-to-dataservice |
dashboard-tools
The dashboard-tools runner (container image dashboard-utils) filters JSON and publishes dimensions. Hub: dashboard-tools.
| Template | Type | Inputs | What it does | Details |
|---|---|---|---|---|
json-filter | Transform | single | Apply one JMESPath expression to a JSON parent and output the result. | json-filter |
ecs-transform | Transform | single | Map entity component system (ECS) event JSON to legacy dashboard fragments. | ecs-transform |
opendis-parser | Transform | single | Parse OpenDIS PDU byte streams to JSON. | opendis-parser |
dashboard | Aggregation | multiple | Publish a Legacy dimension from fixed v1 JSON keys. | dashboard |
dashboard-v2 | Aggregation | multiple | Publish a Next dimension from $heat-dataservice and a v2 layout. | dashboard-v2 |
lattice-processor | Processing | multiple | Summarise mixed binary uploads (archives and formats) into a report. | lattice-processor |
filter-payload | Processing | single | Gate uploads by an allowed list of content types. | filter-payload |
filter-node | Processing | single | Validate content type and optional schema after filter-payload. | filter-node |
session-trigger | Processing | multiple | Reprocess a target node in sessions whose metadata matches a search. | session-trigger |
heat-dataservice-merge | Transform | multiple | Merge several $heat-dataservice payloads into one, joining realms by name. | heat-dataservice-merge |
session-metadata-enrich | Processing | single | Copy small key performance indicator fields into session metadata. | session-metadata-enrich |
system-utils
System-utils is the platform’s built-in runner, hosted inside the Core API. Its templates are registered from presets rather than a manifest. Several are platform reserved, which means a shipped system dashboard drives them and they are not meant for integrator templates. Hub: system-utils.
| Template | Type | Inputs | What it does | Details |
|---|---|---|---|---|
input-node | Input | single | Receive uploads and store each one as a node output. Every upload-driven template starts here. | input-node |
capture-discovery | Transform | single | Profile capture uploads into a format and protobuf census with a discovery dashboard payload. | capture-discovery |
system-protobuf-extract | Transform | single | Extract EntityDataEvent, EntityState or SimulationFrame records from capture uploads on the platform runner. | system-protobuf-extract |
system-tabular-to-dataservice | Transform | single | Convert every upload on one input node into $heat-dataservice plus an upload summary. | system-tabular-to-dataservice |
system-arbex-js | Transform | multiple | Run sandboxed JavaScript over parent outputs, with native $heat-dataservice and layout helpers. | system-arbex-js |
heat-system-dataservice-envelope | Transform | single | Build $heat-dataservice from declarative channel bindings over one parent JSON root. | heat-system-dataservice-envelope |
heat-system-next-dimension | Aggregation | multiple | Persist $heat-dataservice and create a Next dimension. Platform reserved. | heat-system-next-dimension |
heat-system-legacy-dimension | Aggregation | multiple | Persist v1 JSON and create a Legacy dimension. Platform reserved. | heat-system-legacy-dimension |
cluster-report | Transform | single | Snapshot Kubernetes cluster usage into JSON. | cluster-report |
cluster-usage-history | Transform | single | Append bounded CPU and memory timelines from cluster-report snapshots. | cluster-usage-history |
heat-workspace-group-count | Transform | single | Bucket workspace items and emit bar series for the Resource Monitor. | heat-workspace-group-count |
project-metrics | Transform | single | Emit project-level session count metrics as JSON. | project-metrics |
session-dimension-query | Transform | single | Query sessions by dimension criteria and return grouped matches. | session-dimension-query |
node-output-query | Transform | single | List matching node output ids for bulk analytics ingest. | node-output-query |
system-bulk-tabular-writer | Transform | single | Load CSV and JSON outputs into the bulk analytics database and emit a catalog. | system-bulk-tabular-writer |
system-bulk-analytics-query | Transform | single | Run read-only SQL against the bulk analytics database and emit tabular JSON. | system-bulk-analytics-query |
node-output-index-sweep | Transform | single | Index stored output content (size, hash, media type) in a timeboxed sweep. Platform reserved. | system-utils |
session-export | Transform | single | Stream a whole session, its template and every output into a downloadable ZIP. Platform reserved. | system-utils |
session-export-retention | Transform | single | Expire session export archives past their time to live. Platform reserved. | system-utils |
audio-utils
The audio-utils runner (container image runner-audio-utils) converts, measures and transcribes audio. Hub: audio-utils.
| Template | Type | Inputs | What it does | Details |
|---|---|---|---|---|
convert-to-pcm | Transform | multiple | Decode WAV, AIFF and AIFC uploads to PCM WAV with a per-file acceptance report. | convert-to-pcm |
audio-metrics | Transform | multiple | Compute duration, level and related metrics per accepted audio file. | audio-metrics |
generate-transcript | Transform | multiple | Run speech to text over PCM audio, keyed by content hash. | generate-transcript |
voice-analysis | Transform | multiple | Combine metrics and transcript signals into one analysis document. | voice-analysis |
video-utils
The video-utils runner (container image runner-video-utils) prepares captured headset video for playback in the dashboard. Hub: video-utils.
| Template | Type | Inputs | What it does | Details |
|---|---|---|---|---|
adaptive-video-encode | Transform | multiple | List the video streams a capture holds as a JSON catalogue. Catalogue only, it does not encode video today. | adaptive-video-encode |
video-atlas-encode | Transform | single | Composite admitted H.264 streams into one atlas and publish fragments plus a manifest for the VideoPlayback widget. | video-atlas-encode |
Project companion runners
Some programmes ship their own runners alongside the platform ones. A companion runner follows the same mechanics as every runner above. It registers a .heat manifest, declares node templates and claims tasks from the platform.
Companion templates are documented with their projects, not in this catalog. If a template name in a session template does not appear on this page, look in the project’s own documentation. To build a runner of your own, see Building your own runner.