// the find
chaps-io/gush
Fast and distributed workflow runner using ActiveJob and Redis
Gush is a DAG-based workflow orchestrator for Ruby that runs jobs in parallel using ActiveJob and Redis as its only infrastructure dependency. You define job dependencies with a simple DSL, and Gush figures out what can run concurrently. It fits teams already running Sidekiq or another ActiveJob backend who want workflow coordination without adding a new service.
The DSL is genuinely minimal — `run JobClass, after: [OtherJob]` covers most cases without ceremony. Pipelining (passing `output` from one job's `perform` into downstream `payloads`) avoids the common antipattern of storing intermediate results in a shared DB column just to hand data between steps. Using only Redis means no separate workflow DB to operate. Dynamic workflows built in plain Ruby loops are a real strength — no XML or YAML config format to fight with.
All workflow state lives in Redis, which means no durable audit log — if Redis flushes or TTL expires before you call `expire_workflows`, that workflow history is gone silently. Error handling is thin: a failed job stops its branch but there's no built-in retry-with-backoff at the workflow level, you're fully dependent on whatever retry behavior your ActiveJob backend provides. The `all_workflows` scan for overlap detection is a full Redis scan — fine at small scale, a problem at thousands of workflows. Pagination via raw index offsets (`Workflow.page(0, 99)`) will drift under concurrent inserts, and there's no filtering by status without loading and checking each workflow object.