In 2026, Nous Research open-sourced Hermes Agent as a long-running process on your hardware: cross-session memory, automatic Skill creation, and twenty-plus messaging gateways including Telegram. Most failures happen on day one: broken dependencies, wrong API keys, or a Telegram bot that never replies.
This guide is for developers who want a clean install on macOS, Linux, or WSL2 without hand-rolling Python and Node. You get a host decision matrix, the official installer, and a six-step path from hermes doctor to hermes gateway start. After reading, you should know whether ~/.hermes/ belongs on a laptop or on an always-on Mac Mini.
01 Hermes Agent install pain points: not the same workflow as OpenClaw
Hermes and OpenClaw both expose a Gateway, but the defaults differ. OpenClaw leans on a plugin-heavy control plane; Hermes emphasizes three-layer memory, Skill evolution, and MCP. The official installer pulls Python 3.11, Node.js 22, ripgrep, and ffmpeg into ~/.hermes/hermes-agent/venv so you do not fight system Python.
If you already run OpenClaw in production, do not copy the same environment variables blindly: Hermes uses different config keys and writes Skills under its own layout. Spin up a parallel test user or a second rental host before you point production Telegram tokens at the new stack so rollback and latency comparisons stay honest.
For teams that care about data residency, Hermes keeps profile, Skill, and Gateway state on disk under ~/.hermes/. That is easier to reason about than SaaS copilots whose prompts may land in US cloud regions, but API keys for OpenRouter or Anthropic still leave your network when models run in the cloud—document key storage and vendor subprocessors separately from Gateway disk policy.
- Dependency drift: Manual pip installs often hit
ModuleNotFoundError: dotenvbecause the shell still calls system Python instead of the project venv. - Sleep breaks Gateway: A MacBook is fine for a POC; production needs a host that does not suspend during cron and messaging workloads.
- Linux VPS gaps: API-only Gateway mode works on x86 VPS, but some macOS browser automation paths are not replicated on Linux without extra work.
- Telegram group privacy: Bots in groups ignore normal messages until you disable Group Privacy in BotFather and re-invite the bot.
- Config migration: After upgrades, run
hermes config checkif you seeMissing config after update.
Install can finish in under twenty minutes; uptime and a backup strategy for
~/.hermes/decide long-term value.
Commands and behavior follow Nous Research official docs; re-open the links after each release.
02 Hermes Agent requirements and host matrix: where to run production
The installer supports macOS 12+, Ubuntu 20.04+, WSL2, and Termux. Native Windows PowerShell is early beta; WSL2 plus the Linux script is the safer Windows path today.
| Host | 24/7 uptime | Install friction | Skill compounding | Main weakness |
|---|---|---|---|---|
| MacBook | Breaks on sleep | Low | POC only | Updates and lid-close |
| Raspberry Pi 4B 8GB | Good but IO-bound | Medium | Light Gateway OK | Long jobs time out |
| x86 Linux VPS | High | Medium (--skip-browser) | API mode stable | No native macOS toolchain |
| Mac Mini M4 bare-metal rental | Datacenter SLA | Low over SSH | launchd + UMA fit | Pick region and term |
Official minimums: about 4 GB RAM for Gateway plus cloud APIs; 16 GB unified memory if you run local models or heavy browser automation. Reserve 1.5 GB disk for the base install and more for Skills cache; production teams often budget 20 GB SSD headroom for logs and Skill growth.
Read the matrix as a production decision aid, not a replacement for the official Prerequisites page. If you plan browser automation plus local models from day one, start on a 16 GB tier—retrofitting RAM on a Raspberry Pi or tiny VPS is painful, while bare-metal Mac rentals can scale memory without swapping hardware.
Latency matters for Telegram: a distant VPS may add round-trip delay even when uptime looks fine on paper. A Mac in a region you control, reached over SSH, often feels closer to “local install” for operators who live in messaging apps all day.
03 Hermes Agent one-line install and health check on macOS and Linux
curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash
# Headless server:
curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash -s -- --skip-browser
source ~/.zshrc
hermes doctor
hermes --version
The installer typically installs uv, pins Python 3.11, installs Node.js 22, clones into ~/.hermes/hermes-agent/, and exposes the hermes CLI. Fix every failed hermes doctor item before hermes setup.
On headless Linux, pass --skip-browser when you only need Gateway plus cloud APIs. On macOS, the same script is the most battle-tested path and keeps Camoufox-style browser tooling available when you enable it later.
After install, confirm the CLI resolves to the venv binary under ~/.hermes/hermes-agent/venv/bin/hermes if you ever see ModuleNotFoundError—that error almost always means the shell is still calling system Python.
Telegram channel details live in the official messaging guide.
04 Six steps: model setup, first chat, Telegram, and Gateway always-on
- Configure the LLM: Run
hermes setuporhermes modelfor OpenRouter, Anthropic, OpenAI, Ollama, and others. Store keys in~/.hermes/.env. - Smoke-test the CLI: Run
hermesand ask for a verifiable task such as counting files in the current directory. - Create the Telegram bot: Use
@BotFatherwith/newbot; collect your numeric user ID from@userinfobot. - Wire Gateway: Run
hermes gateway setup, choose Telegram, paste token and allowed user IDs, or setTELEGRAM_BOT_TOKENandTELEGRAM_ALLOWED_USERS. - Foreground test: Run
hermes gatewayand message the bot from your phone before daemonizing. - Daemonize: On macOS use
hermes gateway installandhermes gateway start(launchd). On Linux use the documented systemd path with--systemwhen appropriate.
On a CALMVPS bare-metal Mac, pick a tier on the pricing page, SSH in, run the same commands, and tarball ~/.hermes/ before changing hosts.
For group chats, disable BotFather Group Privacy and re-invite the bot—otherwise Hermes will look “broken” while only slash commands work. For direct messages, restrict TELEGRAM_ALLOWED_USERS to your numeric ID so random users cannot drive tools on your host.
When moving from laptop to rental, copy the entire ~/.hermes/ tree, not chat exports. Skills, episodic SQLite, and Gateway config all live beside .env; partial copies waste the compounding you built during the POC week.
05 Reference specs, common errors, and when CALMVPS wins
- Installer stack: uv, Python 3.11, Node.js 22, ripgrep, ffmpeg per official Installation docs; confirm with
hermes --versionafter upgrades. - State directory:
~/.hermes/holds env, skills, memories, and Gateway state; migrate with a full directory backup. - Power envelope on M4: community datacenter notes often cite roughly 4–6 W idle and 15–25 W under typical Agent load; validate on your meter.
| Symptom | Likely cause | Fix |
|---|---|---|
| hermes: command not found | PATH not reloaded | source ~/.zshrc or open a new terminal |
| API key not set | LLM not configured | hermes model or edit ~/.hermes/.env |
| Group chat silent | Bot privacy mode | Disable Group Privacy in BotFather, re-add bot |
| Missing config after update | Schema drift | hermes config check and migrate |
FAQ: Restarting the host does not usually wipe on-disk memory files; you lose in-flight session context and cron continuity instead. A laptop is fine for a weekend trial; production should use a host that never sleeps during messaging and scheduled jobs. Run hermes update on a schedule and re-run hermes doctor after each upgrade.
A sleeping laptop breaks Gateway continuity; a cheap offshore VPS lacks macOS-native tooling; a Raspberry Pi hits IO ceilings on long jobs. For Telegram 24/7, launchd-friendly daemons, and fast RAM upgrades, CALMVPS bare-metal Mac Mini M4 rental is usually the better production default: dedicated Apple Silicon, SSH delivery, and flexible monthly terms on the pricing page.