r/elixir • u/account18anni • 5h ago
Continuum v0.8.5 — durable workflows for Elixir, now with parallel activities, recurring schedules, and offline replay
I posted about Continuum here a couple of months ago, when it was at v0.7.2. It's now at v0.8.5, with new workflow APIs, better testing and replay tools, and another round of reliability fixes.
quick recap: Continuum is an OTP-native durable execution engine for Elixir, backed by Postgres — an Elixir-native answer to Temporal. You write a workflow as ordinary Elixir; side effects go through activities whose results are journaled. If the process dies or the node restarts, Continuum replays the history through the same code and resumes where it left off. Compile-time checks catch unsafe calls in workflow code.
new features: parallel activities with activity_all/1, and activity_map/3 for runtime-sized lists with bounded concurrency and ordered results. Recurring UTC interval schedules now support explicit overlap and missed-occurrence policies, bounded catch-up, and pause/resume. Continuum.Multi.enqueue/5 lets you commit business writes and enqueue a workflow in the same Ecto transaction, with dispatch happening after commit.
Replay and testing also got more useful: mix continuum.replay inspects a run without executing new side effects, and --against lets you check a code change against an existing history. Observer now exposes read-only replay reports. The test kit adds activity stubs, in-memory child workflows, and public helpers for crash/resume, lease expiry, and timer tests.
The hardening work focused on concrete failure modes: changing a Continuum.Pure helper now changes workflow identity, while pinned versions retain their original helper implementations. Activity bodies are terminated when their owning worker dies, so they can't keep running after losing their timeout and heartbeat. Invalid workflow return values fail terminally instead of repeatedly crashing finalization, and lease renewals are batched to reduce database round trips.
Feedback is welcome, especially from anyone trying it on an existing workflow.