Skip to content

Symphony

Run OpenAI Symphony with agentkernel for isolated orchestration of autonomous coding agents.

Quick Start

Symphony is an orchestration daemon that monitors issue trackers (Linear), spawns autonomous coding agents (Codex), and manages the full lifecycle of implementation runs. It turns project management boards into autonomous coding pipelines.

# Option 1: Use the built-in template
agentkernel run --template symphony-sandbox -- elixir --version

# Option 2: Use the Dockerfile example
agentkernel sandbox create symphony-dev --config examples/agents/symphony/agentkernel.toml
agentkernel sandbox start symphony-dev
agentkernel attach symphony-dev

Setup

1. Install agentkernel

brew tap thrashr888/tap && brew install agentkernel
# Or: curl -fsSL https://raw.githubusercontent.com/thrashr888/agentkernel/main/install.sh | sh

2. Create and start a sandbox

agentkernel sandbox create symphony-dev --config examples/agents/symphony/agentkernel.toml
agentkernel sandbox start symphony-dev

3. Configure and launch Symphony

agentkernel attach symphony-dev

# Inside the sandbox, create a WORKFLOW.md:
cat > /workspace/WORKFLOW.md << 'WORKFLOW'
---
tracker:
  kind: linear
  project_slug: "YOUR-PROJECT-SLUG"
  api_key: "$LINEAR_API_KEY"
  active_states: ["Todo", "In Progress"]
  terminal_states: ["Closed", "Cancelled", "Done"]

polling:
  interval_ms: 30000

workspace:
  root: /workspace/symphony-workspaces

hooks:
  after_create: |
    git clone --depth 1 git@github.com:your-org/your-repo.git .

agent:
  max_concurrent_agents: 5
  max_turns: 20

codex:
  command: codex app-server
  approval_policy: never
  thread_sandbox: workspace-write
---

You are working on issue {{ issue.identifier }}: {{ issue.title }}

{{ issue.description }}
WORKFLOW

# Run Symphony with dashboard
cd /opt/symphony/elixir && mix run -- /workspace/WORKFLOW.md --port 4000

API Keys

Symphony requires two API keys:

# Linear (for issue tracking)
export LINEAR_API_KEY=lin_api_...

# OpenAI (for Codex agent)
export OPENAI_API_KEY=sk-...

Configuration

Symphony uses a single WORKFLOW.md file with YAML front matter and a Liquid-templated Markdown prompt body.

Key configuration sections:

Section Purpose
tracker Linear project connection and state mapping
polling How often to check for new issues
workspace Where to create per-issue workspaces
hooks Shell scripts for workspace setup (e.g., git clone)
agent Concurrency limits and turn limits
codex Codex CLI command, approval policy, sandbox mode

The example config at examples/agents/symphony/agentkernel.toml:

[sandbox]
name = "symphony-sandbox"

[build]
dockerfile = "Dockerfile"

[resources]
vcpus = 2
memory_mb = 2048

[security]
profile = "moderate"
network = true
mount_cwd = true

HTTP API

When started with --port, Symphony exposes a dashboard and API:

Endpoint Description
GET / Live dashboard
GET /api/v1/state JSON system state
GET /api/v1/<issue> Per-issue status
POST /api/v1/refresh Force immediate poll

Environment Variables

Variable Required Description
LINEAR_API_KEY Yes Linear API key
OPENAI_API_KEY Yes OpenAI API key for Codex
SYMPHONY_WORKSPACE_ROOT No Override workspace directory
CODEX_BIN No Custom path to Codex executable

What's Included

The sandbox image includes:

  • Elixir 1.19 with OTP 28 - Runtime for Symphony
  • Node.js 22 - For Codex CLI
  • Codex CLI - @openai/codex (coding agent)
  • Git - Version control
  • bash - Shell

Customizing

Create a custom Dockerfile based on the example:

FROM elixir:1.19-otp-28-slim

# Base tools + Node.js
RUN apt-get update && apt-get install -y --no-install-recommends \
    git bash ca-certificates gnupg curl \
    && curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \
    && apt-get install -y nodejs \
    && rm -rf /var/lib/apt/lists/*

# Codex CLI
RUN npm install -g @openai/codex

# Symphony
RUN mix local.hex --force && mix local.rebar --force
RUN git clone --depth 1 https://github.com/openai/symphony.git /opt/symphony \
    && cd /opt/symphony/elixir && mix deps.get && mix compile

# Your additions
RUN npm install -g your-custom-tools

WORKDIR /workspace