The problem we were solving.
Agent number five is where spreadsheets stop working. Each new domain meant another SSH key, another chat channel, another set of credentials, and another place to look when something failed at 2 a.m.
We needed a control plane that stayed on hardware we owned, kept blast radius readable, and let a human approve work from a phone without opening a terminal.
Models swap. Boundaries do not.
Three layers.
Rocket.Chat
One private channel per agent. Operators dispatch from mobile or desktop; the monitor in tmux pane 2 polls and forwards; replies land in the same room.
JARVIS host
deploy.py scaffolds agents. app.py is the fleet dashboard: live panes, deploy modal, in-browser terminal. One tmux session per agent.
Client server
SSH alias per agent. Git, sites, services, and modules (e.g. contact forms → webhook → same channel) run where the client lives.
context.md is the contract.
Every agent directory ships with context.md: identity, allowed paths, Rocket.Chat channel, SSH host, utilities, and routines. The harness enforces sandbox rules; the file is the readable source of truth operators and the model share (not a one-off system prompt).
# agents/example.com/context.md
Rocket.Chat channel: #example.com
SSH host: example.com
Scope: agents/example.com/ only
→ utilities/, routines/, logs/dispatch.log
One name, four things.
Every agent shares a single name across four resources. See the mapping in the repo README:
agents/example.com/#example.comexample-comexample.comOne message, end to end.
- You post in #example.com — Work lands in Rocket.Chat, from a human, a webhook, or a site contact form.
- Monitor picks it up — Pane 2 polls (~10s), appends to
dispatch.log, forwards to the Cursor agent in pane 1. - Agent executes — Reads
context.md, uses tools and SSH on the client host, stays in sandbox scope. - Reply in-channel —
rocketchat.py sendposts the result in the same thread, full audit trail.
Supervision and record.
- Live panesCursor CLI in tmux pane 1. Watch work in real time; post
STOPin-channel to halt a run. - Dispatch log
logs/dispatch.logper agent as JSON lines for dispatch, send, and stop events. - Sandbox scopeEach agent directory is isolated. Cross-scope reads are blocked at the rule layer, not by politeness.
- Contact formsModules on the client server POST to the agent webhook, with no shared inbox to triage.
What shipped.
JARVIS v4 is MIT-licensed, full docs, dashboard, deploy tooling, apps (Rocket.Chat, optional mail/browser), modules, and agents/_example/. We use it daily; this page is the system we keep tightening.
Start a conversation All case studies