# Hermes Agent technical tutorial: configuration and automation | llmnet Apps

[← Apps overview](/en/)

# Hermes Agent: technical tutorial

By Ivo Donker · October 28, 2026 — created with AI assistance (writer: DeepSeek V4.1 Flash; critic: Gemini 3.8 Flash)

Hermes Agent: [Review](/en/hermes-review)[Install & set up](/en/hermes-installatie)[News](/en/hermes-nieuws)

Status September 2026, compiled from our own notes and news archive; text machine-generated and editorially checked. Check versions and commands in the official documentation.

This tutorial sets up Hermes Agent as a serious, long-running agent: models and a cheap auxiliary model, a sandboxed terminal backend, MCP servers, skills, scheduled tasks and the messaging gateway, along with the security that goes with it. Keys and commands have been checked against the official documentation from Nous Research (as of September 2026).

## Configuration: config.yaml and .env

Everything is in ~/.hermes/. The starting point: secrets in .env, everything else in config.yaml. In config.yaml you refer to a secret with ${NAAM}.

Useful commands:

hermes config set KEY VAL # waarde zetten (HOOFDLETTERS gaan automatisch naar .env)
hermes config get KEY # de uiteindelijke waarde bekijken
hermes config edit # config.yaml openen in je editor
hermes config check # configuratie controleren, vooral na een update

## Models: main model and auxiliary model

Hermes uses a main model for the real work and can use a separate, cheaper model for side tasks, such as summarising long contexts (compression):

model: anthropic/<model-id>
providers:
 anthropic:
 api_key: ${ANTHROPIC_API_KEY}

auxiliary:
 compression:
 model: <goedkoop-model>
 provider: openrouter
Do you want all traffic to run through your own OpenAI-compatible endpoint, such as a local server or your own LLM router? Then specify a base_url, as the documentation for the auxiliary models shows:

auxiliary:
 compression:
 model: <alias-bij-je-router>
 base_url: https://router.example.com/v1
hermes model lets you interactively choose a provider and model and writes the configuration for you. That is less error-prone than doing it by hand.

## The terminal backend: where commands run

By default, Hermes runs shell commands on your own machine (local). For an agent that does a lot independently, a sandboxed environment is wiser. The available backends:

- local: your own machine (default).

- docker: a container.

- ssh: a remote server.

- modal, daytona or vercel_sandbox: sandboxes in the cloud.

- singularity: for HPC clusters.

A Docker setup in which only your project directory is visible:

terminal:
 backend: docker
 docker_image: nousresearch/hermes-sandbox:desktop
 docker_volumes:
 - "/home/jij/projects:/workspace/projects"
 container_memory: 5120 # MB
 container_persistent: true # container blijft bestaan tussen sessies
Mount only the directories that the agent really needs. A volume on your home directory makes the sandbox pointless.

## Security and approval

agent:
 dangerous_command_approval: true # risicovolle shellcommando's eerst voorleggen
 disabled_toolsets: # hele groepen tools uitschakelen
 - web
skills:
 write_approval: true # wijzigingen aan skills eerst goedkeuren
 guard_agent_created: true # zelfgemaakte skills scannen op gevaarlijke patronen
memory:
 write_approval: false # op true: elke geheugenupdate eerst goedkeuren
With disabled_toolsets you remove entire categories. An agent that only needs to read and write code, for example, does not need web access.

## MCP servers

In config.yaml under mcp_servers. A local server (stdio):

mcp_servers:
 github:
 command: "npx"
 args: ["-y", "@modelcontextprotocol/server-github"]
 env:
 GITHUB_PERSONAL_ACCESS_TOKEN: "${GITHUB_TOKEN}"
A remote server (HTTP):

mcp_servers:
 docs:
 url: "https://mcp.example.com/mcp"
 headers:
 Authorization: "Bearer ${DOCS_TOKEN}"
Stdio is suitable for servers running locally; HTTP for servers hosted elsewhere.

## Skills: procedural memory

Skills are in ~/.hermes/skills/, each in its own directory with a SKILL.md. They follow the open standard from agentskills.io, so you can also use them in other agents. A minimal skill:

---
name: release-notes
description: Schrijf release notes uit git-log
version: 1.0.0
platforms: [macos, linux]
---
## When to Use
Als er om release notes voor een nieuwe versie wordt gevraagd.

## Procedure
1. Lees `git log` sinds de laatste tag.
2. Groepeer per type: features, fixes, overig.
3. Schrijf beknopte Nederlandse zinnen per wijziging.

## Pitfalls
- Merge-commits niet dubbel opnemen.

## Verification
- Elke genoemde wijziging staat in de git-log.

- Hermes loads skills in stages: first only the list, then the full content only when needed. So many skills cost you little context.

- The agent also creates and improves skills itself; with write_approval: true you maintain oversight of this.

- You invoke them with /skill-naam, and with /learn you turn reference material into a skill.

- You install skills from external sources with hermes skills install <id>. They are scanned for data exfiltration, prompt injection, destructive commands and supply-chain risks. A "dangerous" result cannot be overridden, not even with --force.

## Scheduled tasks

Hermes has a built-in planner. You create tasks in three ways:

- In plain language: "Every morning at 9 o'clock, summarise the AI news from Hacker News and send it to Telegram."

- In the chat: /cron add "every 2h" "Check the server status".

- From the command line: hermes cron create "every 2h" "Check the server status".

The definitions are in ~/.hermes/cron/jobs.json, the output per run in ~/.hermes/cron/output/<job_id>/. With deliver: you determine where the result goes: back to where the task was created, only to local files, or to a chat channel.

## The messaging gateway

The gateway makes your agent reachable via Telegram, Discord, Slack, WhatsApp, Signal, Matrix, Teams and more.

hermes gateway setup # interactief platforms instellen
hermes gateway install # als dienst installeren (systemd op Linux, launchd op macOS)
hermes gateway start
By default, the gateway refuses everyone except:

- users on an allowlist in .env, for example TELEGRAM_ALLOWED_USERS=123456789;

- users you approve via a pairing code: hermes pairing approve telegram <CODE>. Codes expire after an hour.

Never set GATEWAY_ALLOW_ALL_USERS=true on a bot with access to a terminal: then anyone who finds the bot can execute commands.

## Maintenance

- hermes update --check shows what's new, hermes update updates. A snapshot is taken first, automatically rolled back on errors, the configuration migrated and the gateway restarted.

- After an update, run hermes config check and hermes doctor.

- Make a backup of ~/.hermes/memories/ and ~/.hermes/skills/ regularly: that is where what your agent has learned over time lives.

## Troubleshooting

- hermes: command not found: reload your shell with source ~/.bashrc or open a new terminal.

- Key is not found: it is in config.yaml instead of .env, or the name after ${...} is incorrect. hermes config get shows the final value.

- Docker backend does not start: Docker is not running, or the memory in container_memory is larger than Docker is allowed to use.

- Bot does not respond to a new user: that is by design. Approve the user with hermes pairing approve or put them on the allowlist.

- An installed skill is rejected: the scan found something dangerous. You cannot override that; choose another skill or write it yourself.

Documentation: [hermes-agent.nousresearch.com/docs](https://hermes-agent.nousresearch.com/docs/).
