Symphony turns project work into isolated, autonomous implementation runs, letting teams manage work instead of supervising coding agents.
In this demo video, Symphony monitors a Linear board for work and spawns agents to handle each ticket. The agents complete the tasks and provide proof of work (CI status, PR review feedback, walkthrough videos). When accepted, the agents land the PR safely. Engineers don't supervise the agents; they manage the work at a higher level.
Warning
Symphony is a low-key engineering preview for testing in trusted environments.
- Node 22 (version pinned in
.nvmrc; pnpm comes from corepack) - TypeScript, strict mode
- Hono HTTP server on port 4000
- SQLite via
better-sqlite3+ Drizzle ORM at.symphony/symphony.db - Vite + React + Tailwind dashboard
- Vitest unit and eval suites
# 1. Install deps (uses pnpm via corepack; see .nvmrc for the Node version)
corepack enable
pnpm install
# 2. Copy the env template and fill in LINEAR_API_KEY if you want real-agent mode
cp .env.example .env
# 3. Try mock mode — no API key or claude CLI needed
pnpm build:web
pnpm dev WORKFLOW.md --mock
# 4. Open the dashboard
open http://localhost:4000- Mock mode (
--mockoragent.kind: mockinWORKFLOW.md): scripted YAML scenarios underfixtures/scenarios/play back through the full orchestrator — workspace creation, turn streaming, tracker transitions, persistence — without spawning the realclaudeCLI or hitting Linear. Scenarios are picked by matching issue labels; unmatched issues round-robin through the full scenario list. - Real mode (default when
agent.kind: claude_code): usesLinearTrackerto poll a Linear project andClaudeCodeAgentto spawnclaude --output-format stream-json --printfor each ticket. RequiresLINEAR_API_KEYand theclaudeCLI on$PATH.
pnpm dev WORKFLOW.md # run the orchestrator (default subcommand: run)
pnpm dev WORKFLOW.md --mock # mock mode with built-in demo issues
pnpm dev WORKFLOW.md --mock --no-demo # empty state, no seeded issues
pnpm dev WORKFLOW.md --mock --seed my-issues.yaml # seed from YAML
pnpm tsx src/cli.ts replay <runId> --speed 5 # replay a past run over SSE
pnpm build:web # build the dashboard bundle into dist/web
pnpm all # typecheck + fmt:check + lint + test + eval
pnpm eval # run the scenario eval suite onlyEvery agent event writes two artifacts:
- A row in SQLite at
.symphony/symphony.db(runs,turns,log_events). Queryable by future agents running in a loop —sqlite3 .symphony/symphony.db "select * from turns limit 5". - A JSONL line under
.symphony/logs/<runId>.jsonlwith the stable shape{ ts, run_id, turn_id, event_type, issue_id, payload }.
The HTTP API exposes /api/runs, /api/runs/:id, /api/events (SSE), and /api/search?q=....
Symphony follows OpenAI's harness engineering playbook: knowledge lives in
a structured docs/ tree, and AGENTS.md is a ~120-line table of
contents that points into it. Start there.
AGENTS.md— cross-agent entry point (Claude Code, Codex, ...).ARCHITECTURE.md— layered domain map.docs/— design notes, product specs, reliability + security invariants, exec plans, stack references.PROGRESS.md— long-running plan state.CLAUDE.md— Claude-Code-specific entry point (redirects toAGENTS.md).
Run pnpm all before committing.
Apache License 2.0. See LICENSE.
