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:
polyphony init
polyphonypolyphony init bootstraps WORKFLOW.md, ~/.config/polyphony/config.toml, repo-local agent
prompts, and a starter polyphony.toml when local tracker wiring can be inferred or requested. It
auto-detects GitHub and GitLab remotes, supports explicit pack parameters for tracker/repository
defaults, and prints setup hints for missing tracker or auth wiring.
Starter packs are built in:
polyphony init --list-packs
polyphony init --pack codex
polyphony init --pack multi-agent
polyphony init --pack pipeline-static --tracker github --repository owner/repo
polyphony init --pack codex --tracker linear --project-slug ENGPolyphony 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
