- On the orchestrator service itself
- As GitHub Actions secrets on the orchestrator’s own repo (for CI auto-deploy)
- As GitHub Actions secrets on each target repo (read by the synced workflow files when Claude runs).
- Orchestrator runtime
- GitHub Actions CI (orchestrator repo)
- Target-repo workflow secrets
Variables the AI-Implement Node service reads at startup.
- For local development, set on the orchestrator’s
.envfile. - For Fly.io deployment, set on the Fly.io app via
fly secrets set(for sensitive values) or infly.toml’s[env]block (for non-sensitive defaults).
Required
The orchestrator needs the GitHub App credentials plus at least one ticketing provider’s credentials to start.string
required
Numeric ID of the GitHub App the orchestrator uses to authenticate with GitHub and dispatch workflows. Find this on the app’s settings page under General → App ID.
string
required
RSA private key (PEM format) for the GitHub App, used to generate installation tokens. When passing this as an environment variable, newlines in the PEM file must be replaced with literal
\n characters.The private key PEM file contains real newlines. When you set it as an environment variable (e.g. with
fly secrets set), those newlines must be expressed as the two-character sequence \n. Example: "-----BEGIN RSA PRIVATE KEY-----\nMIIE...\n-----END RSA PRIVATE KEY-----".Ticketing
The orchestrator can use Linear, Jira, or both. Expand the provider(s) you use:Linear
Linear
string
required
Required when any project mapping uses
ticketingProvider: linear.Linear personal API key used to poll for issues and update status, labels, and comments. Generate one in Linear under Settings → API → Personal API keys.The key must have access to every Linear team you intend to map. Polling filters only by the AI-Implement label, not by team, so issues in teams the key cannot see are never picked up.
string
default:"https://linear.app"
User-facing Linear workspace URL, used to render issue links in dispatch logs and comments. Optional.
Jira
Jira
string
required
Required when any project mapping uses
ticketingProvider: jira.Atlassian API token (Bearer auth). Create from your Atlassian account under Security → API tokens.string
required
Required when any mapping uses Jira.Jira Cloud tenant ID. Find at
https://<your-site>.atlassian.net/_edge/tenant_info (the cloudId field).string
required
Required when any mapping uses Jira.User-facing Atlassian site URL, e.g.
https://acme.atlassian.net. Used to render issue links in dispatch logs and comments.Service
string
Password for the admin UI at
/admin. If this variable is not set, the admin UI is disabled entirely and all /admin and /api/ routes return 404.string
default:"8080"
HTTP port the orchestrator listens on. The Fly.io internal proxy routes traffic to this port automatically, so you typically do not need to change it.
string
default:"60000"
How often the orchestrator polls for new AI-Implement issues, in milliseconds. Lower values increase ticketing-API usage; values below
10000 are not recommended.string
default:"/data/dedup.sqlite"
Absolute path to the SQLite file used for deduplication, dispatch logging, and project-mapping storage. Defaults to
/data/dedup.sqlite in production (the Fly.io volume mount point) and ./dedup.sqlite when running locally. Change this only if you are mounting the volume at a different path.string
HMAC-SHA256 secret used to validate incoming GitHub webhook payloads. Configure a webhook in each target repo (or at the org level) pointing to
https://<orchestrator-host>/api/github/webhook with this secret. If unset, the orchestrator’s webhook endpoint rejects all requests.Notifications
string
default:"slack"
Notification provider to use when a dispatch succeeds or fails. Accepted values:
slack (default) or teams. Has no effect if NOTIFY_WEBHOOK_URL is not also set.string
Incoming webhook URL for the notification provider. Notifications are skipped silently if this variable is unset. For Slack, this is the URL from your Incoming Webhooks app configuration. For Teams, use the connector webhook URL.
Runner mode
string
default:"default"
Global override for runner execution mode. Accepted values:
default(per-mapping setting wins)gha(force GitHub Actions for all mappings)fly(force Fly Machines)local(force local Docker — for local development)shadow(dispatch via GHA and additionally boot a shadow Fly Machine for testing).
string
Required when
RUNNER_MODE=fly or any mapping uses executionMode: fly-machines.Fly.io app name that hosts the session runners.string
default:"iad"
Default Fly.io region for new session machines.
string
Required when
RUNNER_MODE=fly or any mapping uses Fly Machines.Fly API token scoped to the sessions app. Used to create and destroy Fly Machines for runs.string
default:"ghcr.io/builddownai/ai-implement-runner:latest"
Default container image for Fly Machine sessions. Per-repo overrides via
.ai-implement/image.yml take precedence.string
Container image to use when
RUNNER_MODE=local. Built locally via npm run build:runner:local.string
Base URL the local Docker runner uses to call back to the orchestrator. Typically
http://host.docker.internal:8080 on macOS/Windows or the host’s IP on Linux.Runner callbacks (advanced)
Runner callbacks (advanced)
These configure how Fly Machine and local-Docker runners authenticate their callbacks to the orchestrator. Defaults are correct for most setups.
string
Public base URL the runner uses to call back to the orchestrator (e.g.
https://your-orchestrator.fly.dev). Required for Fly Machines and local Docker runner modes.string
Secret used to mint and validate short-lived runner-callback tokens. Required when
RUNNER_CALLBACK_BASE_URL is set.Gap-fill trigger
Gap-fill trigger
string
Shared bearer secret for the
/trigger/gap-fill endpoint that synced comment-trigger.yml workflows POST to when a user comments /ai-implement on a PR. If unset, the gap-fill trigger endpoint is disabled.Reaper (operational)
Reaper (operational)
Controls the reconciliation sweep that cleans up stale Fly Machine sessions.
string
default:"false"
When
true, the reaper logs what it would destroy but takes no action. Useful for verifying rules before enabling live cleanup.string
Number of destructions in a 24-hour window above which the reaper emits an alert notification (via the configured
NOTIFY_TYPE). Helps catch runaway destruction bugs.Multi-tenant deploys
Multi-tenant deploys
Identifiers used when deploying multiple AI-Implement instances as separate Fly apps from a single repo. Most single-client deployments leave these unset.
string
The client identifier matching this app’s
clients/<slug>.toml file. Used in logs and notifications to disambiguate multi-tenant deployments.string
Fly.io app name for this instance. Read for logging only; the actual Fly deployment binds this automatically.
Claude provider forwarding (Fly Machines / local Docker only)
Claude provider forwarding (Fly Machines / local Docker only)
These are read by the orchestrator and forwarded to runner sessions when
RUNNER_MODE is fly or local.For GitHub Actions runner mode, the synced workflow uses its own repo secrets directly (see the Target-repo workflow secrets tab); these runtime values are unused.string
Anthropic API key, forwarded to the runner session as the Claude auth fallback. Required when
RUNNER_MODE=fly or local and no OAuth token is configured.string
Claude Code OAuth token, forwarded to the runner session. Preferred over
ANTHROPIC_API_KEY when both are set.