Self Hosting / Try Flow locally
Verified against Flow 5.0.0-beta.39
This quickstart runs Boomerang Flow on your laptop from the product repository's Docker Compose stack, then runs a first workflow. It's for operators evaluating Flow, and takes about 10 minutes plus the first build.
Flow at http://localhost:3000/apps/flow, with you signed in as its admin, a dispatcher running tasks on your laptop's Kubernetes, and a Hello Flow run with status Succeeded.

You need:
docker compose command, not the older docker-compose.orb config set k8s.enable true, then restart OrbStack.kubectl, to copy OrbStack's cluster details for the dispatcher.127.0.0.1 (MongoDB).Warning
The stack is for evaluation only. Its encryption keys and activation code are published in the repository, and it turns off the dispatcher's authentication. Never carry its settings into a real install.
Clone the repository at the release tag:
git clone --branch 5.0.0-beta.39 https://github.com/boomerang-io/flow.git
cd flowGive the dispatcher your cluster's details. It reads a kubeconfig at docker/kube/config, which the repository doesn't include:
mkdir -p docker/kube
kubectl config view --context orbstack --minify --flatten --raw \
| sed 's#https://127.0.0.1:#https://host.docker.internal:#' > docker/kube/configOrbStack's context points at 127.0.0.1, which inside the dispatcher's container is the container itself. host.docker.internal reaches the cluster from there.
Start the stack with the dispatcher:
FLOW_ENGINE_URL=http://service-core:7700 \
FLOW_DISPATCHER_LOGS_URL=http://service-dispatcher:7702/api/v1/logs/stream \
docker compose --profile stack --profile dispatcher up -d --buildWithout a profile, the stack runs MongoDB, the sign-in provider and the artifact store. The stack profile adds core and the webapp, and the dispatcher profile adds Flow's Kubernetes dispatcher, with the kube-jobs executor. The two variables point the dispatcher at core on the stack's network. Every image builds from source, and core migrates and seeds the database before it serves anything, so the first start takes the longest.
Wait until docker compose ps shows service-core and client-web as (healthy).
Open http://localhost:3000/apps/flow. Flow shows You're not signed in. Select Sign in.
Flow sends you to IDPZero, a local sign-in provider with no passwords. On Sign In to Account, choose Grace Hopper (Admin) under Select user to login as:, then select Sign In.
Flow shows G’day! Let’s activate Boomerang Flow. Enter flow-local-activation-code-for-development in Activation code, and select Submit.
The code is FLOW_ACTIVATION_CODE on service-core in docker-compose.yml. On a new database, the first person to sign in enters it and becomes the admin. Sign-in and the first admin explains how a real install sets its own.
Flow opens on Home, with Admin in the side nav.
The starters under Start a workflow on Home don't make a good first run. Two depend on the HTTP Call tasks, which do nothing in 5.0.0. The third needs a MongoDB to query and a SendGrid account to email the results. Build a one-task workflow instead:
Quickstart, and select Create.Hello Flow, and select Create. The editor opens on its Canvas tab.echo "Hello from Boomerang Flow", then select Update and Apply.The run page shows Running, then Succeeded. Getting started walks through the same steps with screenshots.
Select Activity in the side nav. The Hello Flow run is listed with status Succeeded. A succeeded run proves every part works: sign-in, core, the dispatcher and your Kubernetes.
From the repository folder, check the services:
docker compose ps --format "table {{.Service}}\t{{.Status}}"Each of the six services shows (healthy). The two one-shot setup containers have exited, so they aren't listed.
SERVICE STATUS
client-web Up 2 hours (healthy)
idpzero Up 3 hours (healthy)
mongo Up 3 hours (healthy)
seaweedfs Up 3 hours (healthy)
service-core Up 2 hours (healthy)
service-dispatcher Up 3 hours (healthy)The webapp and core each answer a health check without signing in:
curl http://localhost:3000/apps/flow/health
curl http://localhost:7700/health{"status":"UP"}
{"groups":["liveness","readiness"],"status":"UP"}The dispatcher is connected when its log shows registered as:
docker compose logs service-dispatcher | grep "registered as"service-dispatcher-1 | [2026-11-05 21:19:46.345] [INFO] [44] io.bo.di.sd.Dispatcher : Dispatcher orbstack-kube-jobs (b6d777337d75) registered as <id> for task types [template, custom, script, ai, uploadartifact, downloadartifact].| Symptom | Cause | Fix |
|---|---|---|
up stops with "port is already allocated" |
Something else uses one of the ports in Before you start | Stop it, then run the up command again |
http://localhost:3000 doesn't answer for the first minutes |
Core migrates and seeds the database before it serves anything | Wait until docker compose ps shows service-core as (healthy) |
| No activation screen, and Admin is missing | Someone else signed in first and became the admin | Sign in as that user, or reset as in Stop or reset |
| Execute Shell stays Ready | No dispatcher is connected | Check the dispatcher's log for registered as. If docker/kube/config is a folder, Docker made it because the file was missing: remove it, repeat step 2 of Start Flow, and run the up command again. |
Stop the stack and keep its data:
docker compose --profile stack --profile dispatcher downName the same profiles as up. Without them, down leaves core, the webapp and the dispatcher running.
To start again from an empty database, add -v:
docker compose --profile stack --profile dispatcher down -vWarning
down -v deletes the stack's volumes: the MongoDB database, stored artifacts and the sign-in provider's state. There's no undo. The next start is a new install that asks for the activation code again.
http://localhost:7700 with a token.