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.

Chat

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.

Desk

JARVIS host

deploy.py scaffolds agents. app.py is the fleet dashboard: live panes, deploy modal, in-browser terminal. One tmux session per agent.

Host

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).

One name, four things.

Every agent shares a single name across four resources. See the mapping in the repo README:

Agent directoryagents/example.com/
Rocket.Chat#example.com
tmux sessionexample-com
SSH hostexample.com

One message, end to end.

  1. You post in #example.com — Work lands in Rocket.Chat, from a human, a webhook, or a site contact form.
  2. Monitor picks it up — Pane 2 polls (~10s), appends to dispatch.log, forwards to the Cursor agent in pane 1.
  3. Agent executes — Reads context.md, uses tools and SSH on the client host, stays in sandbox scope.
  4. Reply in-channel — rocketchat.py send posts 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 STOP in-channel to halt a run.
  • Dispatch loglogs/dispatch.log per 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.

github.com/sw7ft/jarvis-v4

Start a conversation All case studies