hotloop
GitHub
HotLoop CascadeReleased, 0.1.2

The plant talking to everything else, without losing the job.

An alarm, a webhook, a schedule, a new row or an MQTT burst becomes a batch of items, and the items run through steps that call real systems with real credentials. If an API is down or the box reboots halfway through, the job still finishes, because every step is checkpointed. The consequence: the maintenance ticket still gets created after the network comes back.

Cascade 0.1.2 is out. 0.1.1 was the first release.

0.1.2 is the same code as 0.1.1, built and tested on Podman only. There was a 0.1.0 tag before that and it never published anything, because its chart test failed on a hosted runner. The repository is private, but the image and the chart are public and pull with no login, so there is nothing to sign up for before you try it.

Install it

Pull 0.1.2 with Podman, or install the chart with Helm.

The image is ghcr.io/hotloop-io/hotloop-cascade, for amd64 and arm64, with the tags 0.1.2, 0.1, 0, latest and stable. The chart is hotloop-cascade 0.1.2 in the same registry. Both are public, and the source repository is private.

Podman

podman pull ghcr.io/hotloop-io/hotloop-cascade:0.1.2

The Quadlet units follow :stable and Podman's auto-update timer moves them, and an update that doesn't come up healthy is rolled back to the image that was running.

k3s with Helm

helm install cascade oci://ghcr.io/hotloop-io/charts/hotloop-cascade --version 0.1.2

One pod on SQLite by default. Split into server and workers on PostgreSQL with --set split=true.

Migrations only go forward. A rollback puts the old image back and does not un-migrate your database, so take a backup before you turn updates on. Lose the key that seals stored credentials and every stored credential is unreadable, so keep a copy somewhere that isn't the box. The steps are in the docs and the release notes.

Why it exists

A queue that is the database, so there is nothing else to babysit.

Cascade is one static Go binary. It runs on SQLite on a Raspberry Pi, or on Postgres with as many workers as you want on k3s, and Postgres is the queue too, so there is no Redis on the plant cluster to patch and watch. Nothing on the box is a second thing that can fail on its own schedule.

How it runs

Podman with Quadlet, or k3s with Helm.

One file and a volume is Cascade on SQLite. The Postgres shape is a server, a worker and the database on a network of their own. Both start at boot, restart on failure, and run read-only, non-root, with every capability dropped. On k3s the chart can split it into API, webhook and worker pods that scale separately. The key that seals stored credentials survives an uninstall, because a key that leaves with the release takes every credential with it.

What it won't do

Four refusals, and each one is on purpose.

It won't write to your equipment.

Cascade reads and subscribes. Anything that moves a valve or changes a setpoint goes through HotLoop's write gate, so every write is audited.

It won't run JavaScript in your fields.

Field expressions use HotLoop's small automation language. JavaScript lives only in the Code step, a separate jailed process.

It won't gate anything.

SSO, enforced MFA, roles, audit, version history, scoped API keys and HA workers are for everyone. There is no license check in the code.

It won't phone home.

No license server and no cloud dependency. Telemetry is opt-in, off by default, and documented down to the field when it lands.

The full detail behind these cards

It won't write to your equipment.

Cascade reads and subscribes. Anything that moves a valve or changes a setpoint goes through HotLoop's write gate, so the gate's audit sees every write no matter which workflow started it. A workflow engine with a side door onto the PLC is how an audit trail stops being honest.

It won't run JavaScript in your fields.

Field expressions use the same small language HotLoop's automations use. It can't touch the OS, the network or the filesystem, and it always terminates. JavaScript lives in one place, the Code step, which runs in a separate jailed process with no secrets, no network and no filesystem.

It won't gate anything.

SSO, enforced MFA, roles, audit, version history, scoped API keys and HA workers are for everyone. There is no license check anywhere in the code, so there is nothing to pull out from under you later.

What is built

What 0.1.2 ships.

Every item here is built and was tried against real services, never mocks: Postgres, a headless browser, Mosquitto, a HotLoop Gateway, ntfy, Gotify, a mail server and ERPNext. The one exception is Discord, which has only been tried against a stand-in that answers as its documentation says, not the real thing.

Durable executions

Every step is checkpointed. If an API is down or the box reboots halfway through, the job finishes, because a retry is a row in the database.

Triggers

A HotLoop alarm or tag reading, a webhook, a schedule, an MQTT burst, a file that shows up, a new email in an IMAP mailbox, or a new row in ERPNext becomes a batch of items.

Steps that call real systems

HTTP, PostgreSQL, email, files, ERPNext, ntfy, Discord and Gotify, with an OAuth2 credential vault sealed by a key outside the database.

Steps that talk to HotLoop

Read tags and alarms, acknowledge, call a service, run a script, apply a recipe. Every command goes through the gateway's write gate.

People and governance

Users with enforced MFA, OIDC sign-in, projects and roles, an audit log and version history on every workflow.

Watching it

Prometheus metrics, and every execution is one OpenTelemetry trace with a span per step. With no endpoint named, nothing is sent.

Bringing a workflow in

It converts a workflow exported as JSON from another tool. What it is sure of comes across, and the rest comes across switched off.

The full detail behind these cards

Durable executions

Every step is checkpointed. If an API is down or the box reboots halfway through, the job finishes, because a retry is a row in the database and not a goroutine praying nobody pulls the plug.

Steps that call real systems

HTTP, PostgreSQL, email, files (CSV, Excel and a PDF's text), ERPNext, and the notifiers: ntfy, Discord and Gotify. A credential vault with OAuth2 holds the secrets, sealed with a key that lives outside the database.

Steps that talk to HotLoop

Read tags and alarms, acknowledge an alarm, call a service, run a script, apply a recipe and trigger an automation on a HotLoop gateway. Every command goes through the gateway's write gate, with a reason in its audit trail, so Cascade has no side door to a device.

Bringing a workflow in

It converts a workflow exported as JSON from another tool. What it can be sure of comes across, and everything else comes across switched off with its original settings in the notes. It never guesses what a JavaScript expression meant, and it never brings credentials.

Not built yet

The plan after 0.1.2.

None of this exists today. It is the order the work is in, and no phase is a paid tier.

VersionWhat it adds
0.2.0SAML, LDAP and AD, SCIM, custom roles, external secrets, log streaming, variables, folders, insights and redaction policies.
0.3.0Git source control and environments, the multi-main HA scheduler with trigger leases, retention, backup and restore.
0.4.0The rest of the connector list, a published connector spec, a plugin SDK, and forms with human approval steps that work from a phone.
0.5.0LLM and agent steps, an MCP client and server, and a builder that uses your own model. Bring your own key or run it local.
Licensing

Free, with no license key.

Cascade is under the HotLoop Business Source License 1.1, like the rest of HotLoop. Home and lab use is free. Business use is free through EmberNET. Support, SLAs and rollouts come from our Official Systems Integrator, Fireball Industries.

Read the license