Multi agent operations platform: 9 agents, one job each, and my approval on risky steps
The platform runs on Hermes Agent, an open source agent runtime from Nous Research. The design is mine: which agent owns what, how work is handed between them, and where it stops for me. Private system; architecture and verified telemetry shown here.
Why nine agents and not one
One agent that does everything carries every instruction at once and holds every key at once. The agent drafting an email does not need deployment credentials; the agent parsing receipts does not need my LinkedIn drafts. Mixed instructions produce mixed behaviour, and shared access turns one mistake into a wide one.
So the work is partitioned the way a company partitions departments: mutually exclusive, collectively exhaustive. Each agent has one domain, its own workspace, its own memory, and only the tools that domain needs. A router decides who owns a request. The infrastructure agent checks hourly that nobody has drifted out of lane.
Topology
Nine agents, one owner per domain, no overlap. Alongside these agents, a typed decision model answers narrow questions for them; details on Fast decisions.
| Component | Role | Permissions and Policy |
|---|---|---|
| Me | Dictate, check, send | Reviews risky steps |
| Hermes Gateway | Ingestion | Discord and Telegram gateways |
| Router (default) | Central dispatcher | Classifies intent, assigns task cards |
| Kanban Board | Coordination | Task card hand offs, parent child tasks |
| Academics | Coursework and research | IIM Ranchi and IIT Madras |
| Career prep | Applications and prep | Resume and interview preparation |
| Finance | Receipts and accounting | Rule based parsing to Firefly III |
| Infrastructure | System maintenance | Services, backups, secrets, drift audits and cleanup proposals |
| Personal ops | Daily operations | Briefings, reminders, habits |
| Socials | Content drafting | Drafts reviewed by human |
| Consulting | Commercial projects | Client work in isolated workspaces |
| Private | Institute work | One agent for institute work, private |
| Human Gate | Approval checkpoint | Mandatory approval for sends, deletes, pushes |
| Google Tasks | Action ledger | Syncs what needs me |
| Fable | Planning pass | Maximum tier reasoning before build |
| 9Router | Model gateway | Model routing and fallback |
Router
The default agent receives every message from Discord or Telegram, classifies it, and hands it to the owning domain agent as a kanban card. It does small lookups itself only when routing would cost more than the task.
Domain agents
- Academics: Coursework at IIM Ranchi and IIT Madras, research reading and deadlines.
- Career prep: My own applications, resume and interview prep.
- Finance: Receipts to ledger, self hosted Firefly III.
- Infrastructure: Declared system state, services, backups, secrets. Houses the hourly drift audit engine and cleanup engine.
- Personal ops: Tasks, briefings, reminders, habits.
- Socials: LinkedIn and personal posts, drafted by the agent, published by me.
- Consulting: Commercial go to market consulting.
- Private: One agent for institute work, not described here.
Kanban hand offs
Work moves as cards: objective, context, acceptance criteria, owner. The router writes the card, the owner session writes the artifact, and a card can spawn read only children for research or critique. Cross domain jobs are separate cards linked by a parent, never one mixed artifact.
Planning at maximum effort
Some tasks need a specification before anyone writes code: multi file architecture, design direction, fact audits. Those go to a planning pass I call Fable: the strongest available model at its highest reasoning tier, asked for an executable plan. Builders then follow the plan.
Upkeep
The infrastructure agent audits configuration drift every hour and files findings rather than silently fixing them. Its janitor engine batches cleanup proposals and waits for my approval before deleting anything.
How a request moves
I dictate, check the text, then send it. What needs me lands in Google Tasks.
| Step | Stage | Actor | Action | Gating |
|---|---|---|---|---|
| 1 | Input | Me | Dictate and check transcript | Self review |
| 2 | Ingestion | Gateway | Deliver message via Discord or Telegram | Automated |
| 3 | Triage | Router | Classify intent and write kanban card | Automated |
| 4 | Dispatch | Kanban | Route card to domain agent | Automated |
| 5 | Execution | Domain agent | Read only work: research, drafts, diffs | Automated |
| 6 | Review | Me | Inspect diff or artifact at the human gate | Approval required |
| 7 | Apply | Domain agent | Apply change and close task card | Gated |
| 8 | Sync | Google Tasks | Sync open actionables that need me | Automated |
Input
I dictate with FreeFlow on Mac or Dictate on Android, both free and open source, read the transcript, and send it as text on Discord or Telegram. I skip the runtime's own voice plugins on purpose: I want to see what got written before an agent acts on it.
The gate
Sends, deletes and public pushes wait for my approval. Outbound email, file deletion and public git pushes stop at the gate until I have inspected the diff or the artifact. A question to me has no timeout. An unanswered card parks; it does not proceed.
Output
Important actionables that need me are synced to Google Tasks by an idempotent ledger, and a watcher logs what I complete or edit so the agents learn what I actually did.
Hours with my agents
Time I spent working with the agents on Discord, Telegram, the command line and Claude Code.
| Date | Hours |
|---|---|
| 13 Sep 2026 | 0.2 h |
| 14 Sep 2026 | 0.0 h |
| 15 Sep 2026 | 0.2 h |
| 16 Sep 2026 | 0.0 h |
| 17 Sep 2026 | 0.0 h |
| 18 Sep 2026 | 0.0 h |
| 19 Sep 2026 | 3.3 h |
| 20 Sep 2026 | 1.2 h |
| 21 Sep 2026 | 1.8 h |
| 22 Sep 2026 | 5.1 h |
| 23 Sep 2026 | 5.4 h |
| 24 Sep 2026 | 5.3 h |
| 25 Sep 2026 | 9.2 h |
| 26 Sep 2026 | 3.5 h |
| 27 Sep 2026 | 4.5 h |
| 28 Sep 2026 | 11.9 h |
| 29 Sep 2026 | 5.7 h |
| 30 Sep 2026 | 11.6 h |
| 1 Oct 2026 | 8.9 h |
| 2 Oct 2026 | 12.0 h |
| 3 Oct 2026 | 9.5 h |
| 4 Oct 2026 | 7.7 h |
| 5 Oct 2026 | 12.3 h |
| 6 Oct 2026 | 9.7 h |
| 7 Oct 2026 | 12.2 h |
| 8 Oct 2026 | 10.1 h |
| 9 Oct 2026 | 7.0 h |
| 10 Oct 2026 | 10.6 h |
| 11 Oct 2026 | 10.9 h |
| 12 Oct 2026 | 10.0 h |
| 13 Oct 2026 | 10.0 h |
| 14 Oct 2026 | 2.5 h |
| 15 Oct 2026 | 13.5 h |
| 16 Oct 2026 | 7.6 h |
| 17 Oct 2026 | 11.0 h |
| 18 Oct 2026 | 10.9 h |
| 19 Oct 2026 | 5.1 h |
| 20 Oct 2026 | 6.3 h |
| 21 Oct 2026 | 4.9 h |
| 22 Oct 2026 | 10.2 h |
| 23 Oct 2026 | 11.7 h |
| 24 Oct 2026 | 7.6 h |
| 25 Oct 2026 | 7.8 h |
| 26 Oct 2026 | 12.5 h |
| 27 Oct 2026 | 9.0 h |
| 28 Oct 2026 | 3.7 h |
| 29 Oct 2026 | 2.7 h |
| 30 Oct 2026 | 1.4 h |
| 31 Oct 2026 | 3.1 h |
| 1 Nov 2026 | 0.3 h |
How hours are counted
Counted from the timestamps of messages I sent to my agents in Discord, Telegram, the command line and Claude Code, whether dictated or typed. Messages less than 15 minutes apart form one session, each session gets a 5 minute tail, and automated notifications are excluded.
Tokens and models
Combined daily token throughput across three paths: 9Router, a local model gateway that routes each call to a provider and falls back when one fails; direct Hermes calls to Claude; and the Claude Code CLI.
| Date | Tokens |
|---|---|
| 13 Sep 2026 | 0 k |
| 14 Sep 2026 | 0 k |
| 15 Sep 2026 | 11 k |
| 16 Sep 2026 | 40.8 M |
| 17 Sep 2026 | 65.0 M |
| 18 Sep 2026 | 48.7 M |
| 19 Sep 2026 | 32.0 M |
| 20 Sep 2026 | 10.1 M |
| 21 Sep 2026 | 52.5 M |
| 22 Sep 2026 | 171.3 M |
| 23 Sep 2026 | 199.9 M |
| 24 Sep 2026 | 154.9 M |
| 25 Sep 2026 | 78.4 M |
| 26 Sep 2026 | 23.2 M |
| 27 Sep 2026 | 65.2 M |
| 28 Sep 2026 | 340.1 M |
| 29 Sep 2026 | 191.1 M |
| 30 Sep 2026 | 140.8 M |
| 1 Oct 2026 | 217.6 M |
| 2 Oct 2026 | 389.3 M |
| 3 Oct 2026 | 515.4 M |
| 4 Oct 2026 | 251.4 M |
| 5 Oct 2026 | 498.2 M |
| 6 Oct 2026 | 593.3 M |
| 7 Oct 2026 | 758.5 M |
| 8 Oct 2026 | 448.0 M |
| 9 Oct 2026 | 364.1 M |
| 10 Oct 2026 | 487.1 M |
| 11 Oct 2026 | 350.4 M |
| 12 Oct 2026 | 388.5 M |
| 13 Oct 2026 | 589.9 M |
| 14 Oct 2026 | 30.5 M |
| 15 Oct 2026 | 279.1 M |
| 16 Oct 2026 | 415.4 M |
| 17 Oct 2026 | 203.9 M |
| 18 Oct 2026 | 309.0 M |
| 19 Oct 2026 | 505.0 M |
| 20 Oct 2026 | 146.2 M |
| 21 Oct 2026 | 249.2 M |
| 22 Oct 2026 | 597.6 M |
| 23 Oct 2026 | 773.0 M |
| 24 Oct 2026 | 79.5 M |
| 25 Oct 2026 | 326.3 M |
| 26 Oct 2026 | 314.5 M |
| 27 Oct 2026 | 389.0 M |
| 28 Oct 2026 | 153.1 M |
| 29 Oct 2026 | 36.8 M |
| 30 Oct 2026 | 41.5 M |
| 31 Oct 2026 | 134.1 M |
| 1 Nov 2026 | 24.9 M |
| Model Family | Share |
|---|---|
| Gemini Flash | 72.5% |
| Claude Opus | 19.5% |
| Claude Sonnet | 7.7% |
Most volume goes to a fast, cheap model for routine steps; the expensive models are reserved for planning and review.
Messages and leverage
About 5 agent replies for every message I send. That ratio is the point of the design: I write instructions, not code.
How replies are counted
Assistant messages across every agent conversation database, including scheduled jobs and subagents, counted once each after removing copies created when long conversations are compacted (same role, timestamp and opening text). Tool results and my own messages are counted separately.
Access from any device
I can run the whole platform from my phone, so work continues when my laptop is closed or not with me. Three pieces make that work.
- Private mesh: Tailscale, a WireGuard based private network, joins three devices: the server (an Azure VPS, Linux), my MacBook Pro (macOS) and my phone (Android). I reach the server over the mesh, from those three devices.
- Termius: I sometimes SSH in via Termius from my phone or laptop over Tailscale. It connects over the mesh, so I can check a service or restart one from the phone.
- Dictation: I dictate on my phone or Mac (Dictate on Android, FreeFlow on Mac), read the transcript, then send it on Discord or Telegram. The router agent picks it up from there.
| Device | Tools | Destination |
|---|---|---|
| Phone | Termius, Dictate | Azure VPS via Tailscale mesh |
| Laptop | SSH, FreeFlow | Azure VPS via Tailscale mesh |
Host, isolation and secrets
Every agent runs on one rented cloud server and stays inside its own workspace. The host is an Azure VPS running Ubuntu 24.04, and the runtime moved there from a MacBook Linux VM on 20 Sep 2026, so the agents run around the clock.
- systemd services: Each long running piece, such as the model gateway and the chat gateway, runs as a system service that restarts on its own after a reboot.
- Workspace isolation: Each agent has its own working directory, persistent memory, scoped tools and skills. Each domain keeps its own data in its own workspace.
Secrets and backups
Secrets live in locked down files and a credential vault that fills only at its own origin; nothing secret is ever pasted into chat. Guard scripts check the context files each agent reads. State is backed up hourly, encrypted capsules go offsite daily to GitHub Releases, the offsite copy is verified weekly, and a scripted restore to a fresh server exists.
What the review step has taught me
This page is built through the same pipeline: a planning card at maximum effort, a builder agent in the consulting profile, and a review gate before release. The review step is how stale figures on this very page were found: counts had been typed into prose and the system had moved on. The rebuild binds every number to the data file the agents maintain, so the gate now checks a script, not a memory.
Hermes Agent · Python · systemd · 9Router · Discord · Telegram · SQLite