Git-native AI orchestration engine. Turn repository events into orchestrated agent work, from issues, PRs, webhooks, or schedules.
Install - Events - Agents - Web UI - Documentation - Development
Polyphony connects your issue trackers to AI coding agents, runs them in isolated workspaces, and shows everything live in a terminal dashboard.
Inspired by OpenAI Symphony, Polyphony brings the same workflow-contract orchestration model to local repositories, but with multiple event sources and multiple agent backends.
brew install penso/polyphony/polyphonyOr build from source:
cargo install --path crates/cliThen run it inside any git repository:
polyphonyOn first start, Polyphony creates a default config at ~/.config/polyphony/config.toml and seeds repo-local agent prompts in .polyphony/agents/.
Polyphony listens for work events from multiple sources:
- GitHub — issues and pull requests
- GitLab — issues via GraphQL
- Linear — issues via GraphQL
- Beads — local Dolt-backed issue tracking
Plug in any combination of AI coding agents:
- Claude — Anthropic's CLI agent
- Codex — OpenAI's Codex CLI via app-server
- Copilot — GitHub Copilot CLI
- Pi — Warp's Pi agent via native RPC
- OpenAI Chat — any OpenAI-compatible API (OpenRouter, Kimi, etc.)
- ACP / ACPX — Agent Communication Protocol agents and bridges
Each agent gets its own workspace (worktree, directory, or clone), a shared workflow policy, retries with fallback chains, and budget-aware throttling.
Polyphony includes a web interface that runs alongside the terminal dashboard. When daemon.listen_port is set, both the TUI and the web UI are available simultaneously:
- SSR dashboard — server-rendered pages for inbox, runs, agents, tasks, and logs
- GraphQL API — query and mutate runtime state, with an interactive playground at
/graphql - WebSocket subscriptions — real-time state updates via GraphQL subscriptions at
/graphql/ws - Jinja templates — HTML templates in
crates/httpd/templates/, easy to customize
just httpd # TUI + web UI on port 8080
just httpd 3000 # TUI + web UI on custom port
just httpd-only # web UI only (no TUI), port 8080Or configure daemon.listen_port in your workflow config to always enable the web UI.
Full reference material lives in docs/:
just format # format code
just lint # clippy + checks
just test # run tests
just httpd # run web UI on port 8080MIT
