- Start Here
- Installation
Installation
This guide covers how to install Ironflow on your machine.
All public install paths verify against Sigstore cosign keyless signatures — you can confirm any binary or image was built and signed by the official release pipeline before running it.
Server
Section titled “Server”You can run the Ironflow server using Homebrew, Scoop, Docker, Docker Compose, or a direct binary download.
brew tap sahina/tapbrew install ironflow
# Start in dev mode — auth is bypassed, so the dashboard opens straight up# and the API accepts calls with no key. SQLite, port 9123. Start here.ironflow serve --devOther ways to run it (fish):
# Custom port, and open the dashboard in your browserironflow serve --dev --port 8080 --open
# Wipe local dev state (SQLite DB, NATS store, blobs, keys) and start freshironflow serve --dev --reset
# PostgreSQL instead of SQLite. Embedded NATS needs an explicit store directory here# Set IRONFLOW_BLOB_URL and AWS credentials for an existing S3 bucket first.# Keep this key file for restarts.mkdir -p ./dataif not test -s ./data/jwt-secret sh -c 'umask 077; openssl rand -hex 32 > ./data/jwt-secret'endset -gx IRONFLOW_JWT_SECRET (cat ./data/jwt-secret)IRONFLOW_DATABASE_URL="postgres://user:pass@localhost:5432/ironflow" ironflow serve --dev --nats-store-dir ./data/nats --bootstrap-key-file ./data/bootstrap-key.json
# Real mode — auth on. First boot writes an admin API key and the dashboard# password to .ironflow/.ironflow_bootstrap_key.json, and prints the dashboard email.ironflow serve--reset only works together with --dev, and only on SQLite.
The Homebrew formula resolves binaries from the public release mirror (sahina/ironflow-releases); no GitHub token is required.
See the ironflow serve CLI reference for all available flags and options.
scoop bucket add ironflow https://github.com/sahina/scoop-ironflowscoop install ironflow/ironflow
# Start in dev mode. Auth is bypassed, so the dashboard opens straight up# and the API accepts calls with no key. SQLite, port 9123.ironflow serve --devUpgrade with scoop update ironflow. The manifest resolves binaries from the public release mirror (sahina/ironflow-releases), so no GitHub token is required. Both x64 and arm64 are published.
The same bucket carries Ironflow Desktop as ironflow/ironflow-desktop.
See the ironflow serve CLI reference for all available flags and options.
docker pull ghcr.io/sahina/ironflow-releases:latest
# --dev bypasses auth: no login, no API key. Drop it for a real deployment.docker run -p 9123:9123 ghcr.io/sahina/ironflow-releases:latest serve --devThe image is published to public GitHub Container Registry. To verify the signature before running:
cosign verify ghcr.io/sahina/ironflow-releases:latest \ --certificate-identity-regexp '^https://github\.com/sahina/ironflow/\.github/workflows/release\.yml@(refs/heads/main|refs/tags/v.*)$' \ --certificate-oidc-issuer 'https://token.actions.githubusercontent.com'See the ironflow serve CLI reference for all available flags and options.
Run Ironflow with PostgreSQL, NATS JetStream and an S3 store on one machine. This starts the Starter size (one Ironflow node). Needs Docker Compose v2.23.1 or later and openssl.
git clone --depth 1 https://github.com/sahina/ironflow-releases.gitcd ironflow-releases/deploy/docker-compose/cluster./init-env.sh # writes .env and prints the admin API key and dashboard logindocker compose -f docker-compose.starter.yml up -dThe API and dashboard are at http://localhost:9123. Keep a copy of .env.
Docker Compose covers the other sizes (single node, Cluster, HA), logging in, upgrades and backups.
# Read the current tag from the releases page and set it here:# https://github.com/sahina/ironflow-releases/releases/latestVERSION=v0.0.0 # ← replace
curl -fL -o ironflow.tar.gz \ "https://github.com/sahina/ironflow-releases/releases/download/${VERSION}/ironflow_${VERSION#v}_linux_amd64.tar.gz"curl -fL -o ironflow.tar.gz.bundle \ "https://github.com/sahina/ironflow-releases/releases/download/${VERSION}/ironflow_${VERSION#v}_linux_amd64.tar.gz.bundle"
# Verify the signature against the release-pipeline OIDC identitycosign verify-blob \ --certificate-identity-regexp '^https://github\.com/sahina/ironflow/\.github/workflows/release\.yml@(refs/heads/main|refs/tags/v.*)$' \ --certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \ --new-bundle-format \ --bundle ironflow.tar.gz.bundle \ ironflow.tar.gz
tar xzf ironflow.tar.gz
# --dev bypasses auth: no login, no API key. Drop it for a real deployment../ironflow serve --devSubstitute linux_amd64 with linux_arm64, darwin_amd64, darwin_arm64 (use .tar.gz), or windows_amd64 / windows_arm64 (use .zip) as appropriate.
Desktop App
Section titled “Desktop App”Ironflow Desktop is a free GUI front-door to Ironflow. It bundles the engine, so you can run functions, browse events, and work with the AI agent without touching the CLI.
Download Ironflow DesktopBuilds for each platform:
-
macOS (Apple Silicon) — the supported platform.
.dmg, signed and notarized, opens normally. No Intel build is published; Intel Macs are not supported. -
Windows (x64) — experimental. Install via Scoop (
scoop bucket add ironflow https://github.com/sahina/scoop-ironflowthenscoop install ironflow/ironflow-desktop); the direct-download-setup.exeis not yet Authenticode-signed and triggers a SmartScreen warning. -
Linux (x64 and arm64) — experimental.
.AppImage, one per CPU. Match it touname -m:x86_64→-x86_64.AppImage,aarch64→-arm64.AppImage.Keyring prompt on first launch. On GNOME you may see an Authentication required dialog asking to unlock the login keyring, sometimes with “the password you use to log in no longer matches that of your login keyring”. This dialog comes from GNOME Keyring, not Ironflow: the app encrypts stored secrets (provider API keys, the delete token) with the system keyring via libsecret. The message means the login keyring was created with a different password than your current one — typical after auto-login, a password change, or a cloned VM image. Cancelling lets the app start, but secrets fall back to obfuscation instead of encryption and the app shows an insecure-keychain warning. To fix it, reset the login keyring and sign in again:
Terminal window rm ~/.local/share/keyrings/login.keyringLog out and back in; GNOME recreates the keyring with your session password. This deletes secrets other apps stored in that keyring. Alternatively, open Passwords and Keys (seahorse) and change the Login keyring password to match your account.
Windows and Linux builds ship on every release and auto-update, but are not regularly tested. See platform support for what that means.
Direct installs auto-update from the release feed. For Scoop installs, update with scoop update ironflow-desktop.
See the Ironflow Desktop guide for workspaces, templates, and the built-in agent.
TypeScript SDK
Section titled “TypeScript SDK”The TypeScript SDK is published as four packages under the @ironflow organization on npm. All packages are public and install without authentication. A fifth public package, @ironflow/agent, is a CLI, not an SDK library: it is the Ironflow agent for ACP editors, run with npx.
| Package | Description |
|---|---|
@ironflow/core | Shared types, schemas, utilities (used by every other package) |
@ironflow/node | Workers, serve handlers, step execution (Node.js) |
@ironflow/browser | Real-time subscriptions, workflow triggers (browser) |
@ironflow/langgraph | LangGraph saver — durable checkpoint surface for LangGraph agents |
npm install @ironflow/node # for Node.js / server-side workersnpm install @ironflow/browser # for browser / client-sidenpm install @ironflow/langgraph@ironflow/node, @ironflow/browser and @ironflow/langgraph each depend on @ironflow/core, so installing one pulls it in. Install @ironflow/core directly when your code imports from it. pnpm does not let you import a package that is not a direct dependency.
See the JavaScript SDK API reference for full package documentation.
Go SDK
Section titled “Go SDK”The Go SDK is published to a public mirror on every release and indexes on pkg.go.dev. It is a drop-in Go module — no private-repo access required.
go get github.com/sahina/ironflow-go/ironflow@latestOr pin to a version — mirror tags match the engine release, so take the tag from the releases page:
go get github.com/sahina/ironflow-go/ironflow@v0.0.0 # ← replaceSee the Go SDK API reference for full documentation.
Python SDK
Section titled “Python SDK”The Python SDK is a generated client for the REST API (IronflowClient), plus a generated ConnectRPC client (IronflowRPC / AsyncIronflowRPC) for the capabilities REST does not expose — webhook management, agent tools, time travel, pub/sub consumer groups, function versioning. ConnectRPC is part of the default contract rather than an optional extra, so the package depends on connectrpc and pyqwest; the REST client itself uses only urllib and json from the standard library.
The package ships the pull worker (ironflow.worker), the push handler
(ironflow.serve), projections, and the REST and ConnectRPC clients. See the
SDK Comparison matrix for the full feature breakdown.
A durable function and a client call, for reference (Python 3.10+):
from protobuf.wkt import Struct
from ironflow import IronflowClient, IronflowRPCfrom ironflow.rpc import v1
client = IronflowClient( server_url="http://localhost:9123", api_key="ifkey_...",)
with IronflowRPC(server_url=client.server_url, api_key=client.api_key) as rpc: # Emit an event rpc.events.emit( v1.TriggerRequest( event="order.placed", data=Struct.from_python({"order_id": "123", "total": 99.99}), ) )
# List runs runs = rpc.runs.list(v1.ListRunsRequest())from ironflow.worker import Worker, function
@function(id="process-order", triggers=[{"event": "order.placed"}])async def process_order(ctx): return await ctx.step.run("charge", lambda: {"charged": ctx.event.data["total"]})
Worker(functions=[process_order]).run() # pull mode; blocks until Ctrl+CSee the Python SDK API reference for full documentation.
Verifying Release Integrity
Section titled “Verifying Release Integrity”Every public artifact is signed via Sigstore cosign keyless. The expected signing identity is the release.yml workflow on a versioned tag in sahina/ironflow. If cosign verify ever fails on a downloaded artifact, do not run it — email the security address in the LICENSE with the exact cosign verify output.
Next Steps
Section titled “Next Steps”- Getting Started — Emit events, projections, and time-travel in 5 minutes
- AI Skills —
ironflow skills syncto make your coding agent an Ironflow expert - Docker Compose — Single node and cluster sizes with PostgreSQL, NATS and S3
- Workflow Guide — Learn about recorded execution (durable workflows)
- JavaScript SDK Reference — Full TypeScript/JavaScript API documentation
- Go SDK Reference — Full Go API documentation
- Python SDK Reference — Full Python API documentation
- Licensing — Permitted purposes, worked examples, commercial licensing