Squid Mesh is a workflow automation platform for Elixir applications. It runs inside a host application's supervision tree and infrastructure.
Core Components
- declarative DSL for triggers, payload, steps, transitions, and retries
- public runtime API for starting, inspecting, listing, cancelling, and replaying runs
- durable run persistence and run lifecycle transitions
- durable state for individual workflow steps
- persisted attempt history per step run
- turns workflow execution intent into Oban jobs
SquidMesh.Runtime.StepExecutor
- executes one workflow step, merges step output into context, and advances the run
- resolves step-level retry policy into retry decisions and backoff delays
- shared boundary for external adapters such as HTTP
Runtime Responsibilities
Squid Mesh owns:
- workflow structure
- payload validation
- durable run state
- step state and attempt history
- replay and cancellation semantics
- retry policy at the workflow-step layer
- telemetry and structured log metadata
Oban owns:
- durable job execution
- queueing
- delayed scheduling
- redelivery after worker crashes or restarts
Jido owns:
- step behavior execution
- action contracts inside custom step modules
Postgres owns:
- source-of-truth persistence for runs, steps, and attempts
Execution Flow
- A host application starts a run through
SquidMesh.start_run/2,start_run/3, orstart_run/4. - Squid Mesh validates the workflow definition and payload.
- Squid Mesh persists a pending run in Postgres.
- The dispatcher enqueues one Oban job for the current workflow step.
- The worker loads the run and executes the current step.
- Step output is merged into run context.
- The runtime decides whether the run completes, advances, retries, fails, or no-ops.
- If more work is required, the dispatcher schedules the next step job through Oban.
Recovery Boundary
Squid Mesh is intentionally not a replacement for Oban's worker coordination.
Current guarantees:
- run, step, and attempt history is durable
- queued and scheduled work survives deploys and restarts through Oban
- stale or duplicate deliveries are treated as workflow-level no-ops when possible
Current non-goals:
- custom heartbeats or leases beyond Oban's own lifecycle
- automatic reclamation of a step that died mid-side-effect
- exactly-once external side effects without idempotent step implementations