Flows
Visual automation with a full-Rust Node-RED-style runtime
PNeX automates data pipelines and reactions with flows: visual graphs you edit by dragging nodes on a canvas and wiring them together — the Node-RED model, but the entire runtime is Rust and supervised by the platform server.
The editor
The flow editor is drawn with the web app itself — a pure WebAssembly canvas with drag-and-drop, pan/zoom, per-node inspector, local validation before save, and append-only versioning with one-click rollback. Every save uses optimistic concurrency: a conflicting edit returns 409 and offers reload-or-overwrite.



The runtime
Deploying a flow compiles the typed graph to the runtime's format and hot-reloads a headless Rust binary (vendored EdgeLink) supervised by the server, with automatic restart and backoff. The deployed version is what runs; the editor state is not.

Node catalog
| Node | Purpose |
|---|---|
inject | Interval or cron trigger |
pnex-control-source | Emits when a switch, slider or button of a dashboard or annotation is operated — see Controls |
pnex-weather | Current conditions and forecasts of a location (MET Norway or Open-Meteo) — see Home cards |
pnex-memory-write / pnex-memory-read | Keep and read live values (no history) shown by dashboard cards |
debug | Capture messages to the debug feed |
pnex-sql | Read-only SQL query against PostgreSQL |
pnex-device-read | Read last pin values of a device (live cache first) |
pnex-device-write | Write digital or PWM output pins through the downlink |
pnex-calc | Evaluate expressions over payload keys |
pnex-value | Emit a fixed or random payload |
json-split / json-merge | Structural split and merge of JSON payloads with named ports |
pnex-metric | Write the result as a telemetry metric |
pnex-coolprop | Thermophysical properties of fluids and mixtures, in-process |
pnex-notify | Send a notification through a channel from a template |
pnex-function | Run a versioned user function (JavaScript or Starlark) |
pnex-http-fetch | HTTP client node with auth and proxy options |
pnex-display | Passthrough probe shown live in the editor |
pnex-reg-* | Regulation cards (on/off heating-cooling, PID with time-proportional relay), to be cast onto autonomous devices — see below |
pnex-anomaly | Anomaly detection per series (robust z-score, forecast band, regime change) — see Predictive maintenance |
pnex-forecast | Forecast a series and predict when it crosses a threshold |
camera-source | Emit one message per camera frame (a reference, never the bytes) |
video-record | Record camera frames as MJPEG-AVI segments — see Cameras & Vision |
vision-detect | Object detection with a registered ONNX model, optional detection layer |
event-log | Store the payload as a searchable JSON event (Events page) |
The red node kind is an escape hatch for raw Node-RED-compatible node types.
Three ways to drive devices
| Mode | How it works | If the server is down | Status |
|---|---|---|---|
| Connected | A flow reads a device, decides on the server, writes a device (device → server → device) | The logic stops; devices keep their last output | Available — for non-critical uses |
| Autonomous | Control cards (pnex-reg-tt-heat, pnex-reg-tt-cool, pnex-reg-pid) are authored in a flow, then their configuration is cast onto the device, which regulates on its own from flash | Keeps regulating and buffers its metrics until the server is back | Coming |
| Mesh (M2M) | The topology is configured in PNeX; devices talk to each other directly | The mesh keeps running between devices | Later, in design |
See the roadmap for dates.
Deployment gates: a pin already assigned to another flow is refused (409), and the server never pushes pin writes on its own — only the flow or the operator writes.

