Terminal orchestration for Open Code and Claude Code agents
Project description
█████╗ ██████╗ ███╗ ███╗ █████╗ ██████╗ █████╗
██╔══██╗██╔══██╗████╗ ████║██╔══██╗██╔══██╗██╔══██╗
███████║██████╔╝██╔████╔██║███████║██║ ██║███████║
██╔══██║██╔══██╗██║╚██╔╝██║██╔══██║██║ ██║██╔══██║
██║ ██║██║ ██║██║ ╚═╝ ██║██║ ██║██████╔╝██║ ██║
╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝
Command your fleet of AI agents from anywhere — your browser, your phone, your tablet.
What is Armada?
Armada runs OpenCode and Claude Code agents inside persistent tmux sessions, controlled from a web dashboard. Start an agent on your laptop, close it, and pick up where you left off — from any device on your network.
- Web dashboard — manage agents from any device
- Persistent sessions — agents survive browser closes, laptop sleeps, and server restarts
- Orchestration — agents spawn child nodes, delegate tasks, and run in parallel
- One command —
armadastarts the server and opens the dashboard
Installation
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 Code
armada 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 armada
From source
git clone https://github.com/rguiu/armada.git
cd armada
bash install.sh
Quick Start
armada # start server + open dashboard
Open 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.
Agent Types: Claude Code vs OpenCode
Armada supports both Claude Code and OpenCode as first-class agents. Each integrates differently:
OpenCode
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
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.
Bash
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.
Which one should you use?
| 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.
Commands
| 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) |
CLI Watch Dashboard
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 |
n |
New node (interactive form) |
k |
Kill selected node |
d |
Delete selected node |
Tab |
Switch to Projects view |
q |
Quit |
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.
Multi-Agent Pipeline
Architect (orchestrator)
├── Reviewer (worker) — reviews the code
└── Tests (worker) — 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.
Architecture
SQLite (WAL) + FastAPI REST server, daemonized. Each node is a tmux session running an agent. Nodes report status via POST /api/report. The dashboard updates in real time over a persistent WebSocket.
API Endpoints
| 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).
Development
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/ # lint
CI runs ruff + pytest-cov on Python 3.10–3.13 on push to main.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file armada_ai-0.2.1.tar.gz.
File metadata
- Download URL: armada_ai-0.2.1.tar.gz
- Upload date:
- Size: 175.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bd569f46e3e61ae569a1cf278e0b79a1f863c0f6634197da46b3820118198634
|
|
| MD5 |
1d0e481ee733978df863ca127e9eff15
|
|
| BLAKE2b-256 |
66d36801bf58d915b6d37e998067250da68594856c34470468c9936667cf474f
|
Provenance
The following attestation bundles were made for armada_ai-0.2.1.tar.gz:
Publisher:
publish-pypi.yml on rguiu/armada
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
armada_ai-0.2.1.tar.gz -
Subject digest:
bd569f46e3e61ae569a1cf278e0b79a1f863c0f6634197da46b3820118198634 - Sigstore transparency entry: 1814708235
- Sigstore integration time:
-
Permalink:
rguiu/armada@7aa8fce0e475d09c6bd8c8af7119245eaea384a6 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/rguiu
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@7aa8fce0e475d09c6bd8c8af7119245eaea384a6 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file armada_ai-0.2.1-py3-none-any.whl.
File metadata
- Download URL: armada_ai-0.2.1-py3-none-any.whl
- Upload date:
- Size: 159.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
847e0e67b1ae7c1e70db65e3de1abdb57f17d3c00a3f698a1c73329acca1d7c9
|
|
| MD5 |
906683eac12439c95c6c2ad4e607c811
|
|
| BLAKE2b-256 |
c5efa04a0975d3a5838cb7ea1e7bd954014e188573945133b14e27434b4b4a25
|
Provenance
The following attestation bundles were made for armada_ai-0.2.1-py3-none-any.whl:
Publisher:
publish-pypi.yml on rguiu/armada
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
armada_ai-0.2.1-py3-none-any.whl -
Subject digest:
847e0e67b1ae7c1e70db65e3de1abdb57f17d3c00a3f698a1c73329acca1d7c9 - Sigstore transparency entry: 1814708492
- Sigstore integration time:
-
Permalink:
rguiu/armada@7aa8fce0e475d09c6bd8c8af7119245eaea384a6 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/rguiu
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@7aa8fce0e475d09c6bd8c8af7119245eaea384a6 -
Trigger Event:
workflow_dispatch
-
Statement type: