hermitator: many WhatsApp agents on one box, zero RAM while idle
October 31, 2026
Codegithub.com/
Why I built it
I wanted to run many AI agents on one bare-metal server, isolated from each other, and talk to each one over WhatsApp. Most agents sit idle most of the time. An idle agent should cost nothing: suspend it and give its RAM back.
Two things got in the way:
- Hosted services don't fit. Agent37 does something similar, but I wanted to self-host, and I wanted an incoming WhatsApp message to wake the agent.
- WhatsApp support in coding agents assumes one machine. Several agents can already talk over WhatsApp, but they expect the WhatsApp gateway to run on the same machine as the agent. If the agent holds the WhatsApp connection, it can never sleep.
So hermitator splits the two. When no work is happening, the only things running are the web panel, the control plane and the WhatsApp connection. Every agent is asleep.
How it works
- One always-on host process. A Go binary holds the WhatsApp client (whatsmeow), the orchestrator, the web panel and SQLite.
- One gVisor sandbox per agent. Each agent gets OverlayFS over a shared read-only image and its own network namespace. The agent runs as root inside the sandbox.
- Sleep. After about five idle minutes the sandbox is stopped. If something is still running in the background, such as a dev server, the sandbox is checkpointed instead and restored on the next message, dev server and all.
- Wake only when needed. Messages that don't trigger the agent are queued and handed over with the next one that does, so they cost no wake-up and no LLM round trip. No message is ever dropped.
- Bring your own subscription. Claude Code runs on a Claude subscription; pi runs on a ChatGPT/Codex subscription, DeepSeek, OpenRouter or any OpenAI-compatible provider.
- WhatsApp is the whole interface. Photos, voice notes (transcribed locally with whisper.cpp), files in and out, polls, emoji reactions for status, scheduled tasks and preview links all work from the phone.
Numbers
Measured on a Hetzner box with a Ryzen 5 3600 and 64 GB of RAM:
| Measure | Value |
|---|---|
| Cold wake | 70–100 ms |
| Wake from checkpoint | 55–60 ms |
| Awake, idle agent | 28 MB (39 MB with a web server running) |
| Sleeping agent | 0 MB |
| hermitator itself | ~60 MB |
| Checkpoint on disk (agent running a Python web server) | 13 MB |
Limitations
- Checkpoints aren't portable. They restore only on the same CPU architecture and gVisor version.
- Web terminal processes don't survive a checkpoint.
- No quotas yet. There are no per-agent disk quotas or egress allowlists.
- One host. No clustering, and no plan for it.
Code, setup instructions and the full README: github.com/rahimnathwani/hermitator.