Open Conductor is a desktop app for managed local agent swarms.
I wanted something to manage my local agents and often times I find that I end up spinning up multiple ghostty windows and try to manage them.
This app takes heavy inspiration from Conductor and Multica.
flowchart LR
subgraph Monorepo["Open Conductor Monorepo"]
direction LR
subgraph FE["Electron Frontend — apps/desktop"]
MAIN["Electron Main"]
RENDERER["React Renderer"]
MAIN --> RENDERER
end
subgraph SHARED["Shared packages"]
CORE["packages/core API client + workspace context"]
VIEWS["packages/views feature views"]
UI["packages/ui primitives"]
CORE --> VIEWS
UI --> VIEWS
end
subgraph BE["Go backend — server"]
HTTP["HTTP API handlers"]
WS["WebSocket handler /ws"]
RUNNER["Agent runner manager"]
EXEC["Runner executor"]
DB["SQLite"]
HTTP --> RUNNER
RUNNER --> EXEC
HTTP --> DB
WS --> DB
end
CLIS["Local agent CLIs\n(Claude Code / OpenCode / Codex)"]
end
RENDERER -->|REST /api| HTTP
RENDERER -->|WebSocket /ws| WS
CORE --> RENDERER
VIEWS --> RENDERER
EXEC -->|spawn + stdio bridge| CLIS
WS -->|stream task and agent events| RENDERER
- Node.js ≥ 18, pnpm 9
- Go 1.22+
- Optional: Claude Code, OpenCode, and/or Codex on
PATHfor agent features
Copy the environment file. By default DATABASE_URL points at a SQLite file in the repo root:
cp .env.example .env
# Optional: change the path in DATABASE_URLFrom the server directory (with DATABASE_URL set, e.g. via .env in repo root):
cd server
go run ./cmd/migratecd server
go run ./cmd/serverDefault listen address: http://localhost:8080 (override with PORT).
In a second terminal, from the repository root:
pnpm install
pnpm exec turbo dev --filter=@open-conductor/desktopThe renderer is configured to use http://localhost:8080 for the API and ws://localhost:8080/ws for WebSockets (see apps/desktop/src/renderer/src/App.tsx). Start the Go server before the UI.
GitHub DMG builds are not Apple-notarized (no paid Developer ID in CI). After a browser download, macOS adds a quarantine flag; Gatekeeper may show damaged even though the file is fine.
Option A — remove quarantine, then open
After installing, run (adjust the path if your app lives elsewhere):
xattr -dr com.apple.quarantine "/Applications/Open Conductor.app"If the error appears on the .dmg before you copy the app:
xattr -dr com.apple.quarantine ~/Downloads/Open\ Conductor-*-arm64.dmgOption B — Open Anyway
Try to open the app once, then open System Settings → Privacy & Security and use Open Anyway next to the blocked-app notice.
Option C — first open from context menu
Right‑click Open Conductor → Open, then confirm.
A fully silent first launch for everyone requires Developer ID signing + notarization (maintainer setup).
| Variable | Required | Description |
|---|---|---|
DATABASE_URL |
Yes | SQLite DSN, e.g. file:./open_conductor.db (see internal/sqliteutil) |
PORT |
No | HTTP port (default 8080) |
JWT_SECRET |
No | JWT signing for auth routes |
CORS_ORIGIN |
No | CORS allowlist for browser clients |
OPENCODE_PATH |
No | Absolute path or name on PATH for the OpenCode binary (see also MULTICA_OPENCODE_PATH for compatibility) |
See .env.example for a template.
- Discover:
GET /api/detect-agentslists CLIs found on the host. - Connect: Creates an agent record and calls
POST /api/daemon/registerto start the in-process runner for that agent. - Disconnect / reconnect:
POST /api/workspaces/{workspaceId}/agents/{agentId}/disconnectand.../reconnect(workspace-scoped). - OpenCode: Config is read from
XDG_CONFIG_HOME/opencode/opencode.jsonor~/.config/opencode/opencode.json. If no local APIbaseURLis set, discovery treats the install as available without probing a bogus/modelsURL.
pnpm install # This is to install
pnpm build # turbo build
pnpm dev # turbo dev (all packages that define dev)
pnpm lint # turbo lint
pnpm check-types # turbo check-typescd server
go test ./...Live CLI integration pings (Claude / Codex) are opt-in:
INTEGRATION_AGENT=1 go test ./pkg/agent/... -run 'Integration.*Ping' -timeout=10m -vNote for local development, docker is needed.