A multi-agent orchestration dashboard for AI-assisted kanban-shaped software development.
Operator is for you if:
- you do work assigned from tickets on a kanban board
- you use claude code, codex or gemini to do work
- you are drowning in the soup
and you're ready to start seriously automating your work.
operator is a TUI (terminal user interface) application that uses Tmux to manages multiple Claude Code agents across multi-project workspaces of many codebases. It is designed to be ticket-first, starting claude code keyed off from markdown stories from a ticketing provider. It provides:
- Queue Management: ticket queue with priority-based work assignment, launchable from a dashboard
- Agent Orchestration: Launch, monitor, pause/resume Claude Desktop agents against kanban shaped work tickets, and track the ticket progress as it goes through your defined work implementation steps
- Notifications: macOS and linux notifications for agent events, keeping you the human in the loop.
- Dashboard: Real-time view of queue, active agents, completed work, and waiting instances seeking feedback or human review
Operator is designed to facilitate work from markdown tickets, tackling tasks across multiple code repositories by semi-autonomous agents. Operator should be started from the root of your collective work projects repository (eg, ~/Documents), so that it may start feature or fix work in the right part of the codebase.
When started for the first time, Operator will setup configuration to consume and process work tickets, and identify local projects with claude.md files to setup.
Operator comes with a separate web component, unneeded to do work but purpose built to give you a developer portal to expand their workflows and administrate Operator with ease.
# Launch dashboard
operator
# Quick commands (without entering TUI)
operator queue # Show queue status
operator launch <ticket> # Launch agent for ticket (with confirmation)
operator create # Create a new work ticket
operator agents # List active agents
operator pause # Pause queue processing
operator resume # Resume queue processingβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β operator TUI β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Queue Manager β Agent Manager β Notification Svc β
β - Watch .tickets β - Launch agents β - macOS notifs β
β - Priority sort β - Track status β - Configurable β
β - Work assign β - Pause/resume β - Event hooks β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β State Store (.operator/) β
β - Agent sessions β - Queue state β - Config β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β
βΌ βΌ βΌ
Claude Desktop .tickets/ Third-party
Windows queue/ integrations
Download the latest release for your platform:
# macOS Apple Silicon
curl -L https://github.com/untra/operator/releases/latest/download/operator-macos-arm64 -o operator
chmod +x operator
sudo mv operator /usr/local/bin/
# macOS Intel
curl -L https://github.com/untra/operator/releases/latest/download/operator-macos-x86_64 -o operator
chmod +x operator
sudo mv operator /usr/local/bin/
# Linux x86_64
curl -L https://github.com/untra/operator/releases/latest/download/operator-linux-x86_64 -o operator
chmod +x operator
sudo mv operator /usr/local/bin/
# Linux ARM64
curl -L https://github.com/untra/operator/releases/latest/download/operator-linux-arm64 -o operator
chmod +x operator
sudo mv operator /usr/local/bin/Or build from source:
git clone https://github.com/untra/operator.git
cd operator
cargo build --release
sudo cp target/release/operator /usr/local/bin/Configuration lives in ~/.config/operator/config.toml or ./config/default.toml:
[agents]
max_parallel = 5 # Maximum concurrent agents
cores_reserved = 1 # Cores to keep free (max = cores - reserved)
[notifications]
enabled = true
on_agent_start = true
on_agent_complete = true
on_agent_needs_input = true
on_pr_created = true
sound = false
[queue]
auto_assign = true # Automatically assign work when agents free
priority_order = ["INV", "FIX", "FEAT", "SPIKE"]
[paths]
tickets = "../.tickets"
projects = ".."Work is assigned in priority order (not strict FIFO):
- INV (Investigation) - Failures need immediate attention
- FIX - Bug fixes and follow-up work
- FEAT - New features
- SPIKE - Research (requires human pairing)
Within each priority level, tickets are processed FIFO by timestamp.
| Type | Mode | Parallelism | Human Required |
|---|---|---|---|
| Investigation | Paired | Single | Yes (urgent) |
| Spike | Paired | Single | Yes |
| Fix | Autonomous | Parallel OK | No (launch confirm only) |
| Feature | Autonomous | Parallel OK | No (launch confirm only) |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β operator v0.1.0 βΆ RUNNING 5/7 agents β
βββββββββββββββ¬ββββββββββββββ¬ββββββββββββββ¬ββββββββββββββββββββ€
β QUEUE (12) β RUNNING (5) β AWAITING (1)β COMPLETED (8) β
βββββββββββββββΌββββββββββββββΌββββββββββββββΌββββββββββββββββββββ€
β INV-003 βΌοΈ β backend β SPIKE-015 β β FEAT-040 12:30 β
β FIX-089 β FEAT-042 β "what auth β β FIX-088 12:15 β
β FIX-090 β ββββββββ β pattern?" β β FEAT-041 11:45 β
β FEAT-043 β frontend β β β FIX-087 11:30 β
β FEAT-044 β FIX-091 β [R]espond β β
β FEAT-045 β ββββββββ β β β
β β api β β β
β β FEAT-046 β β β
β β ββββββββ β β β
β β admin β β β
β β FEAT-047 β β β
β β βββββββββ β β β
β β infra β β β
β β FIX-092 β β β
β β ββββββββ β β β
βββββββββββββββ΄ββββββββββββββ΄ββββββββββββββ΄ββββββββββββββββββββ€
β [Q]ueue [L]aunch [P]ause [R]esume [A]gents [N]otifs [?]Helpβ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| Key | Action |
|---|---|
q |
Quit |
Q |
Focus queue panel |
L |
Launch next ticket (with confirmation) |
l |
Launch specific ticket |
P |
Pause all processing |
R |
Resume processing |
A |
Focus agents panel |
a |
View agent details |
N |
Toggle notifications |
? |
Help |
β/β |
Navigate lists |
Enter |
Select/expand |
Esc |
Back/cancel |
Agents are launched by opening Claude Desktop with the appropriate project folder and an initial prompt pointing to the ticket.
Investigations can be triggered externally:
- Webhook endpoint for alerting systems
- File watch for alert drop files
- CLI for manual urgent tickets
# Create urgent investigation from external alert
operator alert --source pagerduty --message "500 errors in backend" --severity S1Operator launches LLM agents via CLI tools in tmux sessions. To be compatible with Operator, an LLM CLI tool must support the following capabilities:
| Flag | Purpose | Example |
|---|---|---|
-p or --prompt |
Accept an initial prompt/instruction | -p "implement feature X" |
--model |
Specify which model to use | --model opus |
--session-id |
UUID for session continuity/resumption | --session-id 550e8400-... |
Operator constructs commands in this format:
<tool> --model <model> -p "$(cat <prompt_file>)" --session-id <uuid>Details:
- Prompt file: Prompts are written to
.tickets/operator/prompts/<uuid>.txtto avoid shell escaping issues with multiline prompts - Session ID: A UUID v4 is generated per launch, enabling session resumption
- Model aliases: Operator uses short aliases (e.g., "opus", "sonnet") that resolve to latest model versions
| Tool | Detection | Models |
|---|---|---|
claude |
which claude + claude --version |
opus, sonnet, haiku |
To add support for a new LLM CLI tool (e.g., OpenAI Codex, Google Gemini):
-
Create a detector in
src/llm/<tool>.rsthat:- Checks if the binary exists (
which <tool>) - Gets version (
<tool> --version) - Returns available model aliases
- Checks if the binary exists (
-
Register the detector in
src/llm/detection.rs -
Update the launcher in
src/agents/launcher.rsto handle the tool's specific CLI syntax
Requirements for the LLM tool:
- Must be installable as a CLI binary
- Must accept prompt via flag (not just stdin)
- Must support model selection
- Should support session/conversation ID for continuity
- Should run interactively in a terminal (for tmux integration)
# Run in development
cargo run
# Run tests
cargo test
# Build release
cargo build --releaseReference documentation is auto-generated from source-of-truth files to minimize maintenance.
| Reference | Location | Source |
|---|---|---|
| CLI Commands | docs/cli/ |
clap definitions in src/main.rs |
| Configuration | docs/configuration/ |
src/config.rs via schemars |
| Keyboard Shortcuts | docs/shortcuts/ |
src/ui/keybindings.rs |
| REST API (OpenAPI) | docs/schemas/openapi.json |
utoipa annotations in src/rest/ |
| Issue Type Schema | docs/schemas/issuetype.md |
src/templates/issuetype_schema.json |
| Ticket Metadata Schema | docs/schemas/metadata.md |
src/templates/ticket_metadata.schema.json |
| Project Taxonomy | docs/backstage/taxonomy.md |
src/backstage/taxonomy.toml |
# Serve docs locally with Jekyll
cd docs && bundle install && bundle exec jekyll serve
# Visit http://localhost:4000
# View OpenAPI spec with Swagger UI
# After starting Jekyll, visit http://localhost:4000/schemas/api/# Regenerate all auto-generated docs
cargo run -- docs
# Regenerate specific docs
cargo run -- docs --only openapi
cargo run -- docs --only config-
--setup jiraoption for jira sync for workspace setup -
--setup linearoption for linear kanban provider -
--setup gitlaboption for gitlab repository provider -
--sync https://foobar.atlassian.net --project ABCoption for jira ticket sync