⟡ THE PRACTITIONER'S GUIDE ⟡
Hermes Agent is the only AI agent with a built-in learning loop — it creates skills from experience, improves them during use, and builds a deepening model of you across sessions. Built by Nous Research, it runs anywhere: your laptop, a $5 VPS, a GPU cluster, or serverless infrastructure.
This guide covers Bot Mode — turning Hermes profiles into named, persistent bots that run routines, deliberate together, and message each other directly.
Hermes Agent installs in under a minute. Choose your path:
Configures your provider, model, and tools in one interactive flow.
$ hermes setup
Use hermes model for the interactive picker, or pick your provider directly:
| Provider | Auth | Notes |
|---|---|---|
| Nous Portal | OAuth | 300+ models + Tool Gateway |
| OpenRouter | API key | Multi-provider routing |
| Anthropic | OAuth or API key | Claude models |
| OpenAI | API key | GPT-5, o1 |
| Google AI | API key | Gemini models |
| xAI | OAuth or API key | Grok models |
| DeepSeek | API key | V3 / R1 |
| NVIDIA | API key | Nemotron models |
| Custom | Base URL + key | Any OpenAI-compatible |
$ hermes
> Hello! I'm Hermes, your self-improving AI agent.
Ubuntu 22.04+, Debian 12+, or any modern distro with Python 3.11+.
macOS 14+ recommended. Intel and Apple Silicon both supported.
Windows 11 with WSL2, or native Windows with Python 3.11+.
Termux (Android) with Python 3.11+ for terminal-only operation.
Official Docker images with per-profile gateway supervision via s6-overlay.
Deploy to Modal (serverless), Daytona (cloud dev), or Singularity.
A profile is a complete, isolated Hermes installation with its own config, API keys, personality, memory, skills, cron jobs, and state database. Profiles let you run separate agents for different purposes — a coding assistant, a personal bot, a research agent — without mixing state.
~/.hermes/
├── config.yaml # Settings (model, terminal, tools, memory, compression)
├── .env # API keys and secrets (NEVER in config.yaml)
├── auth.json # OAuth credentials (Portal, Codex, Anthropic)
├── SOUL.md # Primary agent identity (slot #1 in system prompt)
├── AGENTS.md # Project-specific instructions (auto-injected)
├── memories/ # Persistent memory (MEMORY.md, USER.md)
├── skills/ # Bundled + agent-created + hub-installed skills
├── cron/ # Scheduled jobs
├── sessions/ # Gateway session state
├── checkpoints/ # Filesystem snapshots (for /rollback)
├── logs/ # agent.log, gateway.log, errors.log
└── state.db # Session store (SQLite + FTS5)
.env only.$ hermes profile create coder --description "Full-stack coding assistant"
This creates a profile and a command alias — you immediately get coder chat, coder setup, coder gateway start.
$ coder setup --portal
$ coder chat
Each profile has independent chat history, memory, and skills.
# Clone config + SOUL + skills (fresh memory/sessions)
$ hermes profile create work --clone
# Clone everything including memories + cron
$ hermes profile create backup --clone-all
# Clone from a specific profile
$ hermes profile create work --clone-from coder
# Publish a profile as a git distribution
$ hermes profile install github.com/you/research-bot --alias
$ hermes profile update research-bot # pull updates, keeps your data
| Command | Purpose |
|---|---|
hermes profile create <name> | Create new profile + command alias |
hermes profile list | List all profiles with status |
hermes profile show <name> | Detailed profile info |
hermes profile use <name> | Set sticky default (like kubectl) |
hermes -p <name> chat | Run any command on a profile |
hermes profile export <name> | Pack into .tar.gz (keys stripped) |
hermes profile install <repo> | Install from git repo |
hermes profile delete <name> | Delete (stops gateway + deletes all data) |
Profiles use the HERMES_HOME environment variable. Running coder chat sets HERMES_HOME=~/.hermes/profiles/coder. The wrapper script handles this — you never need to set it manually.
Controls Hermes state: config, .env, memory, sessions, skills, state.db, gateway, logs, cron.
OS user home. Tools like git, ssh, gh keep using real credentials. Shared across profiles by default.
Configure terminal.backend (local, docker, ssh, daytona, singularity, modal) and terminal.cwd in config.yaml. Isolated CLI state per profile (separate HOME per profile) is achievable via terminal.home_mode: profile in config.yaml.
Bot Mode turns your Hermes profiles into a roster of named Bots. Each Bot has its own role, model, memory, skills, and avatar; Bots run recurring routines, deliberate together in group chats, and message each other directly. Build a specialist Bot once and it is there forever, one click away.
Bot Mode ships built into the Hermes Desktop app and is on by default. It appears as a Bots tab next to Sessions in the left sidebar, with a Routines tile docked beside the conversation.
~/.hermes/profiles/<name>/. No core patches, no background daemons, no extra storage.The roster shows one row per agent profile: avatar, latest-message preview, and timestamp. Click a Bot to land in its chat — every Bot has a canonical, persistent Bot Chat conversation created the moment the Bot is born.
A presence strip shows every Bot currently working — the gateway-busy profile plus any Bot that wrote within the last 90 seconds.
Filter the roster as you type. Bots use @name mentions to message each other — e.g. @research_bot @ops_bot summarize this.
Custom avatars. Set during creation or via Edit Profile.
Docked beside the conversation. Shows scheduled tasks and next-run times.
Give the Bot its own model. Different Bots can run on different models side by side.
The Bot's persona: personality, communication style, behavioral rules.
Tick exactly the skills, toolsets, and MCP servers this Bot needs.
Register multiple backends in Settings → Connections — local runtime, remote gateways, SSH hosts, Hermes Cloud. When you register peer gateways on other machines via hermes peer add …, the roster shows Bots from every connected source persistently. Unreachable machines keep their last-known rows instead of vanishing.
hermes peer dm <peer>[<bot>] \"message\" to DM another Bot across machines via the Desktop relay.
| In Bot Mode | From a shell |
|---|---|
| Chat with a Bot | hermes -p <bot> chat |
| Bot's files, skills, memory | ~/.hermes/profiles/<bot>/ |
| Routines | hermes cron list (jobs named [bot:<name>] …) |
| Create/inspect profiles | hermes profile create, hermes profile list |
@research_bot @ops_bot summarize this is processed by only those two bots. Set exclusive_bot_mentions: false for legacy groups.
Skills are procedural knowledge documents the agent loads on demand. They follow progressive disclosure to minimize token usage and are compatible with the agentskills.io open standard. All skills live in ~/.hermes/skills/.
Pre-installed with Hermes. Updated automatically via hermes update.
From the Skills Hub catalog — browse, search, install with security scan.
Generated autonomously during conversations via skill_manage or /learn.
Lives in the project repo under .hermes/skills/
Every installed skill is available as a slash command:
/gif-search funny cats
/axolotl help me fine-tune Llama 3 on my dataset
/github-pr-workflow create a PR for the auth refactor
/plan design a rollout for migrating our auth provider
Stack multiple skills (up to 5):
/github-pr-workflow /test-driven-development fix issue #123 and open a PR
skills_list()) gives descriptions (~3K tokens). Level 1 (skill_view(name)) loads full content only when needed. Level 2 (skill_view(name, path)) loads specific reference files on demand.
/learn turns anything you can describe into a reusable skill:
/learn the REST client in ~/projects/acme-sdk, focus on auth + pagination
/learn https://docs.example.com/api/quickstart
/learn how I just deployed the staging server
Large sources (books, paper stacks, specs) become knowledge-base skills: a lean SKILL.md with core mental models plus an index, one distilled file per chapter/topic under references/, and a glossary when the source earns one. Reference files cost nothing until a question needs one — the agent loads them on demand with skill_view, so query cost stays proportional to the answer, not the source.
---
name: my-skill
description: Brief description of what this skill does
version: 1.0.0
platforms: [macos, linux]
metadata:
hermes:
tags: [python, automation]
category: devops
fallback_for_toolsets: [web]
requires_toolsets: [terminal]
---
# Skill Title
## When to Use
Trigger conditions for this skill.
## Procedure
1. Step one
2. Step two
## Pitfalls
- Known failure modes and fixes
## Verification
How to confirm it worked.
$ hermes skills browse # Browse all hub skills
$ hermes skills browse --source official # Official catalog
$ hermes skills search kubernetes # Search all sources
$ hermes skills inspect openai/skills/k8s # Preview before install
$ hermes skills install openai/skills/k8s # Install with security scan
$ hermes skills check # Check for updates
$ hermes skills update # Reinstall changed skills
$ hermes skills audit # Re-scan all skills
$ hermes skills uninstall k8s # Remove
official — Nous Research optional skills catalogskills-sh — Community catalog (19,000+ entries)clawhub — OpenClaw marketplacelobehub — LobeHub skillsgithub — Any GitHub repo with SKILL.mdwell-known — /.well-known/skills/ endpointsAn autonomous background process that grades, prunes, and consolidates the skill library on a configurable cycle (default: 7 days):
$ hermes curator status # Check status
$ hermes curator run # Run now
$ hermes curator pause # Pause auto-runs
$ hermes curator pin <skill> # Pin so Curator won't prune it
Hermes includes a built-in cron scheduler for recurring, automated tasks. Jobs run with the full toolset, skills, and memory available. Output can be delivered to any connected messaging platform.
# Recurring job with skill loading + delivery
$ hermes cron create \
--schedule "every 30m" \
--prompt "Check our production API health and report if down" \
--skills health-check \
--deliver telegram:@your-bot
# One-shot scheduled job
$ hermes cron create \
--schedule "2026-08-24T09:00:00" \
--prompt "Run quarterly budget report and email results"
"30m" → every 30 minutes
"every 2h" → every 2 hours
"0 9 * * *" → daily at 9 AM (cron syntax)
"2026-08-24T09:00" → one-shot ISO timestamp
--continuity carries each run's output into the next — enables dedup and incremental digests for monitors.
--no-agent skips the LLM entirely — runs a script directly, delivers stdout verbatim. No tokens, no agent loop.
--monitor_script hashes script output — unchanged output suppresses the agent run (silent no-change), changed output triggers a run.
--skills loads skills before each run: the agent loads skills in order, then follows the prompt.
$ hermes cron list # List all jobs
$ hermes cron create ... # Create new
$ hermes cron run <id> # Fire immediately
$ hermes cron pause <id> # Pause
$ hermes cron resume <id> # Resume
$ hermes cron update <id> ... # Update
$ hermes cron remove <id> # Delete
#!/bin/bash
THRESHOLD=90
usage=$(df / | tail -1 | awk '{print $5}' | tr -d '%')
if [ "$usage" -gt "$THRESHOLD" ]; then
echo "WARNING: Disk usage at ${usage}%"
fi
A Hermes gateway is a long-running process that routes messages from messaging platforms through the same conversation loop as the CLI. Each profile runs its own gateway as a separate process with its own bot token.
$ hermes gateway start$ hermes gateway setup$ hermes gateway status
$ hermes gateway install # systemd (Linux) / launchd (macOS)Create bot via @BotFather, set TELEGRAM_BOT_TOKEN + TELEGRAM_ALLOWED_USERS.
Create app at discord.com/developers, enable bot scope, configure intents.
Business Cloud API (official) or Baileys (personal account).
Create Slack app, install to workspace, configure event subscriptions.
hermes photon login — device-code OAuth, no Mac relay needed.
Register a Signal number, configure the bridge.
@research_bot @ops_bot summarize this is processed by only those two bots. Set exclusive_bot_mentions: false for legacy groups.
A dedicated agent that monitors academic sources, summarizes findings, and archives knowledge.
$ hermes cron create \
--schedule "0 9 * * *" \
--prompt "Search arxiv for new RLHF papers, summarize the top 5, append to Notion" \
--skills arxiv-search,notion-write \
--deliver notion:ResearchQueue
Attached to messaging channels with scheduled reports. Each profile runs its own gateway and bot token.
$ hermes cron create \
--schedule "every 1h" \
--prompt "Check kubernetes cluster health, summarize node status, post to #ops-alerts if any node is NotReady or CPU > 90%" \
--skills kubernetes,slack-notify \
--deliver discord:#ops-alerts
Multiple bots collaborating on a single codebase — frontend, backend, and reviewer bots with complementary skills.
# Create the team
$ hermes profile create frontend --description "React/Vue specialist"
$ hermes profile create backend --description "API + database engineer"
$ hermes profile create reviewer --description "Code review and security"
# All start with the same codebase context
$ frontend chat → /axolotl install react,typescript
$ backend chat → /axolotl install python,sql,postgresql
$ reviewer chat → /axolotl install security-audit,github-code-review
hermes kanban to coordinate bots across boards with heartbeat, zombie detection, and per-task retry limits. The /goal slash command locks a target with a configurable turn budget.
A persistent agent that learns your preferences, schedules, and workflows — survives across sessions via persistent memory.
Inside a profile, SOUL.md shapes the agent's personality, USER.md stores your preferences, and MEMORY.md accumulates lessons across sessions. The agent's state.db (SQLite + FTS5) enables cross-session recall — it remembers past conversations and summarizes them on demand rather than loading raw history.
$ hermes cron create \
--schedule "0 8 * * *" \
--prompt "Summarize today's calendar events, unread emails, and overdue tasks" \
--skills google-workspace,apple-reminders \
--deliver telegram:@personal-bot
End-to-end content: research → draft → humanize → design → publish. Stack skills to chain the full workflow.
Each skill in the chain loads in order: /youtube-content transcribes and summarizes a source, /humanizer strips AI-isms and adds natural voice, /claude-design packages it into a publishable layout.
$ hermes cron create \
--schedule "0 10 * * 1" \
--prompt "Find the top 5 performing posts from last week, summarize why they worked, and draft 3 new angles" \
--skills airtable,google-workspace \
--deliver notion:ContentIdeas
Monitor data pipelines, alert on anomalies, and generate reports — using the watchdog pattern.
The --no-agent flag skips the LLM entirely — the script's stdout is delivered verbatim. Empty output means a silent tick (nothing sent), so the bot only alerts when something is actually wrong.
$ hermes cron create \
--schedule "every 1h" \
--prompt "Query the production DB for failed jobs in the last hour, summarize root cause, and suggest a fix" \
--skills terminal,github-issues \
--deliver discord:#data-alerts
~/.hermes/ # Default profile root
~/.hermes/profiles/<name>/ # Named profile
~/.hermes/config.yaml # Main config (settings, never secrets)
~/.hermes/.env # API keys and secrets
~/.hermes/auth.json # OAuth provider credentials
~/.hermes/SOUL.md # Primary agent identity
~/.hermes/memories/MEMORY.md # Persistent memory (agent-written)
~/.hermes/memories/USER.md # User preferences
~/.hermes/skills/ # All installed skills
~/.hermes/cron/ # Scheduled jobs
~/.hermes/sessions/ # Gateway session state
~/.hermes/logs/ # agent.log, gateway.log, errors.log
~/.hermes/state.db # Session store (SQLite + FTS5)
model:
default: anthropic/claude-sonnet-4
provider: openrouter
agent:
disabled_toolsets: ["browser"]
max_turns: 500
terminal:
backend: local # local, docker, ssh, daytona, singularity, modal
cwd: /home/user/projects
compression:
threshold: 0.7 # 70% = caution, 90% = warning
target_ratio: 0.3
protect_last_n: 2
auxiliary: # Models for internal operations
vision: openai/gpt-4o
web_extract: openai/gpt-4o-mini
compression: google/gemini-1.5-flash
session_search: openai/gpt-4o-mini
skills_hub: openai/gpt-4o-mini
mcp: openai/gpt-4o-mini
| Command | Purpose |
|---|---|
hermes chat | Interactive or one-shot chat |
hermes -z "prompt" | One-shot (stdout only, no formatting) |
hermes setup | Full setup wizard |
hermes model | Pick provider + model |
hermes profile | Manage profiles |
hermes gateway | Run messaging gateway |
hermes skills | Browse, install, audit |
hermes cron | Inspect + tick cron |
hermes kanban | Multi-profile boards |
hermes dashboard | Web admin panel |
hermes desktop | Native desktop app |
hermes tools | Configure tools per platform |
hermes doctor | Diagnose issues |
hermes backup | Back up entire Hermes home |
hermes update | Pull latest code + sync skills |
hermes -p <name> | Target a specific profile |
hermes -w | Git worktree isolation mode |
/learn Turn anything into a reusable skill
/skill Load a skill from within chat
/goal Lock a target for cross-turn work
/journey Visualize memory + skill timeline
/rollback Undo to a filesystem checkpoint
/version Show agent + model version
/billing Show usage + cost breakdown
/update Reload agent source files
/export Export current profile to .tar.gz
/import Import a profile archive
| Backend | Scope | Use Case |
|---|---|---|
local | Default | Local machine execution |
docker | Isolated | Containerized execution |
ssh | Remote | Remote server execution |
daytona | Cloud dev | Ephemeral cloud workspace |
singularity | HPC | Academic/HPC clusters |
modal | Serverless | Scale-to-zero cloud functions |
hermes -w (worktree mode) when spawning agents that edit code — prevents git conflicts across parallel agents.