Local development
Use Node.js 24.x for local development. Running locally lets you test a configuration before a cloud deployment.1
Clone the repository
2
Configure environment variables
.env and fill in the GitHub App credentials plus your ticketing provider’s. For Linear that is:ADMIN_ACCESS_CODE (or configure sign-in), a stable RUNNER_TOKEN_SECRET, and RUNNER_CALLBACK_BASE_URL. The callback URL must be a public HTTPS base URL reachable from GitHub Actions; a hosted job cannot reach your local localhost address. Planning refuses dispatch without the callback URL and secret.Keep RUNNER_TOKEN_SECRET stable: changing it makes stored model credentials unreadable. See Environment variables for these settings and the Jira equivalents.3
Install dependencies
4
Choose how to run the loop
Both modes run the orchestrator on your machine; they differ in where the implementation jobs
run. Pick the one that matches what you want to exercise:Either mode starts the polling loop and HTTP server on port 8080.
- GitHub Actions
- Local Docker
npm run dev — implementation jobs are dispatched to run in GitHub Actions. Use this
for normal local work on the orchestrator when you’re happy to let jobs run in the cloud.npm run dev and npm run dev:local load .env automatically when it exists. Edit the file before starting, and restart the process after changing it.For configured Codex smoke runs, use the local Codex procedure. Managed post-push review-fix support uses GitHub Actions and a healthy Restate connection; see Managed review-fix with Codex.5
Verify it is running
Check the health endpoint:Open the admin UI in your browser at
http://localhost:8080/admin. You will be prompted for the ADMIN_ACCESS_CODE value from your .env file.The admin UI is disabled only when neither
ADMIN_ACCESS_CODE nor a sign-in provider is set. The access code is the simpler choice locally — see Set up admin sign-in for the deployed alternative.Fly.io deployment
For production use, deploy the orchestrator as a Fly.io app. Each client (team or tenant) runs as a separate Fly app.1
Install the Fly CLI and log in
Follow the Fly.io CLI installation guide and run
fly auth login.2
Provision a new client
The Alternatively, create the resources yourself:
scripts/provision-client.sh script walks you through creating a new Fly app interactively:The script signs off by suggesting you commit the
clients/<slug>.toml it wrote and push to deploy. That deploys nothing — the file is ignored by git and nothing reads it. Deploy with the step below instead.3
Set Fly secrets
The orchestrator reads its credentials from Fly secrets at runtime:For managed Codex accounts, also set a stable
RUNNER_TOKEN_SECRET and set RUNNER_CALLBACK_BASE_URL to the app’s public HTTPS base URL. Configure ADMIN_ACCESS_CODE or admin sign-in before adding account credentials. Add notification variables if needed.4
Deploy the app
Fly.io infrastructure details
Each Fly app uses:- Machine size:
shared-cpu-1xwith 2 GB of memory - Volume: A
dedup_datavolume mounted at/datafor SQLite persistence (deduplication, team mappings, and dispatch log) - HTTP service: Internal port 8080, HTTPS enforced, minimum one machine always running
What’s next
Connect a target repo
Sync workflow templates into a GitHub repo and map it to a project in the admin UI.
Environment variables reference
Full reference for every environment variable the orchestrator supports.