StepChange is a DBOS control plane focused on workflow operations, inspection, and replay.
This repository is primarily about the control plane itself: a standalone service that sits between DBOS executors and an operator-facing UI/API. The sample apps in go, typescript, python, javalin, spring-boot, and micronaut are here to show the control plane working end-to-end across multiple SDKs and serialization formats.
StepChange provides:
- A browser dashboard for inspecting workflows, steps, queued work, executor state, and request history.
- A conductor bridge that speaks to DBOS executors over WebSocket.
- Operator actions for workflow recovery, cancel, resume, restart, and fork.
- Edited fork support so operators can replay workflows with rewritten inputs or preserved step outputs.
- Cross-language workflow inspection and reruns across multiple DBOS serialization formats.
The UI at GET / is a static single-page app served by FastAPI. It shows:
- Current executor connection state and metadata.
- Recent control-plane events and request/response history.
- Workflow lists, queued workflows, workflow details, and step details.
The WebSocket endpoint lives at WS /websocket/{app_name}/{conductor_key} and supports:
list_workflowslist_queued_workflowsget_workflowlist_stepsrecovery,cancel,resume,restartfork
Beyond native forks, StepChange adds an edited-fork path that can stage or run a rewritten fork directly against the DBOS system database. You can:
- Seed editable workflow input from the source workflow's persisted input.
- Override workflow inputs before re-execution.
- Override preserved step outputs before the restart point.
The control plane understands multiple serialization formats used by the sample apps so workflows can be inspected and rerun across languages and frameworks.
Portable serialization is the recommended default. It is the best-supported option here, the easiest format to understand when inspecting workflow state, and it gives StepChange the cleanest path to better UI/UX over time. In particular, it opens the door to much nicer workflow input and step-output editing experiences later instead of forcing operators to work directly with raw JSON-shaped payloads everywhere.
This repo has two main parts:
stepchange/: the actual control plane service.- Sample apps: containerized DBOS applications used to exercise the control plane across Go, TypeScript, Python, Javalin, Spring Boot, and Micronaut.
The sample apps intentionally include crash-and-recovery flows such as name=poison so you can test operator features in a realistic way.
This repo also includes a custom Micronaut DBOS integration under micronaut/dbos-micronaut so the Micronaut sample can participate in the same StepChange workflows as the other apps.
Because apparently shipping a control plane and a custom DBOS Micronaut integration in the same repo was the sensible thing to do.
Build the StepChange image first:
docker build -t stepchange:latest .Then run one of the sample stacks. For example, the Go stack:
docker compose -f docker-compose-go.yml up --buildThe services will be available at:
- App:
http://localhost:8000 - StepChange dashboard:
http://localhost:8001
To enable more detailed logs for both the app and the control plane:
APP_LOG_LEVEL=info APP_ACCESS_LOG=true \
CONTROL_PLANE_LOG_LEVEL=info CONTROL_PLANE_ACCESS_LOG=true \
docker compose -f docker-compose-go.yml up --build- Start a stack with
docker compose -f docker-compose-go.yml up --build. - Open
http://localhost:8000/?name=worldto create a successful workflow. - Open
http://localhost:8000/?name=poisonto trigger an intentional crash. - Let Docker Compose restart the app.
- Open
http://localhost:8001and use StepChange to inspect the workflow and trigger recovery.
- Start a stack with
docker compose -f docker-compose-go.yml up --build. - Open
http://localhost:8000/?name=worldto create workflow history. - Open
http://localhost:8001and list workflows. - Use the fork action on a workflow row.
- Choose the step to restart from and optionally edit workflow input or preserved step outputs.
- Submit the fork and confirm the new workflow appears in the list.
docker compose downTo also remove database volumes:
docker compose down -v