Open Flow is an open-source workflow automation platform where AI Agents and people build the same
Flow. Ask Codex, Claude Code, or another terminal Agent to create, check, run, and publish a typed
workflow through oo flow, then inspect and edit that exact
Flow visually in the Workbench.
Use typed nodes for structure, keep custom logic as JavaScript, and run the resulting automation on OOMOL Hosted or infrastructure you control. The graph remains understandable, the code remains code, and the deployment remains under your control.
▶ Watch the 1-minute Open Flow demo
Important
Open Flow is in beta. Its contracts are versioned, but the product has not reached its first stable release.
oo flow exposes the authoring lifecycle as versioned, machine-readable commands. An Agent that can
use a terminal can:
- discover exact Connector Actions and Provider Triggers;
- create and edit typed Nodes, Edges, Code Tasks, and Trigger bindings;
- check a Draft, run it, and inspect the result;
- publish it to Live or open the same Flow in the Workbench when you ask.
Example request: “Build a workflow that reads unread Gmail messages, formats them, and sends them to Feishu.”
The Agent creates a real Draft in the selected Open Flow deployment, not a disposable local config. The CLI and Workbench use the same Control API, so an AI-authored change appears in the same visual graph and remains editable by both people and Agents.
Install the oo CLI to author Open Flow from Codex, Claude
Code, or another terminal Agent.
To use your own Open Flow, set OO_OPEN_FLOW_URL and OO_OPEN_FLOW_TOKEN in the shell that runs the
Agent; see Use Open Flow with OpenConnector and oo CLI.
Use the same Open Flow product and Workbench through any supported path.
| ☁️ OOMOL Hosted | 🐳 Docker Self-hosted | Fly.io Self-hosted |
| Ready to use without provisioning, patching, or monitoring a server. OOMOL operates the deployment and provides managed OAuth apps for supported integrations, so you avoid fixed server costs and separate OAuth app setup. | Run on your own infrastructure with the included Docker image. You manage deployment, storage, backups, upgrades, networking, and any Connector or OAuth app setup. | Run the same Docker image on Fly.io without operating a server yourself. Fly builds the image, terminates TLS, and keeps SQLite on a persistent volume; you manage secrets, backups, upgrades, and any Connector or OAuth app setup. |
| 🚀 Use OOMOL Hosted | Self-host with Docker | Deploy to Fly.io |
- Build with an AI Agent. Use
oo flowfrom Codex, Claude Code, or another terminal Agent to create, check, run, and publish the same Flow you see in the Workbench. - Make data dependencies explicit. Every Task declares named, typed inputs and outputs. Each edge binds a specific output value to a specific input, so the graph is the data dependency model used by the runtime.
- Design visually, add code when needed. Compose typed nodes on the canvas, and use Code Tasks for custom JavaScript. Code stays visible instead of being hidden in form fields.
- Run and debug in one place. Validate inputs and the Flow structure before execution, inspect node progress and outputs, and follow the complete event history of every Run.
- Publish long-running automation. Start Flows manually or from Cron schedules, Webhooks, polling sources, and Provider events.
- Keep operational state together. Projects, immutable Revisions, Publications, Live versions, Runs, and Trigger state belong to one selected deployment instead of being split across local files and hidden services.
- Run untrusted code safely. The Server executes every code Task in a fresh V8 isolate inside a long-lived Executor process, with only the Capabilities that Task declared.
- Choose where it runs. Use OOMOL Hosted, or run the included Server with Docker on your own infrastructure.
Open Flow is built for workflows that outgrow a no-code prototype but should not become an opaque collection of scripts and infrastructure.
Every Task declares named, typed inputs and outputs. An edge carries a value from a specific output to a specific input, and the runtime starts a node when its inputs are ready.
The graph shows the data dependencies the runtime actually uses: ordinary Flow data cannot be pulled from arbitrary nodes through a hidden runtime store. Independent branches can run concurrently, and canvas position never changes execution behavior.
Detailed view keeps each input, output, type, nullable constraint, and connection explicit on the canvas.
Code Tasks place custom JavaScript directly in the graph, with typed inputs and outputs.
flowchart LR
Workbench["Workbench"] -->|"Control API"| Server["Open Flow"]
CLI["oo flow CLI"] -->|"Control API"| Server
Server -. "optional" .-> Connector["Connector runtime"]
Connector --> Providers["Third-party Providers"]
Server --> Store["SQLite: Projects, Revisions, Publications, Runs"]
Server --> Triggers["Trigger scheduler: Cron, Webhook, Poll, Integration"]
Server --> Runtime["Isolated JavaScript runtime"]
The Workbench and CLI only talk to one selected deployment through the versioned Control API. The deployment owns validation, execution, persistence, and Trigger admission. Provider credentials never enter Open Flow: Connector-backed Actions, Provider Triggers, and proxies go through a Connector runtime such as OpenConnector, and Open Flow only stores opaque Connection identities.
You need Docker and OpenSSL. Clone the repository, create an operator token, and start the self-hosted Server:
git clone https://github.com/oomol-lab/open-flow.git
cd open-flow
export OPEN_FLOW_TOKEN="$(openssl rand -hex 32)"
docker build --file apps/server/Dockerfile --tag open-flow-server:dev .
docker run --rm \
--publish 3000:3000 \
--env OPEN_FLOW_TOKEN="$OPEN_FLOW_TOKEN" \
--volume open-flow-data:/data/open-flow \
open-flow-server:devOpen http://127.0.0.1:3000 and sign in with the value of
OPEN_FLOW_TOKEN. The same value works as a Bearer token for machine clients of the Control API.
Projects and Run history are persisted in the open-flow-data Docker volume.
To skip the build, pull the prebuilt multi-arch image ghcr.io/oomol-lab/open-flow or start it
with the docker-compose.yml at the repository root. Tags (latest, release versions, tip, and
commit hashes) and upgrade steps are in the Docker image guide.
The Server is useful without external services. Connector-backed Actions, Provider Triggers, and LLM Tasks fail closed until the corresponding host capability is configured; nothing falls back to an undisclosed service.
For production configuration, TLS, health checks, persistence, backup, and resource limits, see the Server deployment guide and the hardening checklist in SECURITY.md.
The same image runs on Fly.io. The repository ships a fly.toml that builds
apps/server/Dockerfile, keeps one machine running for Cron and Poll Triggers, and persists SQLite
on a Fly volume. See docs/server/fly-io/README.md for app creation, volumes,
secrets, deployment, custom domains, and scaling limits.
To run Actions and Provider Triggers against services such as GitHub, Gmail, Slack, or Notion, point the Server at a Connector runtime. Both a self-hosted OpenConnector and the OOMOL-hosted Connector expose the required runtime API.
OPEN_FLOW_CONNECTOR_ORIGIN=http://open-connector:3000
# Optional when the local Connector has runtime authentication disabled.
OPEN_FLOW_CONNECTOR_TOKEN=replace-with-a-scoped-runtime-token
OPEN_FLOW_CONNECTOR_CONSOLE_ORIGIN=https://connector.example.comThe runtime origin is where the Server reaches the Connector; the console origin is where users' browsers open the Connector Console to authorize accounts. Provider Trigger definitions ship with Open Flow and need no registration. See the configuration reference for Integration callback settings and the constraints on each origin.
To start OpenConnector and Open Flow together, create a runtime token, authorize an account, and
build a first Flow with oo flow, see
Use Open Flow with OpenConnector and oo CLI.
The Workbench and CLI speak a versioned Control API rather than depending on a particular database or cloud runtime. A deployment owns execution and persistence; clients do not create a second local project format or silently switch to another backend.
This repository contains:
packages/open-flow: the public@oomol-lab/open-flownpm package with authoring, execution, Trigger, Control API, conformance, and Workbench runtime entries;packages/command: theoo flowcommand runtime and the immutable Command Artifact consumed by the oo CLI;apps/server: the self-hosted Workbench, Control API, SQLite persistence, Trigger scheduler, and isolated JavaScript runtime.
Read the product and architecture boundaries for the durable model, or the Control API reference for the HTTP contract.
Open Flow uses Bun for the workspace and Node.js for the Server. Use the
versions pinned in .bun-version and .node-version.
bun install --frozen-lockfile
bun run devOpen the development Workbench at
http://localhost:5174. Its API requests are proxied to the Server at
http://127.0.0.1:3001. Development uses http://localhost:3000 as the Connector origin by default;
set OPEN_FLOW_CONNECTOR_ORIGIN to override it. The Connector token remains optional.
The first development run creates an operator token at
apps/server/.open-flow-dev/operator-token. Later runs reuse it, so restarting the development
server does not invalidate the current Workbench session. Set OPEN_FLOW_TOKEN to use an explicit
token instead.
Before submitting a change, run:
bun run check
bun run test
bun run buildAdd bun run test:package when touching the published package or CLI, and bun run test:docker
when Docker is available to verify the release image, isolated runtime, Workbench, graceful
shutdown, and SQLite volume recovery. Do not run bun test at the repository root; it bypasses the
workspace test scripts. See CONTRIBUTING.md for the full development rules.
Start with the documentation index. The most useful references are:
- Product and architecture boundaries
- Control API
- Command Artifact distribution
- Workbench and Designer frontend notes
- Server deployment
- Docker image on GHCR
- Fly.io deployment
- Use Open Flow with OpenConnector and oo CLI
- Contributing
- Code of Conduct
- Security
- OpenConnector: open-source connector gateway that provides the Provider catalog, credentials, and Action execution behind Connector-backed nodes.
- oo CLI: local agent toolkit that hosts the
oo flowcommand built from this repository.
Issues and pull requests are welcome. Read CONTRIBUTING.md for the development setup, repository rules, and checks to run before opening a pull request. Participation in this project is governed by CODE_OF_CONDUCT.md.
Please report vulnerabilities privately through GitHub private vulnerability reporting rather than public issues. SECURITY.md describes the supported versions, the disclosure process, what is in scope, and how to harden a self-hosted deployment.
Apache-2.0. Third-party notices for bundled assets are listed in NOTICE.
Thanks to everyone who has helped build Open Flow. Want to join them? See CONTRIBUTING.md.




