industrial flow automation · v0.4.1

Visual flow programming,
rebuilt for the industrial edge.

One Go binary. Goroutine-per-node parallelism. Native MQTT, Modbus and OPC-UA. Write transforms in Go, JavaScript or expr-lang — drag-and-drop signal flows, without the node_modules.

buildv0.4.1 · 5.2 MB
platformslinux · darwin · windows · arm
runtimego 1.24 · single binary
licenseAGPL-3.0
flows / temp-watch.jsoncredentialsdebug
deployed · 14 nodes · 312 msg/s
MQTT Subscribe
sensors/temp/+
connected
ƒGo Transform
normalize()
0.4 ms
Context Watch
cache.users
watching
OPC-UA Write
ns=2;s=Setpoint
12 msgsON
Debug
msg.payload
error: null
// why loopze

Four deliberate decisions.
Built ground-up. Not patched on.

Loopze is a clean-room runtime informed by a decade of running flow-based systems in production. Same philosophy — visual flow programming. Different answers to the parts that hurt.

01concurrency

Real parallelism. Not a single thread.

Status quo

Most flow runtimes sit on a single-threaded event loop. One slow Function node stalls every other node — every other flow, every other message.

Loopze

One goroutine per node. The Go runtime spreads work across every CPU core. Thousands of nodes run truly in parallel — not cooperatively-sequentially.

  • goroutine-per-node
  • go runtime scheduler
  • no event-loop bottleneck
02distribution

One binary. Zero dependencies.

Status quo

A scripting runtime, a package manager, and a directory full of dependencies. Multi-step installs, version conflicts, and orphaned community modules that rot in production.

Loopze

A single Go executable. Frontend embedded, NATS embedded, credentials encrypted at rest. Drop the binary on an edge device and run it.

  • ~5 MB stripped
  • linux · darwin · windows · arm
  • zero runtime deps
03context

Reactive context. Stop polling.

Status quo

Context is a passive key-value store. To react to changes, flows poll every 500 ms — anti-patterns, race conditions, lost intermediate states.

Loopze

Context lives on NATS JetStream KV. The Context Watch node subscribes to keys or patterns and fires a message the instant a value changes. No timers, no missed updates.

  • NATS KV watcher
  • global · flow scope
  • event-driven, not polled
04industrial

Industrial protocols, in the box.

Status quo

OPC-UA, Modbus, Sparkplug — usually community modules. Three-to-five forks per protocol, varying maturity, dependency chains that break on the next update.

Loopze

MQTT, Modbus TCP/RTU, OPC-UA (Read · Subscribe · Write with structure-aware ExtensionObjects), Serial — all native, all maintained alongside the runtime, all using one shared config-node pattern.

  • shared connection pooling
  • unified credentials (AES-256-GCM)
  • one release cycle
05reliability

One repo. One release. No broken nodes.

Every node — MQTT, Modbus, OPC-UA, Function, Context, Queue — lives in the same repository as the runtime. They ship together. They're tested together. Upgrade Loopze and every node moves with it. No abandoned community modules, no version skew, no hunt through three forks for the one that still compiles.

  • single source of truth · monorepo
  • end-to-end integration tests across all nodes
  • semver-versioned together · one changelog
  • deprecations announced, not discovered in production
1
repository
1
release cycle
0
orphaned nodes
// at a glanceelsewhereloopze
runtimesingle-threaded event loop go, goroutine-per-node
distributionruntime + package manager + deps one ~5 MB binary
protocolscommunity packages native MQTT · Modbus · OPC-UA
contextpassive key-value, polled reactive NATS KV, watched
queuingexternal (Redis, RabbitMQ) embedded NATS JetStream
scriptingone language JavaScript (Goja) + expr-lang
credentialsplaintext or community module AES-256-GCM, separate file
profiling— (no per-node metrics) per-node latency · msg/s · queue fill
// features

Six things Loopze takes seriously,
so your nights stay quiet.

Concrete capabilities that come from running flow-based systems in production for a decade — and noticing what was missing.

01

Three ways to script

Need raw speed? Drop a Go Transform — runs natively in the runtime, no interpreter, full goroutine parallelism. Need flexibility? Function nodes run JavaScript via Goja. Need a one-liner? expr-lang for fast field-level expressions.

go transform
native, zero-copy
javascript
Goja sandbox
expr-lang
inline
02

Validation node

Drop a Validation node at any system boundary. Conforming messages pass through, non-conforming ones route to a separate error output. Explicit data contracts between flow sections.

inputs
msg + model ref
outputs
pass · reject
03

Native queuing

Embedded NATS JetStream means a Queue node ships in the box. Configurable delivery (at-least-once, exactly-once), retries, dead-letter — no Redis, no RabbitMQ, no plugin.

broker
embedded NATS
delivery
at-least · exactly-once
04

Per-node profiling

Toggle the profiling overlay and see latency, msg/s and queue fill directly on every node. Slow nodes are highlighted on the canvas — performance issues become visible before they hurt.

metrics
p50 · p99 · msg/s
cost
opt-in, zero idle
05

Message tracing

Pick a single message and follow it through the flow. The path lights up on the canvas, with timestamps and payload snapshots at every hop. Debugging branched flows finally makes sense.

scope
single msg · live
snapshots
in/out per node
06

Encrypted credentials

Secrets live in a separate file, AES-256-GCM at rest. Local user accounts with Argon2id, three roles (admin, editor, viewer), sliding sessions out of the box.

secrets
AES-256-GCM
auth
Argon2id · 3 roles
// protocols out of the box
MQTTv3 · v5 · TLS
ModbusTCP · RTU
OPC-UARead · Sub · Write
SerialRS-232 · RS-485
NATSembedded broker
HTTPREST · WS · SSE
WebSocketinbound · outbound
Cronparsed by cronstrue