- Migrate all 127 non-reserved docs to OKF v0.1 frontmatter (type/description/tags/timestamp); fix 13 YAML issues, 2 duplicate-FM blocks, strip reserved-page FM - Restructure log.md to OKF (## YYYY-MM-DD, newest-first) - Fact-check against scripts/AGENTS.md ground truth: fix 6 false 'Active' banners on retired runbooks, 96->114 GiB GTT, deployment.md vs deploy-plan.py/deploy-remote.sh, Deployment Flow frank-medium=Quadlet, Calibre 9.9.0->9.15.0 + CVE-2025-7404 conflation, Copyparty v1.20.24, RomM 5.3.0 breaking change - Move *arr docs to new FrankBook-Pro/ section (git mv, link-safe) - Write active runbook bodies from ground truth (frank-large, frank-small) - Add 3 research briefs + HTML report: Local TTS and Voice Cloning, AI Job Search and Resume Tools, Most Popular Self-Hosted AI Apps (Jun-Sep 2026) - Add upstream-version rows to ComfyUI/OpenWebUI/Hermes app docs - All 336 tests pass; 136 pages, 0 unresolved wikilinks
4.8 KiB
type, description, tags, timestamp
| type | description | tags | timestamp | ||
|---|---|---|---|---|---|
| reference | Hermes is the self-improving AI agent from Nous Research. |
|
2026-09-15 |
Hermes
Hermes is the self-improving AI agent from Nous Research. It runs in a terminal, Telegram, Discord, Slack, WhatsApp, or Signal, and keeps a persistent learning loop: it creates skills from experience, searches past conversations, and builds a model of the user across sessions.
Host: Dankclaw — the gateway itself publishes no port (it runs in the
host network namespace and dials the Signal daemon at 127.0.0.1:8080); the
user-facing web surface is Hermes-WebUI on :8787, reached via
hermes.franksdank.cloud — internal-only by DNS absence (no public Porkbun A
record) — Docs: https://hermes-agent.nousresearch.com/docs
Persistent state: /home/dank/Containers/hermes/data on Dankclaw, bind-mounted
at /data in all three Hermes containers (gateway, webui, dashboard). Each
container additionally gets an anonymous volume at /opt/data, which is
re-created empty on every container recreation — anything that lives only there
is not durable. The tracked, sanitized configuration baseline is
dankclaw/hermes/config.yaml.example.
Facts (from research, primary source)
| Item | Value |
|---|---|
| Image | built from NousResearch/hermes-agent (official Dockerfile in repo) |
| Upstream latest | agent v0.21.4 / CalVer v2026.9.21 (2026-09-21); hermes-webui v0.52.113 (2026-08-14). Pin the CalVer tag, not :latest. |
| License | MIT |
| Model backends | Nous Portal, OpenRouter, OpenAI, or any custom endpoint |
| Interfaces | TUI, Telegram, Discord, Slack, WhatsApp, Signal |
| Memory | FTS5 session search, Honcho user modeling |
| Skills | self-created, self-improving during use |
Configuration
- Point Hermes at the local model endpoint or an external provider through its provider config.
- The gateway runs
hermes gateway run --force -vin the host network namespace (Network=hostin its Quadlet unit) and reaches the Signal daemon athttp://127.0.0.1:8080. That loopback hop works only because the gateway is in the host netns — see Container Network Namespaces. The daemon itself is a host user unit (signal-cli-daemon.service), not a container, and binds0.0.0.0:8080, so the Signal HTTP API is reachable from the whole LAN. - The data volume persists skills, memory, and session history.
- Hermes has two named local providers:
dankclaw-largereacheshttp://192.168.0.143:7770/v1and exposesfrank-large;dankserver-smallreacheshttp://192.168.0.235:7770/v1and exposesfrank-medium(renamed fromfrank-smallon 2026-09-15). - The live
config.yamlcontains secrets and user state and is not committed; the tracked example is the sanitized backup of its non-secret settings.
Volumes
| Container path | Host path (live) | Backing |
|---|---|---|
/data |
/home/dank/Containers/hermes/data |
bind mount (durable; shared by all three containers) |
/webui |
/home/dank/Containers/hermes/webui |
bind mount (webui only — the bootstrap.py venv lives here) |
/opt/data |
anonymous volume | image VOLUME; fresh empty volume per recreation |
Gotchas
- Hermes is under active development; pin the image tag for reproducibility.
- Model choice drives quality; the local
frank-large(Dankclaw, 7770) is the intended backend. - Do not expose the gateway without auth — put it behind Caddy with basic auth.
Browser automation (Chrome DevTools Protocol daemon)
The agent's browser tool is an MCP client (mcp_tool.py in the image) that
spawns npx -y chrome-devtools-mcp@latest --browserUrl=http://127.0.0.1:9222
per session; the browser itself lives in a dedicated daemon container, the
digest-pinned headless-shell unit chrome-devtools-protocol.container (host
network, loopback-only bind on 127.0.0.1:9222). Both consumers — the Signal
gateway and the webui server — run in the host network namespace, so they can
dial the daemon on loopback; nothing on the LAN can reach the CDP endpoint.
The wiring lives in the live /data/config.yaml under mcp_servers.chrome-devtools
(command npx, args -y chrome-devtools-mcp@latest --browserUrl=http://127.0.0.1:9222).
The npx package cache lives in the container layer, so a recreation (not just a
restart) pays one first-call npm download; subsequent calls are cached.
See Also
- Hermes-Dashboard — the LAN browser management UI
- Hermes-WebUI — the Hermex server (phone-facing API, SSH-tunneled)
- Dankclaw Stack
- OpenWebUI — the chat UI that pairs with Hermes
- Knowledge base: SearXNG (Hermes as the search agent)
- Container Network Namespaces — why the gateway and webui can dial loopback services and the dashboard cannot