Metis

A workflow that cannot survive the machine dying is not a workflow.

Metis is an open-source workflow engine. You draw a flow of steps, run it, and watch every step as it happens. Underneath, Temporal records each step — so a crash, a restart, or a step that waits a day for an approval never loses the run's place.

docker compose -f compose/docker-compose.yml up --build

Then open localhost:3000. Two containers, SQLite in a volume, both ports pinned to loopback. Clone it first.

The part everything else is downstream of

Kill the process at step three.

A script would lose the run. The card is charged, the shipment is not booked, and nothing knows. Metis loses nothing, because the run is not held in the process — it is held in Temporal's history, and the history is replayed.

  1. 00:00.012WorkflowExecutionStarted
  2. 00:00.031ActivityCompleted Webhook
  3. 00:00.048ActivityCompleted Validate
  4. 00:00.061 Worker lost — the machine went away
  5. 00:04.220 History replayed · the run resumes at step three
  6. 00:04.902ActivityCompleted Charge card
  7. 00:05.114ActivityCompleted Book shipment
  8. 00:05.980WorkflowExecutionCompleted

Illustrative event names and timings, matching the shape Temporal actually records. Run the stack and you will see your own.

The same thing, either side of the line.

Most open cores make you leave to grow. Here the free build is the whole engine, and everything that comes later attaches to it rather than replacing it.

  On your machine When you outgrow it
Where state lives SQLite in a mounted volume. Nothing to provision, nothing to sign up for. Postgres, through the same data gateway. One interface, two adapters.
The workflow itself A definition you drew in the editor, stored as data. The same definition, unchanged. There is no export step and no rewrite.
Credentials AES-256-GCM on your disk, written by atomic rename, never returned by the API. The same boundary. Secret-flagged fields go in and are never read back out.
Reach Binds 127.0.0.1 by default. Serving other machines is a deliberate flag. Helix capabilities attach through the same ports, as locked cards until enabled.

Where we are honest: the hosted service is not open for sign-ups yet, and nothing is published to npm — so npx will not work today. The path that works is the one at the top of this page.

What you are actually running.

Triggers

A webhook with a verified signature, a native Temporal schedule, or a polled connector with a cursor.

Logic

Branches, loops that spawn real child workflows, waits that cost nothing while they wait.

Transform

Shape a payload, or run your own code in a real V8 isolate — 32 MB, no fs, no network, no process.

Integration

HTTP with an SSRF guard that re-checks every redirect hop, SQL over one gateway, email, object storage.

Licence
Apache-2.0
Cloud account required
None
Tests passing
1178
End-to-end
149
Release gates
6
Containers in the stack
2

Every number above is checkable in the repository. We do not print any we cannot show you.

One command, and it is yours.

Apache-2.0. No cloud account, no AWS, no telemetry to opt out of. The engine that runs on your laptop is the engine, not a demonstration of one.

docker compose -f compose/docker-compose.yml up --build

Read the source · Read the docs