Prerequisites
- macOS for iOS builds, signing, Xcode build data, and Keychain credential storage. The Linux container agent supports portable development jobs.
- Node.js 24.16 or newer in the Node 24 line, for the npm and source installs.
- Homebrew, for the Homebrew install.
- Docker, for the container install.
- Xcode and its command line tools, if you plan to run iOS builds.
Option 1: Homebrew (macOS)
1
Install the service
http://127.0.0.1:3090, with agent GraphQL WebSockets on ws://127.0.0.1:3091/graphql. The formula is maintained in bludesign/homebrew-ai-development-environment.2
Know where things live
The SQLite database is stored under Homebrew’s The service generates Restart with
var/ai-development-environment/, logs are in $(brew --prefix)/var/log/, and every setting — including the credential and Vault variables — lives in the owner-only file:APP_SECRET into that file on first start and defaults APP_ORIGINS to localhost:3090,127.0.0.1:3090, so nothing else is required. Add AUTH_MODE=password to the file if you want the mode written down explicitly. Then start the service:brew services restart ai-development-environment after editing it.To reach this install by any other hostname, add it to APP_ORIGINS in the same file.Option 2: npm
1
Install the server and agent
@ai-development-environment/server is a prebuilt standalone build; @ai-development-environment/control-agent is the agent.2
Start the server
http://127.0.0.1:3090 with agent GraphQL WebSockets on ws://127.0.0.1:3091/graphql. Its SQLite database is stored at ~/.ai-development-environment/production.db.vX.Y.Z release tags — the publish-npm job in .github/workflows/release.yml publishes both via npm trusted publishing on every release. They accept the same server and credential variables as the Homebrew service, but default to database credential storage on every platform.
Option 3: Docker
The production release publishes separate control-plane and Linux-agent images to GitHub Container Registry:/data. The agent is a separate image and opens no listening port.
See Docker for the complete Docker Compose deployment, one-time agent enrollment, persistent AI-provider credentials, and repository or external-disk mounts.
Option 4: From source
1
Clone and install dependencies
2
Configure the database
Copy the example environment file and adjust
DATABASE_URL if you want the SQLite file somewhere other than prisma/dev.db. Only file: URLs are accepted. Set APP_SECRET to the output of openssl rand -base64 32; it is required in development too. Localhost is trusted automatically, so APP_ORIGINS is only needed if you reach the dev server by another hostname.3
Start the development environment
http://127.0.0.1:3000 plus a watch-mode local agent on WebSocket port 3092, leaving ports 3090 and 3091 free for an installed Homebrew service. The agent reuses its identity from ~/.config/control-agent-dev/config.json.On the first run, start npm run dev alone, create your user, and create an enrollment token on Agents. Stop the server, then enroll the development agent:npm run dev:all runs reuse the saved agent_ credential.npm run devstarts only the development server.npm run buildcreates a deployable standalone build, andnpm run startruns it.npm run generateregenerates the Prisma client, bundled GraphQL SDL, and resolver types.npm run db:migratecreates and applies a development migration,npm run db:deployapplies committed ones, andnpm run db:studioopens Prisma Studio.npm run full-checkformats and fixes the project before checking it.
Create the first user
Open the server in a browser. An empty installation sends you to the setup registration page. Create the first account; the server atomically closes self-registration after the account succeeds.
aide_ credentials for GraphQL and MCP clients.
Enroll a control agent
The dashboard needs at least one enrolled agent before it can create worktrees, run commands, or start builds. Every agent connects outbound only and never exposes a listening port.1
Install the agent
@ai-development-environment/control-agent, and npm run dev:all runs its own development agent, so you can skip this step in those cases. Docker users should follow the container enrollment flow.2
Create a one-time enrollment token
Open the Agents page and create an enrollment command. It builds a shell-safe command for you.
3
Run the enrollment on the target machine
--header "Name: value" argument. The agent keeps those headers only in its owner-readable 0600 config and redacts them from status.A machine that reaches the control plane at two addresses — a LAN address at the desk, a public one elsewhere — can hold both. Add --remote-server https://control.example.com and the agent prefers the local address, falling back to the remote one when the local address stops answering. See Local and remote addresses.4
Verify
control-agent enrollment reports whether this machine is enrolled and whether each configured address answers for it, and control-agent doctor diagnoses a failing connection. The credential and stable agent ID live at ~/.config/control-agent/config.json.Set up credential storage
Long-lived Jira, GitHub, cache-server, MCP, iOS signing, App Store Connect, and APNs credentials go through a server-only credential service. The service also stores the connection settings needed to use them, such as the Jira site URL, GitHub App ID, cache-server URL and headers, and Apple key identifiers. Choose a backend withCREDENTIAL_STORAGE_TYPE.
- Database
- Keychain
- Vault
The default for npm, Linux, Docker, and source installs. Payloads are always encrypted with AES-256-GCM, using a key derived from
APP_SECRET. There is nothing to configure and no plaintext mode.CREDENTIAL_STORAGE_TYPE does not migrate anything. Items belonging to the previous backend are reported as mismatched and must be re-entered through their own settings forms.
Optional: public HTTPS
iOS device enrollment, over-the-air installs, and the GitHub webhook need a publicly trusted HTTPS origin. SetPUBLIC_BASE_URL to that origin, or run behind a reverse proxy that sends correct X-Forwarded-Proto and X-Forwarded-Host headers.
Behind Cloudflare Access, bypass only the application’s documented auth and integration routes: localized sign-in/register pages, /api/auth/*, /api/public/*, /api/openapi.json, the two telemetry ingestion routes, and /api/ios/apns-devices. Keep /api/graphql, /api/mcp, Tools REST, first-party push registration, enrollment start/export, and dashboard routes behind Better Auth. Configure Access paths without query strings.
Hosting and networking has the full path list, WAF guidance, and how client IPs are trusted.
Next steps
Action Center
The home screen: live work, pending decisions, failures, and builds ready to
run.
Create a worktree
Branch from Git or a Jira ticket on any enrolled agent, then enable Auto
Sync.
Start a Plan
Survey a codebase read-only, then promote the Plan to a Session.
Connect integrations
Configure GitHub, Jira, Apple services, and development tools.
