quickstart
workflowdev

Quick Start

Get the workflow engine running locally in under 5 minutes.

Prerequisites

  • Docker and Docker Compose

1. Clone and configure

git clone https://github.com/excalibase/excalibase-workflow.git
cd excalibase-workflow

cp .env.example .env

Edit .env to add API keys if you want to use AI tasks:

OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-ant-...
GEMINI_API_KEY=...

These are optional. HTTP, transform, script, and flow control tasks work without any keys.

2. Start all services

docker compose up -d --build

This starts 6 services:

ServicePortDescription
postgres5434PostgreSQL 16 with pgvector
nats4222NATS JetStream message queue
dind2375Docker-in-Docker for script tasks
backend8080API server (Go)
workerTask worker (scales independently)
frontend3000Web UI (React)

On first boot, database migrations run automatically and 3 demo workflows are seeded.

3. Open the UI

http://localhost:3000

You'll see the dashboard with the seeded workflows ready to run.

4. Run your first workflow

Via the UI

Click Run on any workflow in the dashboard.

Via the API

# List available workflows
curl -s http://localhost:8080/api/v1/flows | jq '.[].name'
# → "hello-world"
# → "data-pipeline"
# → "http-transform"

# Get a flow ID
FLOW_ID=$(curl -s http://localhost:8080/api/v1/flows | jq -r '.[0].id')

# Execute it
curl -s -X POST http://localhost:8080/api/v1/flows/$FLOW_ID/execute | jq
# → { "executionId": "...", "status": "QUEUED", "tasksTotal": 3 }

5. Check execution status

EXEC_ID="<executionId from above>"

curl -s http://localhost:8080/api/v1/executions/$EXEC_ID | jq '{
  status: .execution.status,
  duration: .execution.durationMs,
  tasks: [.tasks[] | {name: .taskName, status: .status}]
}'
{
  "status": "SUCCESS",
  "duration": 1650,
  "tasks": [
    { "name": "seed-data", "status": "SUCCESS" },
    { "name": "high-scorers", "status": "SUCCESS" },
    { "name": "ranked-users", "status": "SUCCESS" },
    { "name": "summary", "status": "SUCCESS" }
  ]
}

6. Create your own workflow

curl -X POST http://localhost:8080/api/v1/flows \
  -H "Content-Type: application/json" \
  -d '{
    "name": "my-first-workflow",
    "yamlContent": "name: my-first-workflow\ntasks:\n  - name: greet\n    type: transform.set\n    properties:\n      values:\n        message: Hello from my workflow!\n  - name: log-it\n    type: util.log\n    depends_on: [greet]\n    properties:\n      message: '\''{{ outputs[\"greet\"][\"message\"] }}'\''\n"
  }'

Or create it via the UI editor at http://localhost:3000/workflows/new.

Scale workers

# Run 3 workers for higher throughput
docker compose up -d --scale worker=3

Next steps