Against the three libs in post 59, Squid Mesh is closer to a Phoenix/OTP business workflow runtime than to a minimal durable-function engine.
Absurd and TensorZero durable are mostly “write normal code, checkpoint steps into Postgres.” Estuary Flow automations is closer to a persistent control-plane task actor system. Squid Mesh is more explicit: workflow DSL, durable run facts, step state, transitions, approvals, recovery policy, inspection, replay, and host-app integration.
| Area | Squid Mesh | Absurd | TensorZero durable | Estuary Flow automations |
|---|---|---|---|---|
| Primary shape | Elixir workflow DSL inside Phoenix/OTP apps | Postgres-backed durable execution | Rust SDK for durable tasks in Postgres | Rust task framework for Flow control-plane jobs |
| Durable unit | Workflow run, step, attempt, audit, dispatch facts | Task with checkpointed steps | Task trait with checkpointed steps | Persistent task with state, inbox, heartbeat |
| Execution style | Host workers call SquidMesh.execute_next/1 |
Pull workers read from Postgres | Workers process tasks concurrently | Server polls ready DB tasks |
| Waiting | :pause, approvals, waits, deferred continuation |
sleep / suspend / await event | sleep / await event / cron | sleep / suspend until messages |
| HITL | First-class approve/reject/unblock APIs and audit | Generic events | Generic events | Generic messages |
| Recovery | retries, replay, compensation/undo, irreversible markers | task retry + step checkpoints | retry + checkpoint + heartbeat | heartbeat timeout + retry polling |
| Dynamic work | child runs, static graph dependencies | spawn tasks, await spawned task | spawn/join subtasks | spawn child tasks, message parent |
| Operator surface | inspect_run, graph inspection, explain_run, SquidSonar companion |
absurdctl, Habitat UI |
DB-stored errors; less UI-oriented in README | internal control-plane framework |
| Portability | Elixir-first, default Ecto/Jido storage, Postgres production path | Postgres-first | Postgres-first Rust | Estuary/Flow-internal Postgres task framework |
-
Business workflow semantics. Squid Mesh has named workflow modules, triggers, payload contracts, transitions, approval gates, cancellation, replay policy, and explainable run state. Absurd and durable are lower-level durable execution systems.
-
Human workflow support. Squid Mesh’s approve/reject/unblock APIs are more domain-facing than generic “await event” primitives.
-
Recovery vocabulary. Compensation, undo routing, irreversible markers, and replay blocking give Squid Mesh a clearer operational model for side effects.
-
Elixir/Phoenix embedding. It fits apps that already want Ecto, supervision, dashboard/CLI inspection, and domain workflows in Elixir modules.
-
Durable function ergonomics. Absurd and TensorZero durable make checkpointing feel like normal code:
ctx.step,ctx.await_event,ctx.spawn,ctx.join. Squid Mesh is more explicit, but heavier. -
Generic external events. Absurd and durable treat event waiting as a core primitive. Squid Mesh has HITL and pause semantics, but a stronger general signal/event wait API would help.
-
Dynamic fan-out. TensorZero durable has direct spawn/join subtasks. Estuary’s framework also has child task spawning and message passing. Squid Mesh child runs exist, but richer dynamic graph expansion is still the area to sharpen.
-
Heartbeat/lease clarity. TensorZero exposes heartbeat support directly. Estuary tasks have heartbeat-based liveness. Squid Mesh has the durable dispatch/lease boundary and Bedrock direction, but the “long-running claimed step” story should remain a key maturity bar.
Squid Mesh should not try to become Absurd-in-Elixir. The more defensible lane is:
durable, inspectable business workflows for Phoenix/OTP apps, with durable-function-style primitives where they genuinely improve authoring.
The specific ideas worth borrowing are:
await_eventas a first-class durable step primitive, separate from human approval.spawn/joinergonomics for child workflow runs.- Explicit heartbeat/lease behavior for long-running claimed work.
- Strong docs around “code outside durable steps may rerun” vs Squid Mesh’s stricter step boundary.
- ElixirForum post 59 (https://elixirforum.com/t/squid-mesh-workflow-automation-runtime-for-elixir-applications/75162/59?u=webofbits)
- Squid Mesh docs (https://hexdocs.pm/squid_mesh)
- Absurd (https://github.com/earendil-works/absurd)
- TensorZero durable (https://github.com/tensorzero/durable)
- Estuary Flow automations (https://github.com/estuary/flow/tree/master/crates/automations)