Hermes
Hermes is the team’s self-hosted AI agent, built on the open-source
Hermes Agent by NousResearch. One instance runs per
environment (hermes-staging-1, hermes-production-1). You will see its name in commit
co-authors (for example hermes-docs-sync), deploy notifications and Arkana MCP tokens.
What it does
Section titled “What it does”- Chat agent for the team. People talk to Hermes from the team chat; the chat integration is configured on the instance itself, not in code.
- Reads Arkana. The
defaultandarkanaprofiles get an Arkana MCP token and reach/mcp/arkanathrough the internal load balancer. That token sees financial data and client names, which is why only those profiles have it. See Connecting an agent. - Knows about deploys. Every Deploy Infrastructure run sends it a signed
deployment.started/deployment.finishedwebhook. - Publishes reports. Agents can publish HTML reports, served at
agents[-staging-1].byvolare.com/code/<name>/. - Does engineering chores. It has
git, the GitHub CLI and rootless Docker for throw-away test environments.
How to reach it
Section titled “How to reach it”| What | Where |
|---|---|
| Dashboard | https://agents.byvolare.com (production), https://agents-staging-1.byvolare.com (staging) — behind Cloudflare Access and basic auth |
| Shell | SSM Session Manager, like any other server |
| Webhooks | /p/<profile>/webhooks/* on the agents host, HMAC-signed |
How it runs
Section titled “How it runs”- Runs natively under systemd (
hermes-gateway,hermes-dashboard), not in Docker, on an ARM instance built from thegolden-ubuntu-hermes-arm64-*AMI. - Its state (
/var/lib/hermes) lives on a persistent EBS volume that survives instance replacement, with daily snapshots (kept 7 days) and a nightly backup to S3. A blank volume is restored from the latest S3 backup at boot. - Its
.envandconfig.yamlare seeded from SSM (/volare/<env>/hermes/env,/volare/<env>/autoscaling/hermes/config). On every boot, values defined in SSM overwrite the ones on the volume — change settings in Parameter Store, not in the dashboard. - LLM traffic can be traced in Langfuse when the
HERMES_LANGFUSE_*keys are present in its.envparameter. Langfuse stores full prompts and responses. - Staging runs on a spot instance; a watcher backs Hermes up and stops it cleanly on a spot interruption.
How it is updated
Section titled “How it is updated”Never run hermes update on the server — the code lives on the root disk, which is thrown away
with each instance. Instead:
- Hermes Update (
hermes-update.yml) checks every day for a new stable Hermes Agent release. - If there is one, it builds a new Hermes AMI pinned to that release.
- It replaces the Hermes instance in production, then staging (Deploy Infrastructure with
hermes_only).
App deploys leave Hermes alone unless deploy_hermes is ticked. Replacing Hermes means a short
outage (the single data volume must detach from the old instance first).
Monitoring
Section titled “Monitoring”Hermes ships its metrics and WARNING/ERROR logs to Grafana Cloud (job="hermes"). The
Hermes File Not Delivered alert fires when the agent tries to send a file outside its allowed
folders — never fix it by allow-listing a whole profile.
Source: infra-volare/terragrunt/templates/hermes*.tmpl,
infra-volare/packer/ansible/playbook-hermes.yml, infra-volare/docs/plans/2026-09-14-hermes-agent-design.md
(design history; partly out of date).