Current section
Files
Jump to
Current section
Files
docs/COMPARISON.md
# Comparison with Alternatives
## Elixir Workflow Engines
| Aspect | [PgFlow] | [Oban] | [Oban Pro Workflow] | [Broadway] | [Gust] | [Handoff] | [Reactor] | [FlowStone] | [Durable] | [Journey] |
| ------------------ | --------------------------- | --------------------------- | --------------------------- | --------------------------- | --------------------------- | --------------------------- | --------------------------- | --------------------------- | --------------------------- | ----------------------------- |
| **License** | Open source | Open source | Paid | Open source | Open source | Open source | Open source | Open source | Open source | Open source |
| **Focus** | Cross-language workflow DAGs, jobs and cron | Background jobs with cron | DAG workflows for Oban | Kafka/SQS data pipelines | Airflow-like DAGs with UI | Distributed cluster DAGs | Saga orchestration+rollback | Asset-first ETL pipelines | Temporal-style workflows | Durable graph workflows |
| **Coordination** | Database (pgmq) | Database (Oban) | Database (Oban) | In-memory (GenStage) | Application (Elixir) | Erlang cluster | In-process | Database (Oban) | Database (PostgreSQL) | Database (PostgreSQL) |
| **Signal Strategy**| Polling + LISTEN/NOTIFY | Polling + NOTIFY | Polling + NOTIFY | Demand-based (GenStage) | Manual poll | Distributed messages | In-process | Oban-based | Polling | Polling |
| **Dependencies** | First-class `depends_on` | Manual enqueue | First-class `deps` | Pipeline stages | `downstream` option | Explicit `args` refs | Spark DSL `argument` | First-class `depends_on` | Pipeline (sequential) | Explicit list in `compute` |
| **Fan-out/Fan-in** | Built-in `map` steps | Manual | Built-in patterns | Partitioned batches | Manual task chains | Manual DAG build | Manual composition | Partition-based | ForEach with concurrency | Manual composition |
| **State Storage** | PostgreSQL (durable) | PostgreSQL (durable) | PostgreSQL (durable) | In-memory | PostgreSQL | In-memory | In-memory | PG/S3/Parquet | PostgreSQL (durable) | PostgreSQL (durable) |
| **Cross-platform** | Yes (TS + Elixir) | Yes (Elixir + Python) | Yes (Elixir + Python) | Elixir only | Elixir only | Elixir only | Elixir only | Elixir only | Elixir only | Elixir only |
| **Compensation** | Retry with backoff | Retry with backoff | Retry + dep options | N/A | Retry | Max retries | Full saga undo | Retry (via Oban) | Saga rollback + retry | Retry with recovery |
| **Scheduling** | Built-in cron DSL (pg_cron) | Built-in Oban.Cron | Built-in Oban.Cron | N/A | Built-in cron | N/A | N/A | Via Oban | Built-in cron | Built-in tick nodes |
| **Web UI** | Optional LiveView dashboard | Oban.Web (paid) | Oban.Web (paid) | N/A | Included | N/A | N/A | LiveView dashboard | N/A | CLI introspection + analytics |
| **Resource-aware** | No | No | No | Demand-based | No | Yes (cost maps) | No | No | No | No |
| **Dynamic steps** | No | N/A | Yes (grafting) | N/A | No | No | Yes (runtime) | No | Yes (branching) | Yes (conditional logic) |
[PgFlow]: https://github.com/pgflow-dev/pgflow
[Oban]: https://github.com/oban-bg/oban
[Oban Pro Workflow]: https://hexdocs.pm/oban
[Broadway]: https://github.com/dashbitco/broadway
[Gust]: https://github.com/marciok/gust
[Handoff]: https://github.com/polvalente/handoff
[Reactor]: https://github.com/ash-project/reactor
[FlowStone]: https://github.com/nshkrdotcom/flowstone
[Durable]: https://github.com/wavezync/durable
[Journey]: https://github.com/shipworthy/journey
## Other Workflow Engines
| Aspect | [PgFlow] | [Temporal] | [Inngest] | [DBOS] | [Trigger.dev] | [Vercel Workflows] |
| ------------------ | --------------------------- | --------------------------- | --------------------------- | --------------------------- | --------------------------- | --------------------------- |
| **License** | Open source | OSS + Cloud | OSS + Cloud | OSS + Cloud | OSS + Cloud | Paid hosted |
| **Focus** | Cross-language workflow DAGs, jobs and cron | Durable execution platform | Event-driven step functions | Lightweight PG workflows | Durable serverless tasks | AI agent workflows |
| **Coordination** | Database (pgmq) | Temporal Service | Inngest engine | PostgreSQL checkpoints | Durable containers | Vercel queues |
| **Signal Strategy**| Polling + LISTEN/NOTIFY | Long polling | Webhook / polling | Event-driven | Webhook | Event-driven |
| **Dependencies** | First-class `depends_on` | Sequential in code | Step functions | Decorators (`@step`) | `triggerAndWait` | Step isolation |
| **Fan-out/Fan-in** | Built-in `map` steps | Parallel activities | `Promise.all()` steps | DAG `depends_on` | `batchTriggerAndWait` | Parallel steps |
| **State Storage** | PostgreSQL (durable) | Event History | Managed persistence | PostgreSQL checkpoints | Container state | Event log + replay |
| **Cross-platform** | Yes (TS + Elixir) | Go, Java, TS, Python | TS, Python, Go | TS, Python | TypeScript | TypeScript |
| **Compensation** | Retry with backoff | Full saga rollback | Auto-retry + backoff | Auto-retry + recovery | Auto-retry | Deterministic replay |
| **Scheduling** | Built-in cron DSL (pg_cron) | Built-in timers + cron | Built-in schedules | Cron via `Schedule` | Built-in queueing | Sleep (min to months) |
| **Web UI** | Optional LiveView dashboard | Temporal Web UI | Included dashboard | Included dashboard | Included dashboard | Vercel dashboard |
| **Resource-aware** | No | Worker scaling | Serverless | No | Serverless | Serverless |
| **Dynamic steps** | No | Yes (signals/queries) | Yes (branching) | Yes (decorators) | Yes | Yes (hooks) |
[Temporal]: https://github.com/temporalio/temporal
[Inngest]: https://github.com/inngest/inngest
[DBOS]: https://github.com/dbos-inc/dbos-transact-ts
[Trigger.dev]: https://github.com/triggerdotdev/trigger.dev
[Vercel Workflows]: https://vercel.com/docs/workflow