Rust · PostgreSQL · Tokio

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

1

Run PostgreSQL

docker-compose up -d
cargo sqlx migrate run
2

Deploy a process

curl -X POST http://localhost:8080/api/v1/deployments \
  -F "file=@my-process.bpmn"
3

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}}'