durable
WorkflowFreeA durable workflow execution engine for Elixir
Capabilities14 decomposed
declarative workflow definition via elixir dsl macros
Medium confidenceDefines complex multi-step workflows using Elixir macros (workflow, step, branch, parallel, foreach) that compile to an AST-based execution plan persisted in PostgreSQL. The DSL abstracts control flow, state management, and resumability into composable building blocks, eliminating boilerplate for long-running processes. Workflows are defined as pure Elixir code with compile-time validation of step dependencies and control flow structure.
Uses Elixir's compile-time macro system to transform workflow definitions into persistent execution plans, enabling type-safe control flow composition and static validation of step dependencies without runtime interpretation overhead. Unlike Temporal or Cadence which use separate workflow languages, Durable embeds orchestration directly in Elixir code with full access to the language's pattern matching and functional composition.
Tighter integration with Elixir's type system and pattern matching than Oban (which treats workflows as job sequences), and simpler deployment than Temporal (no separate server required, uses existing PostgreSQL).
postgresql-backed durable state persistence with automatic resumability
Medium confidencePersists complete workflow execution state (step results, context, execution history) to PostgreSQL after each step completes, enabling workflows to resume from the exact point of interruption after crashes, restarts, or arbitrary delays. Uses Ecto schemas (WorkflowExecution, StepExecution) to model workflow state as relational data with transactional consistency guarantees. Resumability is automatic—the execution engine queries persisted state and continues from the last completed step without explicit checkpointing logic.
Implements durability as a first-class concern via Ecto schemas with automatic transactional persistence after each step, rather than as an optional feature bolted onto a job queue. The execution engine treats the database as the source of truth for workflow state, enabling seamless multi-instance deployments and arbitrary pause/resume cycles without resource leaks.
More transparent than Oban (which hides job state in a queue table) and simpler than Temporal (which requires a separate event store service). Leverages PostgreSQL's ACID guarantees directly rather than implementing custom consensus protocols.
multi-instance deployment with distributed concurrency control
Medium confidenceSupports deploying Durable across multiple application instances with automatic concurrency control via database-level locking. When multiple instances attempt to execute the same workflow, the execution engine uses PostgreSQL row-level locks to ensure only one instance executes a given workflow step at a time. This enables horizontal scaling without a central coordinator. The execution engine polls for available work (steps ready to execute) and acquires locks before execution, ensuring distributed safety.
Implements distributed concurrency control via PostgreSQL row-level locks rather than a separate coordination service, enabling multi-instance deployment without additional infrastructure. Lock acquisition is transparent to workflow logic, and the execution engine automatically handles lock timeouts and retries.
Simpler than Temporal's multi-worker deployment (which requires a separate server) and more transparent than manual distributed locking in step logic. Leverages PostgreSQL's built-in locking mechanisms rather than implementing custom consensus.
workflow execution observability via log capture and state querying
Medium confidenceProvides comprehensive observability into workflow execution via two mechanisms: (1) automatic log capture that records all step execution logs to the database, and (2) queryable workflow state that enables inspection of execution history, step results, and context at any point in time. Logs are captured from Elixir's Logger and associated with specific step executions. Workflow state can be queried via Ecto queries or API endpoints, enabling real-time monitoring and debugging of running workflows.
Integrates logging and state querying directly into the workflow engine via PostgreSQL, enabling unified observability without external logging infrastructure. Logs are associated with specific step executions and queryable alongside execution state, providing rich context for debugging and monitoring.
More integrated than external logging systems (which require separate configuration) and simpler than Temporal's event history (which requires custom event emission). Log capture is automatic and transparent to workflow logic.
pluggable queue and message bus adapters for custom integration
Medium confidenceProvides extensible queue and message bus adapter interfaces, enabling custom implementations for step execution scheduling and event delivery. The default implementation uses PostgreSQL polling, but adapters can implement push-based scheduling (e.g., via RabbitMQ, Kafka) or custom event delivery mechanisms. Adapters implement a standard interface (enqueue, dequeue, publish, subscribe) and are plugged into the Durable supervision tree via configuration. This enables integration with existing message infrastructure without modifying core workflow logic.
Provides pluggable adapter interfaces for queue and message bus implementations, enabling custom integration without modifying core workflow logic. Adapters are configured via Elixir configuration and plugged into the supervision tree, enabling runtime selection of queue strategy.
More flexible than Oban (which is tightly coupled to PostgreSQL) and simpler than Temporal (which requires separate worker services). Adapter interface is minimal and easy to implement for custom use cases.
workflow cancellation with cascading cleanup
Medium confidenceEnables cancellation of running workflows via the cancel API, which marks the workflow as cancelled and triggers cleanup of associated resources. When a workflow is cancelled, the execution engine stops executing new steps, executes compensations for completed steps (in reverse order), and marks the workflow as cancelled in the database. Cancellation is asynchronous and resumable—if the application crashes during cancellation, the process resumes from the last completed compensation.
Implements workflow cancellation as a first-class operation with automatic compensation execution, rather than as a simple state flag. Cancellation is resumable and fully observable, enabling graceful shutdown of workflows with complex resource cleanup.
More sophisticated than simple workflow termination and simpler than Temporal's cancellation (which requires custom activity implementations). Cancellation automatically triggers compensations without explicit cleanup logic.
configurable retry logic with multiple backoff strategies
Medium confidenceProvides per-step retry configuration with exponential, linear, constant, and custom backoff strategies. When a step fails, the execution engine automatically reschedules it based on the configured backoff function, max retry count, and jitter settings. Retries are persisted to the database, allowing workflows to survive transient failures (network timeouts, rate limits) without manual intervention. Backoff state is tracked in StepExecution records, enabling observability into retry attempts and failure patterns.
Implements retries as first-class workflow primitives with pluggable backoff strategies, rather than as a generic job queue feature. Retry state is fully observable via database queries, and backoff functions are composable Elixir functions, enabling custom strategies (e.g., retry only on specific error types) without framework modifications.
More flexible than Oban's built-in retry (which uses fixed exponential backoff) and simpler than Temporal (which requires custom activity retry policies). Retries are transparent to step logic—no try/catch boilerplate needed.
human-in-the-loop workflow pausing with event and input resumption
Medium confidenceEnables workflows to pause execution and wait for external events (webhooks, user input, approvals) or time-based delays without holding system resources. Implements three wait primitives: wait_for_event (pause until external event arrives), wait_for_input (pause until user provides data), and wait_for_approval (pause until approval is granted). Paused workflows are stored in PostgreSQL with a WaitState record indicating the resume condition. The execution engine polls or subscribes to resume events and automatically continues the workflow when the condition is met.
Treats human-in-the-loop as a workflow primitive (wait_for_approval, wait_for_input) rather than as custom step logic, enabling declarative approval workflows without state machine boilerplate. Paused workflows are fully queryable and resumable via API, allowing external systems (web UIs, Slack bots, webhooks) to trigger resumption without coupling to workflow internals.
Simpler than Temporal (which requires custom activity implementations for approvals) and more explicit than Oban (which lacks built-in pause/resume semantics). Enables long-duration waits (days/months) without resource leaks, unlike in-memory job queues.
parallel step execution with join semantics
Medium confidenceExecutes multiple steps concurrently using the parallel macro, with configurable join semantics (wait for all, wait for first, wait for N). The execution engine spawns Elixir processes for each parallel step, persists their results independently to PostgreSQL, and coordinates joining based on the specified strategy. Parallel execution is transparent to step logic—steps execute as normal Elixir functions, and the framework handles process spawning, result aggregation, and error propagation.
Implements parallel execution as a workflow primitive with declarative join semantics, rather than requiring manual process spawning and result aggregation. The framework handles process lifecycle, error propagation, and result persistence, enabling developers to express parallelism as a control flow construct.
More declarative than manual Elixir process spawning and simpler than Temporal's activity parallelism (which requires custom activity implementations). Join semantics are explicit and queryable, unlike async/await patterns in imperative languages.
conditional branching with dynamic path selection
Medium confidenceImplements conditional branching via the branch macro, which evaluates a condition function and selects one of multiple execution paths based on the result. Each branch is a separate workflow sub-graph with its own steps, retries, and error handling. The execution engine evaluates the condition at runtime, persists the selected branch to the database, and executes the chosen path. Branches can be nested and combined with other control flow primitives (parallel, foreach).
Treats branching as a first-class workflow construct with full persistence and observability, rather than as imperative if/else logic in step functions. Each branch is a separate sub-graph with independent step execution history, enabling fine-grained control flow analysis and debugging.
More declarative than embedding conditionals in step logic and simpler than Temporal's workflow versioning for conditional behavior. Branch selection is queryable and auditable via database records.
iterative execution over collections with foreach
Medium confidenceImplements collection iteration via the forEach macro, which executes a step or sub-workflow for each element in a collection. The execution engine iterates over the collection, spawning a step execution for each element with the element value in the context. Iteration state is persisted to the database, enabling workflows to resume from the last completed iteration after interruption. Supports both sequential and parallel iteration strategies.
Implements iteration as a workflow primitive with automatic persistence of iteration state, enabling resumable batch processing without custom loop logic. Each iteration is a separate step execution with independent retry and error handling, providing fine-grained observability into batch processing.
More declarative than manual loop logic in step functions and simpler than Temporal's activity loops (which require custom activity implementations). Iteration state is fully queryable and resumable.
compensation and saga pattern for distributed transaction rollback
Medium confidenceImplements the saga pattern via compensation functions, which are executed in reverse order when a workflow fails to rollback distributed transactions. Each step can define a compensate function that undoes the step's effects (e.g., refund a payment, delete a created resource). When a step fails and retries are exhausted, the execution engine executes compensations for all previously completed steps in reverse order. Compensations are persisted and resumable, ensuring rollback completes even if the application crashes.
Implements saga pattern as a first-class workflow feature with automatic compensation execution and persistence, rather than requiring manual rollback logic. Compensations are defined declaratively alongside steps and executed automatically on failure, eliminating boilerplate for distributed transaction handling.
Simpler than Temporal's activity compensation (which requires custom activity implementations) and more transparent than manual saga implementation in step logic. Compensation state is fully queryable and resumable.
scheduled workflow execution via cron expressions
Medium confidenceEnables workflows to run on schedules using cron expressions via the Scheduler API. The execution engine maintains a schedule table in PostgreSQL and periodically checks for due schedules, spawning new workflow instances at the scheduled times. Schedules can be created, updated, and deleted via API calls. Scheduled workflows are treated as normal workflow instances with full durability and observability. The scheduler uses a polling mechanism (configurable interval) to detect due schedules.
Integrates scheduling directly into the workflow engine via PostgreSQL, eliminating the need for external cron infrastructure or scheduler services. Scheduled workflows are first-class workflow instances with full durability and observability, enabling unified management of all workflows (ad-hoc and scheduled) via the same API.
Simpler than managing external cron jobs and more integrated than Oban's job scheduling (which treats schedules as separate from workflow orchestration). Schedules are queryable and manageable via API.
hierarchical workflow composition with parent-child relationships
Medium confidenceEnables workflows to spawn and coordinate child workflows via parent-child relationships. A parent workflow can spawn one or more child workflows, wait for their completion, and aggregate their results. Child workflows are independent workflow instances with their own execution state, retries, and error handling, but their lifecycle is tied to the parent. The execution engine tracks parent-child relationships in the database and handles cascading cancellation and error propagation.
Treats parent-child relationships as first-class workflow constructs with automatic lifecycle management and result aggregation, rather than as manual workflow spawning in step logic. Parent-child relationships are queryable and enable hierarchical workflow visualization and debugging.
More structured than manual workflow spawning and simpler than Temporal's child workflow implementation (which requires explicit activity calls). Parent-child relationships are transparent to workflow logic and fully observable.
Capabilities are decomposed by AI analysis. Each maps to specific user intents and improves with match feedback.
Related Artifactssharing capabilities
Artifacts that share capabilities with durable, ranked by overlap. Discovered automatically through the match graph.
Temporal Technologies
Ensures resilient, fault-tolerant applications with durable...
Hatchet
Distributed task queue for AI workloads.
Temporal
Durable execution for distributed workflows.
Inngest
Event-driven durable workflow engine.
Upstash
Serverless data — Redis, Kafka, Vector DB, QStash with pay-per-request and edge support.
llama_index
LlamaIndex is the leading document agent and OCR platform
Best For
- ✓Elixir/Phoenix teams building long-running business processes
- ✓Teams replacing scattered background job systems with unified workflow orchestration
- ✓Developers needing human-in-the-loop approval workflows without custom state machines
- ✓Production systems requiring 99.9%+ uptime for long-running processes
- ✓Teams with existing PostgreSQL infrastructure and Ecto expertise
- ✓Workflows spanning hours to months (e.g., approval chains, batch processing)
- ✓Production deployments requiring high availability and horizontal scaling
- ✓Teams with existing PostgreSQL infrastructure and multi-instance deployment patterns
Known Limitations
- ⚠Elixir-only; no Python, Go, or Node.js SDKs available
- ⚠DSL compilation happens at module load time; dynamic workflow generation requires runtime macro evaluation
- ⚠Step logic must be pure Elixir functions; external language integration requires wrapper modules
- ⚠PostgreSQL required for state persistence; no support for other databases
- ⚠PostgreSQL becomes a critical dependency; no fallback to in-memory state
- ⚠Step context must be serializable to JSON; complex Elixir terms (PIDs, references) require custom serialization
Requirements
Input / Output
UnfragileRank
UnfragileRank is computed from adoption signals, documentation quality, ecosystem connectivity, match graph feedback, and freshness. No artifact can pay for a higher rank.
Repository Details
Last commit: Mar 11, 2026
About
A durable workflow execution engine for Elixir
Categories
Alternatives to durable
Are you the builder of durable?
Claim this artifact to get a verified badge, access match analytics, see which intents users search for, and manage your listing.
Get the weekly brief
New tools, rising stars, and what's actually worth your time. No spam.
Data Sources
Looking for something else?
Search →