Skip to content

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.

  • 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 default and arkana profiles get an Arkana MCP token and reach /mcp/arkana through 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.finished webhook.
  • 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.
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
  • Runs natively under systemd (hermes-gateway, hermes-dashboard), not in Docker, on an ARM instance built from the golden-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 .env and config.yaml are 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 .env parameter. 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.

Never run hermes update on the server — the code lives on the root disk, which is thrown away with each instance. Instead:

  1. Hermes Update (hermes-update.yml) checks every day for a new stable Hermes Agent release.
  2. If there is one, it builds a new Hermes AMI pinned to that release.
  3. 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).

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).