← Back to all posts

How I Set Up Hermes Agent on a Hetzner VPS

· Jacob E. Dawson

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:

  1. Determines the current ISO week
  2. Finds all Obsidian entries saved that week
  3. Generates commentary for each link
  4. 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