Continuum - a library for durable and crash-resistant workflows

Continuum is an OTP-native durable execution engine for Elixir, backed by Postgres. IIt’s an Elixir-native answer to Temporal in other ecosystems: running a multi-step business process that survives crashes, restarts, and deploys.

You can write your workflow as ordinary Elixir. Side effects go through activities, whose results are journaled on first run. If the process dies or the node restarts, Continuum resumes the workflow exactly where it left off, by replaying its event history through the same code with identical state.

Determinism is enforced at compile time. Workflow code is scanned for non-deterministic calls (time, randomness, IO, and so on), so replay safety is checked by the compiler rather than left to discipline.

On top of the core engine, Continuum provides durable timers and signals, activity retries, sagas and compensation, parent/child workflows, continue_as_new for long-running loops, workflow versioning, a LiveView observer, OpenTelemetry, and optional clustering. Activities run on a built-in worker pool by default, or on Oban if you already operate one.

12 Likes

Updated to 0.6, lots of small fixes based on suggestions and a full-library logic audit.

Updated to v0.6.1 with some fixes and improvements given by users. Soon i’ll start also a collaboration to add support for yugabyte db as requested.

This looks really interesting. Temporal’s durable workflows is a really cool model for writing software. Will definitely keep an eye on this going forward.

1 Like

v0.6.2 is out, focused on operational health, graceful lifecycle management, and safer activity operations. i suggest you to update it because of also other resilience fixes added.

Released Continuum v0.7.1, featuring durable one-shot schedules, activity queues and progress heartbeats, cooperative cancellation, versioned signal contracts, and replay-safe logging.
This release also strengthens CI release gates and updates vulnerable dependencies.

Please update to the new version as soon as possible

Released Continuum v0.7.2, featuring stricter compile-time determinism enforcement with Logger and the remaining unsafe stdlib calls now rejected, warnings for the implicit catch spelling, cancelled-run classification moved to the state column, retry jitter preserved at maximum backoff, and bounded, health-surfaced retries for failing schedule starts.
This release also makes the timer wheel and signal router survive an unreachable Postgres at boot instead of going deaf for the life of the node, and updates vulnerable dependencies (Postgrex and Phoenix LiveView).

Note that this release rejects direct Logger calls in workflow code — use Continuum.log/2 instead — and adds a delta migration for runs cancelled before v0.5.2; see the v0.7.1 → v0.7.2 migration guide.

Please update to the new version as soon as possible

now also Continuum v0.8.1 is out! try the new replay tooling, workflow test kit, and activity/logging APIs for building durable Elixir workflows.
This release also hardens replay safety and ships with a zero-warning strict Credo/ex_slop quality gate—feedback is very welcome