Qoqi Flow vs the rest
They replay your code. Qoqi Flow freezes it.
Temporal, DBOS, Restate, Inngest and Workflow SDK bring a workflow back by running its code again, so the code has to behave the same every time. Qoqi Flow writes down the state of execution and goes on from the line it was at. Everything else follows.
Temporal's durability, without the determinism rules.
Temporal replays your workflow from its event history, so your code has to play back identically, forever. Qoqi Flow freezes the state of execution and thaws it at the line it was at. Nothing replays, so nothing has to be deterministic.
vs DBOSRecovery that does not run your code twice.
DBOS recovers a workflow by calling it again and skipping the steps it checkpointed, so the code has to take the same path every time. Qoqi Flow thaws the frozen state at the line it was at: no re-execution, no determinism, and a compiler that checks what DBOS leaves to discipline.
vs RestateWaiting for months is the point, not a smell.
Restate replays a journal, so every side effect goes through ctx.run and the clock through ctx.date, by discipline. Running invocations stay on their deployment, and its docs advise against handlers that run for days. A Qoqi flow waits as long as the process takes, moves to new code at a stage, and the compiler checks the rules.
vs InngestEvery line runs once. Not just the steps.
Inngest calls your function again and again, handing back the results of the steps it saved; the code around them runs each time, and a step is known by its string id. Qoqi Flow thaws the instance at its line: every line runs once, and a deploy never makes a step run twice.
vs Workflow SDKDurable without a sandbox, a compiler plugin or a host.
Vercel's Workflow SDK compiles "use workflow" functions into a sandbox that is replayed from an event log: a logical clock, a seeded Math.random, no fetch, no timers, no Node modules. Each run is pinned to the deployment that started it. Qoqi Flow is a whole language that never replays, moves to new code at a stage, and runs anywhere.
All of them, side by side
| Qoqi Flow | Temporal | DBOS | Restate | Inngest | Workflow SDK | |
|---|---|---|---|---|---|---|
| Comes back by | Thawing its state | Replay | Re-execution | Replay | Calling it again | Replay |
| Determinism rules | None | Yes | Yes | Yes | Yes | Yes, in a sandbox |
| Calls outside steps caught | At compile time | Partly: a Go linter, a Python sandbox | No | No | No | At load or run time |
| Running instances on new code | Move at a stage, checked | Patches, or pinned workers | App version, or patches | Pinned to a deployment | Matched by step id | Pinned to a deployment |
| A step never run twice | Settled<T> | At least once | At least once | At least once | At least once | At least once |
| Crash tests built in | everyCrash | No | No | No | No | No |
| Steps in any language | Any server that speaks the protocol | An SDK per language | Python, TS, Go, Java | An SDK per language | TS, Python, Go | TypeScript |
| To run it | One binary | Service, database, Elasticsearch, workers | A library, and Postgres | A server | A server, Postgres and Redis to scale | Vercel, or a World |
| License | Apache 2.0 | MIT | MIT | BSL 1.1 | SSPL | Apache 2.0 |
Write the process. Let it wait.
curl -fsSL https://qoqi.dev/install.sh | sh