Process orchestration
without the JVM
Conduit is a BPMN 2.0 workflow engine that fits in a single binary. No application server. No JVM warm-up. No middleware overhead. Just Rust, PostgreSQL, and your workers.
Single binary
Ships as one executable. No JVM, no app server, no container sprawl. Drop it on a VM or package it in a scratch container.
PostgreSQL is the runtime
All state lives in the database. Atomic token advancement. No separate message broker or state machine service.
Workers are external
Workers poll for tasks over REST. Write them in any language. The engine orchestrates — it never executes business logic itself.
BPMN 2.0 + DMN
20+ element kinds: user / service / script / send / business-rule tasks, embedded subprocesses, boundary events (timer, signal, error), inclusive / parallel gateways, message and signal correlation, DMN decision tables.
FEEL expressions
Gateway conditions and DMN rules use standard FEEL (Friendly Enough Expression Language), the same expression language as Camunda and Zeebe.
Observability + safe rollouts
Prometheus metrics, structured JSON logs, leader election via PostgreSQL advisory locks. Per-version enable/disable lets you stop new instances on a bad deploy while in-flight ones finish cleanly.
What you also get
HTTP push connector
Mark a service task with <conduit:http> and the engine calls your endpoint directly — no worker required. Headers, body templates, retries, and timeouts are configured per task.
Encrypted secrets
Reference secrets as {{secret:my-api-key}} inside connector configs. Secrets are stored encrypted, scoped per organisation, and never logged.
Org & group hierarchy
Multi-tenant out of the box. Organisations contain process groups; groups contain processes and decisions. The web UI ships with a tree sidebar, inline rename, and a draft / promote workflow.
How it works
Conduit models your business process as a BPMN 2.0 diagram. When an instance starts, a token advances through the graph. At each element the engine decides what happens next — all in a single PostgreSQL transaction.
Your Application
│
│ REST API
▼
┌─────────────────┐
│ Conduit │
│ │
│ API Layer │ ◀── Deploy BPMN / Start instances
│ │ │ Complete tasks / Send messages
│ Engine │
│ │ │
│ Job Executor │ ──▶ Timer events / boundary timeouts
│ │ │
│ PostgreSQL │
└─────────────────┘
▲
│ Fetch & lock / Complete
Worker Processes
(any language)
Quick start
Run PostgreSQL
docker-compose up -d
cargo sqlx migrate run Deploy a process
curl -X POST http://localhost:8080/api/v1/deployments \
-F "file=@my-process.bpmn" Start an instance
curl -X POST http://localhost:8080/api/v1/instances \
-H 'Content-Type: application/json' \
-d '{\"process_key\":\"my-process\",\"variables\":{\"amount\":100}}'