Multi-Agent Mission Control for AI Coding Agents
A single control panel to orchestrate Claude Code sessions running across multiple machines in your network.
Monitor agents in real-time, dispatch tasks, manage git workflows, and coordinate multi-machine development — all from one place.
Managing AI coding agents across multiple machines is painful. You SSH into one box, check a session, switch to another, lose context, forget what's running where. JARVIS solves this by giving you one dashboard to see everything.
| Feature | Description |
|---|---|
| 🖥️ Machine Registry | Add any machine (local or remote via SSH). Health checks, system stats, GPU info |
| 📡 Live Agent Feed | Real-time activity stream parsed from Claude Code session files |
| 📋 Task Dispatch | Send tasks to any machine, track execution and results |
| 🔀 Git Integration | Branch management, commit tracking, PR workflows via GitHub CLI |
| 🔗 Pipelines | Define multi-step pipelines that run across machines |
| 🤝 Planning Mode | Collaborative ping-pong planning between you and AI agents |
| 📊 Activity Timeline | Analytics and visibility into agent work patterns |
| 🔔 System Tray | Runs in background with quick access |
| Service | Port | Purpose |
|---|---|---|
| WhatsApp Bridge | 3142 | Mobile notifications and commands |
| Voice Agent | 3144 | LiveKit-based voice interaction |
These are independent services — JARVIS works fully without them.
git clone https://github.com/emawritz/share-sharvis.git
cd share-sharvis
npm install
cd src-tauri && cargo tauri dev
On first launch, JARVIS creates a default config at ~/.config/jarvis/config.toml.
[session]
id = ""
rama = ""
objetivo = ""
[[machines]]
id = "main"
name = "MAIN"
host = "local" # "local" = this machine
os = "macos"
role = "orchestrator"
enabled = true
tags = ["local"]
[[machines.repos]]
name = "my-project"
path = "~/projects/my-project"
github = "user/my-project"
[[machines]]
id = "worker"
name = "WORKER"
host = "worker-ssh" # SSH alias from ~/.ssh/config
os = "linux"
enabled = true
gpu = "RTX 3070"
[[machines.repos]]
name = "my-frontend"
path = "~/projects/my-frontend"
github = "user/my-frontend"
src-tauri/src/ Rust backend (Tauri commands)
├── lib.rs App setup, plugin registration, command routing
├── config.rs TOML config management
├── machines.rs Machine registry, health checks, system stats
├── session.rs Session monitor, JSONL activity parsing
├── tasks.rs Task dispatch (local/SSH), execution engine
├── planning.rs Ping-pong planning mode, branch management
├── pipelines.rs Multi-step pipeline orchestration
├── github.rs GitHub CLI integration (PRs, checks)
├── visibility.rs Timeline analytics from JSONL files
└── types.rs Shared Rust types
src/lib/ Svelte 5 frontend
├── components/ UI components (Header, CommandBar, tabs/)
├── stores/ Reactive stores (session, tasks, machines, planning)
├── api.ts Tauri invoke wrappers
└── types.ts TypeScript interfaces
flowchart TB
subgraph SETUP["🚀 First Launch"]
W1[Setup Wizard] --> W2[Detect Local Machine]
W2 --> W3[Add Remote Machines]
W3 --> W4[Test SSH Connections]
W4 --> W5[Save config.toml]
end
subgraph CORE["⚙️ Runtime"]
CFG[~/.config/jarvis/config.toml] -->|load| REG[Machine Registry]
REG -->|spawn| HC[Health Checks]
REG -->|spawn| SM[Session Monitor]
SM -->|parse| JSONL[Claude JSONL Files]
end
subgraph MACHINES["🖥️ Machines"]
LOCAL[Local Machine\nshell exec]
REMOTE1[Remote Machine 1\nSSH + Tailscale]
REMOTE2[Remote Machine 2\nSSH + Tailscale]
end
subgraph UI["🎨 Dashboard · Svelte 5"]
TABS[Tabs: Tasks · Machines · Commits · GitHub · Pipelines · Timeline]
CMD[Command Bar]
AGENT[Agent Activity Feed]
end
W5 -->|generates| CFG
HC -->|status| UI
SM -->|activity stream| AGENT
CMD -->|dispatch task| REG
REG -->|host = local| LOCAL
REG -->|host = ssh-alias| REMOTE1
REG -->|host = ssh-alias| REMOTE2
LOCAL -->|stdout/stderr| UI
REMOTE1 -->|stdout/stderr| UI
REMOTE2 -->|stdout/stderr| UI
Flow summary:
~/.config/jarvis/config.toml — fully dynamic, never hardcoded# Production build
cd src-tauri && cargo tauri build
# Type checking
cargo check # Rust
npx svelte-check --threshold error # Svelte/TypeScript
Contributions are welcome! See CONTRIBUTING.md for guidelines.
MIT — Emanuel Cejas