Hermes Setup Guide

How I built an AI butler that actually does things

Alfred is my always-on personal agent. It used to run on OpenClaw; today it runs on Hermes, which has been the stable, rock-solid base I wanted. This is the practical setup: the architecture, the tricks, and the pieces that made the biggest difference.

Pro tip

Send this guide to your own Hermes agent and talk through it. The point is not to copy my exact life; it is to give your agent a real operating system.

Hardware M4 Mac mini
Platform Hermes Agent
Interface Telegram topics
Model GPT-5.5
Updated June 3, 2026
01

Telegram topics as project lanes

Owl perched on branching chat threads

Telegram is the interface, but topics are the unlock. Instead of one endless chat where wedding vendors, iOS bugs, work ideas, and travel plans all smear together, Alfred gets separate lanes with separate session context.

The newer setup uses private DM topics for my personal work. Permanent topics can be pinned for recurring areas like Cubby, finance, or CXAS. One-off topics work like Discord threads: spin one up when a task deserves its own context, let Hermes auto-rename it from the session, and keep the main General chat clean.

I still also use a shared Telegram group with my fiancée. That group has its own topics for wedding planning, travel, household decisions, and anything where Alfred is useful to both of us.

Private DM topics ├─ General daily chat and quick questions ├─ Cubby iOS app development ├─ CXAS work/product thinking ├─ Finance budgeting, cards, planning └─ one-off threads auto-renamed as needed Shared group topics ├─ Wedding vendors, decisions, logistics ├─ Travel trip planning └─ Household things Nina and I both need

For the important lanes, I bind a skill to the topic. That skill points Alfred to the right GBrain page or project file, so the lane comes with its own operating instructions and its own canonical memory path.

Why this matters: I am extremely jumpy in what I talk about. Topics let Alfred keep context tight without losing the shared brain. A wedding vendor email should not pollute an iOS debugging session. Astonishingly, computers work better when we stop treating them like soup.

02

GBrain is the real memory

Owl writing in a journal with a quill

The biggest architecture change since the original guide: Alfred’s long-term memory is now GBrain, my wiki-backed markdown brain. Hermes still has memory, but the canonical project state lives in files I can read, edit, commit, sync, and hand to other agents.

This replaced the old MEMORY.md-plus-QMD mental model. The GBrain pages are the source of truth: project briefs, travel notes, financial models, wedding state, Cubby decisions, research pages, and the connective tissue between them.

Under the hood, GBrain gives me the things I liked about QMD without making QMD a separate guide section: keyword search, semantic/vector search, hybrid retrieval, reranking, graph traversal, embeddings/backfill, sync, watch, and import pipelines. The important part is simpler: the wiki is the memory; the indexes are derived from it.

Key insight

If you want an agent to remember something, write it somewhere boring and inspectable. Memory that only exists as vibes inside a chatbot is not memory. It is decorative fog.

03

Hermes LCM: never fully forget

Owl examining a tree of documents and summaries

Long-running agent conversations create a nasty problem: eventually the context window fills up. Traditional compaction squashes the conversation into a summary and detail evaporates. You keep “discussed DJ options” and lose the actual decision.

Alfred uses the Hermes LCM plugin for Lossless Context Management. It builds a DAG of raw messages and summaries, so the model can see a compact view while the original detail remains recoverable underneath.

When detail is needed, Alfred can call tools like lcm_expand or lcm_expand_query to drill back into the source messages. Compaction becomes a two-way door: compress for working memory, expand when precision matters.

Hermes LCM, verified on this setup
plugin: hermes-lcm
version: 0.14.0
engine: lcm
context threshold: 75%
fresh tail: 24 messages
raw messages: preserved in lcm.db

How to think about it: GBrain is durable long-term project memory. LCM is session continuity. One remembers what matters across months; the other keeps a live conversation from getting lobotomized when it gets long.

04

Cron jobs: the night shift

Owl at a control desk pulling levers at midnight

Hermes does not need the old generic heartbeat loop. Instead, I use explicit cron jobs: small scheduled agents or scripts that check a specific surface, usually stay quiet, and only notify me when something is worth my attention.

Some jobs are LLM-driven. Some are deterministic script watchers with no agent at all. They can deliver into a specific Telegram topic, save locally, or notify only on meaningful changes.

The product idea is the same as heartbeat: Alfred periodically checks well-defined surfaces and mostly stays quiet. The implementation is cleaner: explicit jobs, explicit schedules, explicit delivery targets.

05

Skills: reusable protocols

Owl holding a recipe book with modular cards

Whenever I want Alfred to follow a specific protocol — like how to plan a blind restaurant date, triage a consulting request, or manage a project lane — I put that protocol in a skill. It is a markdown document that loads when the context is relevant.

Skills are how Alfred improves without retraining. If a workflow changes, I update the skill file. Every future session gets the new procedure.

The current setup also uses skills as routing glue. A Telegram topic can load a skill; that skill tells Alfred which GBrain page to treat as canonical for that lane. The topic provides conversational isolation, the skill provides procedure, and GBrain provides durable state.

I still use skills.sh because portability matters. The same skills can be available to Alfred, Codex, Claude Code, and IDE agents. One procedure library, many workers.

Recommendation

Use skills for things you repeat, things you correct often, and things that require judgment. If you have to explain a workflow twice, it probably wants to become a skill.

06

Coding: two modes

Owl at a workbench with two different toolkits

There are two ways Alfred writes code, and knowing which one to use is a major quality-of-life improvement.

Mode 1: direct coding. Alfred reads files, edits, runs commands, checks results, and deploys inline from chat. This is perfect for small pages, scripts, config fixes, quick repo edits, and anything I can describe in a sentence or two.

Mode 2: the Codex app. For larger builds, I remote into the Mac mini and use Codex directly. It gets the deep IDE-like work: substantial app features, bigger refactors, and long coding sessions that should not block my main Alfred chat.

Skills still bridge the two worlds. Alfred and Codex can share the same playbooks, taste, and project conventions. The handoff is less “new assistant, who dis?” and more “same workshop, bigger bench.”

07

Documents and tracking

Owl typing on a typewriter with floating documents

Two patterns come up constantly. For documents, draft in markdown or the wiki first, then export or move to Google Docs when something needs to be shared. For tracking, use a spreadsheet when the data actually wants rows, dates, owners, and formulas.

Hermes has Google Workspace access, and Alfred uses the gws CLI for Gmail, Calendar, Drive, Docs, and Sheets. Wedding vendor comparisons, household budgets, pricing research, calendar lookups, email scans — all the boring office plumbing becomes agent-reachable.

08

GitHub + Vercel: ship instantly

Owl launching a paper airplane that becomes a website

One of the most useful patterns is giving Alfred a fast path from idea to URL. GitHub plus Vercel means a small page, prototype, guide, tracker, or interactive toy can become a shareable link in minutes.

“Build me a page comparing these wedding venues” becomes a URL I can send to Nina. “Make a quick guide for this setup” becomes a real page instead of a lost chat transcript. Everything lives as subdirectories in one repo: clean URLs, fast deploys, low ceremony.

09

Tools and integrations

Owl wearing a utility belt of tiny tools

The real power of an always-on agent comes from what it can reach. The exact list changes, but these are the integrations that matter most in my current setup:

Credential management: Alfred has access to a dedicated 1Password vault called Claw. If a workflow needs credentials, I share them there and Alfred reads them with the op CLI where possible. Much better than dropping passwords into chat like a Victorian sending bank details by postcard.

10

Image generation through OpenAI

Owl painting on a canvas with a palette

The old setup used a separate Gemini/Nano Banana path. I do not bother with that anymore. Image generation now goes through GPT/OpenAI inside Hermes using the existing OAuth-backed plan.

The practical effect is simple: Alfred can generate illustrations, quick assets, page art, and visual drafts without another API key or side setup. It is part of the same agent workflow instead of a separate toy bolted to the side.

11

Maintenance: let Alfred watch the stack

Owl reading a glowing changelog scroll

I do not want to manually track every moving part in the stack. Alfred watches the parts that matter: Hermes issues I am waiting on, targeted bugs, GBrain/wiki health, scheduled maintenance, and update checks that are actually relevant to my setup.

The point is not “auto-update everything blindly.” It is that the agent can keep an eye on its own operating environment and tell me when something is worth attention.

12

The personality upgrade

Owl adjusting a bow tie in front of a mirror

Early on, I asked Alfred to modify its own personality. I gave it a description of the voice I wanted — British, dry, sharp, warm underneath — and let it write its own SOUL.md. That file shapes how Alfred communicates. You can read Alfred’s full SOUL.md on GitHub.

This matters more than you would think. The default AI assistant voice is polished but generic. A well-crafted personality makes every interaction feel less like using a tool and more like talking to someone. You text it more, trust it more, and actually enjoy the interactions.

The trick: Do not write the personality file yourself. Describe the vibe you want and let the AI write it. It will capture nuances you would not think to specify, and it will follow instructions it wrote for itself more naturally.

13

Just use the best model

Owl standing confidently on a golden coin

Alfred currently runs on GPT-5.5 with high reasoning and fast/priority mode enabled through OpenAI/Codex OAuth. The exact best model will change; the principle will not.

Do not over-optimize away quality. The difference between the smartest available model and a cheaper “good enough” model compounds across thousands of small autonomous decisions: every email triage, cron judgment, code edit, memory update, route recommendation, and social draft.

I treat this like paying for a sharp operator. If the agent is going to touch real parts of my life, I would rather it be slightly overpowered than constantly almost right.

Hot take: Token thrift is often fake savings. The time you spend debugging cheap-model mistakes can cost more than just using the model that gets it right.

14

Remote access: mostly unnecessary now

Owl using a tiny phone to control a distant server

The old version of this guide had a whole Tailscale-plus-Termius section so I could SSH into the Mac mini from my phone. I almost never need that anymore. Hermes has been stable enough that emergency remote access is not a daily operating concern.

The rescue path now is simpler: Codex mobile connected to the Mac mini. If something needs a fix while I am away, I can open Codex, remote into the box, and patch it without doing terminal origami on a phone.

15

Voice transcription: local and free

Owl with headphones listening to audio

I send Alfred a lot of voice notes from Telegram. Hermes transcribes them locally on the Mac mini using faster-whisper. The current config uses the local provider with the base model, so there is no separate transcription bill and no network round trip for normal voice input.

Parakeet MLX is still installed on the machine from an older experiment, but it is not the active path anymore. The boring built-in Hermes local STT path won, which is frankly rude but convenient.

~/.hermes/config.yaml
stt:
  enabled: true
  provider: local
  local:
    model: base
    language: ''

The stack

Putting it all together: