█████╗ ██████╗ ███╗ ███╗ █████╗ ██████╗ █████╗
██╔══██╗██╔══██╗████╗ ████║██╔══██╗██╔══██╗██╔══██╗
███████║██████╔╝██╔████╔██║███████║██║ ██║███████║
██╔══██║██╔══██╗██║╚██╔╝██║██╔══██║██║ ██║██╔══██║
██║ ██║██║ ██║██║ ╚═╝ ██║██║ ██║██████╔╝██║ ██║
╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝
Live supervision for your coding agents. Real-time status, persistent sessions, any device.
Start a Claude Code or OpenCode agent on your laptop, close it, and pick up where you left off — from any device on your network.
Armada gives you fleet management for coding agents: persistent tmux sessions, a web dashboard, and real-time status visibility. Know instantly which agents are working, waiting for approval, or stuck.
- Agent status — every agent reports
idle,active,pending, orerror. See which agents are blocked or waiting for input at a glance. - Persistent sessions — built on tmux: reconnect, multiplex, survive disconnects. No custom runtime to maintain.
- Web dashboard — manage agents from your browser, phone, or tablet. Scan the QR code to open on other devices.
- Delegation — agents can spawn child workers, delegate tasks, and run in parallel.
- One command —
armadastarts the server and opens the dashboard.
Prerequisites: Python 3.10+, tmux, and either OpenCode or Claude Code installed on your PATH.
pip install armada-ai
armada setup # install agent skills for OpenCode and Claude Codearmada is now available. You can also install from source or run via Docker — see below.
Docker
docker build -t armada .
docker run -d -p 9100:9100 --name armada armadaFrom source
git clone https://github.com/rguiu/armada.git
cd armada
bash install.sharmada # start server + open dashboardOpen http://127.0.0.1:9100.
- Register a project — sidebar Projects → + Add. Give it an ID, name, and directory path.
- Create a node — click + Node, pick a project, choose an agent type (OpenCode, Claude Code, or Bash), optionally add an initial prompt.
- Attach — select the node and click Attach. Opens in iTerm2 (macOS) for full TUI, or in-browser via xterm.js.
- Monitor — the dashboard updates every 10 seconds. See status, activity logs, and task history.
- Connect other devices — scan the QR code in the sidebar to open the dashboard on your phone or tablet.
Armada supports both Claude Code and OpenCode as first-class agents. Each integrates differently:
OpenCode is an open-source AI coding agent. Armada's OpenCode integration uses:
- Plugin system — an
armada-pendingplugin hooks into OpenCode's event loop (tool start/stop, permission requests, step completion). Agents automatically reportactive,idle, orpendingstatus to Armada. - Skills —
armada-nodeandarmada-workerskill files teach agents how to report status, spawn children, and send results.
To use OpenCode: install it, make sure opencode is on your PATH, and run armada setup. When creating a node, select "opencode" as the agent type.
Claude Code is Anthropic's official CLI agent. Armada's Claude Code integration uses:
- Hook system — four shell hooks (
claude-pre-tool.sh,claude-post-tool.sh,claude-stop.sh,claude-permission.sh) fire on tool use, idle transitions, and permission requests. These curl the Armada API to report status. - Skills — the same skill files are installed to
~/.claude/skills/and auto-activate whenARMADA_NODE_NAMEis set.
To use Claude Code: install it via npm install -g @anthropic-ai/claude-code, make sure claude is on your PATH, and run armada setup. When creating a node, select "claude" as the agent type.
Bare shell nodes without an agent. Useful for running scripts or manual commands. Armada provides a bash wrapper (armada-bash.sh) with functions like armada_report_active, armada_spawn, and armada_kill_child.
| OpenCode | Claude Code | |
|---|---|---|
| Install | pip install opencode |
npm install -g @anthropic-ai/claude-code |
| Status reporting | Plugin (TypeScript, event-driven) | Shell hooks (pre/post-tool, stop) |
| Permissions | Permission events in plugin | claude-permission.sh hook |
| Cost tracking | Token usage from step-finish events | Not built in |
| Best for | Open-source workflows, custom plugins | Anthropic ecosystem, official support |
Either works. Pick based on which agent you already have installed.
| Command | Description |
|---|---|
armada |
Start daemon + open dashboard |
armada --no-browser |
Start server without opening browser |
armada start |
Start daemon in background |
armada stop |
Stop the daemon |
armada watch |
Interactive terminal dashboard (htop-style) |
armada create -p <project> |
Create a new agent node |
armada nodes |
List all agents in a table |
armada attach <name> |
Attach to a node by name (iTerm2) |
armada projects |
List projects |
armada projects add <id> <name> <path> |
Register a project |
armada projects rm <id> |
Remove a project |
armada setup |
Install skills to user profile |
armada version |
Print the Armada version |
armada token |
Print the auth token |
armada token --qr |
Print token as scannable QR code |
armada config |
Show or set configuration |
armada config set <key> <val> |
Change a config value (default_agent, port, etc.) |
armada service install |
Install as system service (launchd/systemd) |
armada status |
Show server health and agent counts |
armada doctor |
Clean up stale tmux sessions and DB state |
armada --lan |
Bind server to LAN IP (access from other devices) |
armada watch is a live terminal dashboard for managing agents without a browser:
$ armada watch
Nodes Projects | 3 active 1 pending 12 idle | 23 agents
● HOOK20 ▣ idle PGLease unknown needs external_directory
○ HOOK18 idle PGLease server restarted — reconnected
○ H1 idle Armada
○ Armada-006 idle Armada
● Armada-005 active Armada running bash
⚠ Pending: HOOK20
┃ [↑↓]nav [enter]attach [n]ew [k]kill [d]delete [tab]projects [q]quit ┃
Full keybindings and forms
| Key | Action |
|---|---|
↑ ↓ |
Navigate agent list |
Enter |
Attach to selected node (focuses existing pane) |
a |
Split-attach (experimental — opens a new tmux pane for the node) |
n |
New node (interactive form) |
k |
Kill selected node |
d |
Delete selected node |
Tab |
Switch to Projects view |
q |
Quit |
Note:
a(split-attach) is experimental and may not work reliably in all terminal environments. It is not shown in the bottom bar but remains available as a hidden shortcut.
Forms for creating nodes and projects use keyboard navigation: Tab/↑↓ to move between fields, ←→ to cycle options, type freely in text fields, Enter on [Save] to submit, Esc to cancel.
Agents can delegate work to child nodes using built-in skills:
Orchestrator
├── Reviewer — reviews the code
└── Tests — writes and runs tests
- Start Armada:
armada - Register a project and create an orchestrator node (agent type: "opencode" or "claude")
- The orchestrator spawns child workers, delegates tasks, and monitors results
- The dashboard updates in real time as each worker reports
active/idle
Skills (armada-node, armada-worker, armada-orchestrator) teach agents how to spawn children, delegate work, and report results back to the dashboard.
SQLite (WAL) + FastAPI REST server, daemonized. Each node is a tmux session — no custom agent runtime, just tmux providing persistence, reconnection, and multiplexing. Nodes report status via POST /api/report. The dashboard refreshes over a persistent WebSocket.
| Method | Path | Purpose |
|---|---|---|
GET |
/api/tree |
Full node hierarchy |
POST |
/api/nodes |
Create node |
GET |
/api/nodes/:id |
Node detail + reports |
DELETE |
/api/nodes/:id |
Kill node + cascades to children |
POST |
/api/nodes/:id/send |
Send command to worker |
POST |
/api/nodes/:id/attach |
Open terminal attached to node |
POST |
/api/report |
Agent status report (active/idle/pending/error) |
GET/POST/DELETE |
/api/project-labels |
CRUD project directories |
GET |
/health |
Health check (no auth) |
GET |
/metrics |
Prometheus metrics |
GET |
/api/qr?url= |
SVG QR code |
Full API docs at http://127.0.0.1:9100/docs (FastAPI Swagger UI).
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[test]"
pytest # run tests
pytest --cov=armada_ai # with coverage
ruff check armada_ai/ tests/ # lintCI runs ruff + pytest-cov on Python 3.10–3.13 on push to main.
MIT

