How I Set Up Hermes Agent on a Hetzner VPS
Over the past few weeks I've been running Hermes Agent, an open-source AI agent framework by Nous Research, on a cheap Hetzner VPS. It now handles my morning briefings, syncs my Obsidian vault, manages my blog, and is available on Telegram whenever I need it. Here's exactly how I set it up.
Quick Setup Summary
This Hermes Agent setup runs on:
- Hetzner CX23 VPS
- Ubuntu
- OpenRouter for model access
- Telegram gateway for mobile access
- Obsidian Sync for vault access
- Cron jobs for scheduled automation
- Hermes skills and memory for persistent workflows
Choosing a Hetzner VPS for Hermes Agent
I spun up a Hetzner CX23 — that's 2 vCPUs (Intel Xeon Skylake), 4 GB RAM, and a 40 GB SSD running Ubuntu. It costs about €5/mo and is more than enough for this workload.
Installing Hermes Agent on Ubuntu
One command:
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
This drops everything into ~/.hermes/hermes-agent/ with its own venv. The hermes CLI is available immediately. Run hermes on its own for an interactive chat session, or hermes chat -q "your question" for one-shot queries.
Configuring Hermes Agent with OpenRouter
Hermes is provider-agnostic — it works with OpenRouter, Anthropic, OpenAI, DeepSeek, local models, and a dozen others. I went with OpenRouter because it gives me access to multiple frontier models through a single API key. My daily driver is DeepSeek V4 Pro (deepseek/deepseek-v4-pro), which is fast, cheap, and handles the agent loop well. Configuration is simple:
hermes model # interactive picker
# or directly:
hermes config set model.default deepseek/deepseek-v4-pro
hermes config set model.provider openrouter
API key goes in ~/.hermes/.env as OPENROUTER_API_KEY.
Setting Up the Hermes Telegram Gateway
This is where Hermes gets really useful. The gateway connects Hermes to messaging platforms so you can talk to your agent from your phone. I set up Telegram first:
hermes gateway setup # choose Telegram, follow the bot token flow
hermes gateway install # install as a systemd user service
Key quality-of-life step: enable systemd linger so the gateway survives SSH logout:
sudo loginctl enable-linger $USER
Now the gateway runs 24/7 as a user service. I restricted access to my Telegram user ID only (allowed_chats: <your-telegram-user-id> in config) so no random person can chat with my agent.
I also have a daily morning roundup cron job that delivers a market snapshot and weather to Telegram, and a daily evening journal prompt that nudges me to write an Obsidian entry. These fire autonomously — I just wake up to a message and reply.
Syncing an Obsidian Vault with Hermes Agent
My Obsidian vault lives at a local path and is organised into folders for notes, links, projects, journal entries, and blog drafts. I wanted it continuously synced so my agent can read and write notes.
I used the obsidian-headless CLI (Obsidian's official headless sync tool, currently in open beta) to authenticate and connect the remote vault. Then I wired up a cron job that runs ob sync periodically:
hermes cron create "<schedule>" \
--script obsidian-sync.sh \
--no-agent \
--deliver local
The --no-agent flag means this runs as a plain script — no LLM involved, just ob sync. The sync is one-way pull from Obsidian's servers, so my phone / laptop edits flow down to the VPS.
Hermes also has the obsidian skill loaded, which means the agent knows the vault layout, metadata conventions, and can create/edit notes with proper frontmatter. This is how the blog pipeline works — more on that below.
Using Hermes Skills for Reusable Workflows
Hermes learns from experience. When it solves a complex task, it can save the approach as a skill — a markdown document with step-by-step instructions, pitfalls, and verification steps. Skills accumulate and make the agent better over time.
A few that matter for my setup:
hermes-agent— the canonical skill for configuring and extending Hermes itself (CLI reference, provider docs, troubleshooting)obsidian— vault operations: reading, writing, searching, and creating notes with proper frontmatter- A custom skill that generates my weekly blog posts by pulling saved links from Obsidian
computer-use— drives the Linux desktop in the background via cua-driver for GUI automation
Skills are essentially reusable cookbooks. The agent loads them automatically when a task matches, and you can always summon one explicitly with /skill <name>.
How Hermes Persistent Memory Works
Hermes has persistent memory across sessions. It remembers who I am, my preferences, environment details, and lessons learned. The memory budget is split between a user profile (name, role, preferences) and agent notes (environment, conventions, tool quirks). Memory is injected into every turn, so the agent doesn't need to be re-briefed.
My memory entries include things like project-specific conventions, vault metadata rules, and recurring task schedules.
This is what makes Hermes feel like my agent rather than a generic assistant.
Publishing Blog Posts from Obsidian with Hermes
The "Quick Links for Devs" weekly series is semi-automated: I save interesting articles to my Obsidian vault's Blog/ directory throughout the week, and when I ask Hermes to publish, it:
- Determines the current ISO week
- Finds all Obsidian entries saved that week
- Generates commentary for each link
- Writes the post to
content/posts/quick-links-for-devs-week-N-YYYY.md
The posts are standard markdown with YAML frontmatter, same as any other article on the site.
Running Hermes Cron Jobs on a VPS
Three cron jobs keep everything running:
| Job | Schedule | What it does |
|---|---|---|
| Morning roundup | Daily | Markets + weather delivered to Telegram |
| Obsidian Sync | Periodic | Pulls vault changes from Obsidian Sync |
| Journal prompt | Daily | Nudges me to write a journal entry |
All three run in the background without me touching anything. The morning roundup and journal prompt deliver to Telegram; the sync job runs silently.
What I'd Do Differently
I'd set up web.extract_backend to something other than DuckDuckGo from day one — DDG is search-only and can't extract page content, which leads to errors when the agent tries to read URLs.
Is Self-Hosting Hermes Agent on Hetzner Worth It?
For ~€5/mo I have an AI agent that:
- Is available on Telegram 24/7
- Keeps my Obsidian vault synced
- Writes blog posts from my saved links
- Remembers my preferences across sessions
- Gets smarter over time through skills
It's not about replacing my workflow — it's about having a persistent, trainable assistant that lives on my infrastructure and works on my terms. If you're comfortable on the command line and curious about agentic AI, Hermes on a cheap VPS is a great weekend project.
Comments