An Eight Mile project · open source

Hermes Control Center

One calm desk for a very capable agent. See whether Hermes is ready, start focused work, follow every run to a final state, inspect the context it keeps, and manage the small part of its workspace you deliberately expose — through a local control plane that never pretends to be the agent.

Manager

Python · FastAPI

Desk

React 19 · Vite

History

SQLite

Delivery

Docker Compose

control_plane

listening

HTTPPROXYAUDITFILESOPERATORreact control deskMANAGER :8080fastapi control planeHERMES :8642gateway source of truthSQLITElocal run auditHERMES HOMEallowed files onlylocalhost:8080NARROW ROUTES · LOCAL HISTORY · GUARDED FILES

The operator view

Start with the whole system, then move with intent.

A capable agent is easy to talk to and hard to supervise. The opening screen exists to answer the three questions that decide whether anything else on the desk is worth doing: is the manager alive, can it reach Hermes, and what can this instance actually do right now?

Overview

connected

manager

alive

checked locally, no upstream round trip

gateway

ready

the agent speaks for itself

capabilities

listed

whatever this instance exposes today

The manager answers for itself and asks Hermes for the rest. A gateway that has gone away shows up here as an unready gateway, not as a desk that has stopped working.

Readiness at a glance

Manager health, gateway readiness and the exposed capabilities sit in one opening view, so the first question is answered before any work is submitted.

Work stays observable

Start a run, watch its status and its output, stop it when it is no longer worth finishing, and keep the local record of what happened.

The boundary is visible

The desk names what is local, what belongs to Hermes and which workspace files it may touch. Nothing about the split is left to be guessed at.

From intent to result

Give Hermes a clear job. Keep the run in sight.

The control desk does not become the agent. It submits work through the supported run API, follows progress until the run finishes or is stopped, and keeps a small local record of what happened — which is the part a gateway restart would otherwise take with it.

The run loop

manager routes only

STARTSTATUSPROMPToperator intentRUN · POLL · STOPPOST /api/runs · GET /api/runs/{id}queuedrunningfinalRESULTlive status

The agent works; the desk keeps watch. Everything in the middle box is a manager route — nothing here executes a step of the run itself.

01

Ask

Write the outcome you want, and any limits Hermes should observe.

02

Shape

Optionally choose the session, the instructions, the model and the provider.

03

Watch

The desk polls the run until it reaches a final state, showing status and output as they arrive.

04

Recall

A run started here stays in the local SQLite audit, so the question and its answer survive the tab.

6 control rooms

Everything close enough to operate. Nothing pretending to be the agent.

Each room has one job. Hermes stays the source of truth for execution, sessions, jobs, skills and tools; the manager concentrates access to them and adds the one thing the gateway does not keep — a local record of the runs started here.

readiness

Overview

Manager, gateway and capability health in one glance.

execution

Run agent

Submit work, monitor its status and stop an active run.

context

Sessions

Inspect recent Hermes conversations and the context they retain.

automation

Scheduled jobs

Review or create gateway jobs through their native JSON contract.

capability

Skills and tools

See the skills and toolsets the current Hermes instance exposes.

workspace

Files

Read and edit only the mounted paths the manager admits.

A deliberate boundary

Power belongs behind a clear gate.

This desk can launch tool-using work and change agent configuration, so the interesting question is not what it can do but what it refuses to. Its protections shrink the exposed surface; they do not turn a local starter into a shared security boundary, and the page would be worth less if it claimed otherwise.

ALLOWED AREAconfig.yamlSOUL.mdskills/memories/cron/logs/6 ROOTS · NOTHING ELSE.envauth.json../traversalPATHS RESOLVE INSIDE THE MOUNT OR THEY STOP

The allow list is the whole policy. A path that does not begin with an admitted root, or that resolves outside the mount once symlinks are followed, never reaches the filesystem.

What holds it

The Hermes API key stays on the manager side, never in the browser.

Only the admitted Hermes home paths can be opened or saved.

A path is resolved before it is used, and traversal is refused.

Public exposure still needs TLS, authentication and network controls.

Do not expose it publicly by default

Behind the project

Built by Eight Mile in London, as part of our software development work — the same engineers who build and run systems like it for clients.