Conductor is an orchestration engine where workflows are JSON definitions interpreted by a stateless server. Every decision is derived from persisted state — which is why killing a worker, or even the server, never loses a workflow. Scroll down and run the simulation to see it happen.
Four planes: clients that start workflows, a stateless server that decides, external workers that execute, and storage that remembers. Hover each block for its job description.
/tasks/poll/{type} here.every arrow into the server is initiated from outside · the server never dials out to workers
This is the greet_flow you built. Start it and watch the full cycle. Then run it again and hit Kill worker while the task is IN_PROGRESS — the lease expires, the Sweeper catches it, and a retry is scheduled.
--:--:--conductor server ready · press “Start workflow”
A task is a lease with deadlines — like a DHCP lease. Silence past a deadline is treated as failure; nothing ever depends on a live connection to the worker.
Four integration surfaces. Note the direction of each arrow — the only outbound calls the server ever makes are system tasks and event sinks it was explicitly told to call.
SDKs for Python, Java, Go, C#, JS/TS, Clojure. Each worker long-polls its task queue over HTTP — works from Kubernetes pods, VMs, behind NAT, from another site. One workflow can mix languages per task.
The server itself calls your services: HTTP task hits any REST endpoint (your FastAPI, NetBox, a device API gateway), SUB_WORKFLOW composes workflows, SWITCH/FORK_JOIN add control flow — zero worker code.
Eventing bridges message buses: an incoming Kafka / SQS / AMQP / NATS message can start a workflow or complete a WAIT task; an EVENT task publishes back to the bus. This is how Conductor joins event-driven pipelines.
Everything is a REST call: start/pause/terminate workflows, complete tasks from external systems (human approval, a ticketing hook), query state. Your CI, ChatOps bot, or an AI agent can drive workflows the same way the UI does.
Server and workers are stateless. Restart all of them mid-flight: 1000 RUNNING workflows resume, because the Sweeper re-decides each one from persisted state.
A JSON definition interpreted by the Decider. No deterministic replay (Temporal's model) — the current state is stored explicitly, so “resume” is just “read and continue”.
Workers dial in. No inbound ports on workers, trivial scale-out, and the queue guarantees exactly one worker picks up each task.
Event-driven Decider for speed, periodic Sweeper for completeness — the same watch-plus-reconcile pattern as a Kubernetes controller.