When I first ran Hermes, I figured, “Okay, console agent, I’ll set everything up myself.” Turns out it ships as a full platform: CLI, TUI with tabs, a web dashboard on port 9119, a gateway for 20 platforms, cron, MCP, memory, a desktop app, editor integrations and about 70 built-in skills.
But when you actually use it seriously – you hit the limits. After a month and a half of fine-tuning, it’s not a “console agent” anymore. It’s a personal ecosystem.
What Hermes Gives Out of the Box#
I’m not going to list everything – just what I actually use.
Interfaces. CLI (hermes chat) with a multiline editor, TUI and a web dashboard for config and sessions. The gateway supports Telegram, Discord, Signal, Email and about 15 others – but it’s turned off out of the box.
System features that came in handy:
- Built-in cron – I’m running 11 tasks on it
- MCP – TwentyCRM and Apple Notes
- Subagent delegation – I farm out tasks to child agents sometimes
- Context compression (I turned it off)
- Browser automation – for QA
- Six terminal backends – I use local and SSH
What I changed from the defaults:
- Model: empty string -> DeepSeek v4 Flash (direct API)
- Gateway: off -> Telegram 24/7
- Compression: on -> off (DeepSeek handles the context, the aux model just wastes tokens)
- Streaming: true -> false
- Cron: 0 tasks -> 11
- MCP: 0 -> 2
- Profiles: 1 -> 5
- tool_progress: false -> true (I see every call)
Memory: Where It All Started#
This is the single biggest change. Hermes comes with two memory levels out of the box – MEMORY.md (2,200 chars) and USER.md (1,375). Both are loaded into the system prompt of every session. It’s fine for basic use, but when you start using it actively, they fill up fast. And the optimization script loses data when it overwrites them.
I expanded this to eight levels:
Level 0: memory-map.md -- read-only map for the agent (chmod 444)
⬇
Level 1: MEMORY.md -- just pointers to storage (5,000 chars)
⬇
Level 2: USER.md -- preferences and profile (4,000 chars)
⬇
Level 3: Fact Store -- structured facts (about 270)
⬇
Level 4: ChromaDB -- semantic search (2,023 documents)
⬇
Level 5: Obsidian -- my notes in PARA structure
⬇
Level 6: NotebookLM -- temporary research
⬇
Level 7: SSH -- heavy computation and local LLMs on OmarchyHow it works. The agent reads the memory-map, sees the storage hierarchy, checks MEMORY.md (the pointers) and then goes to Fact Store or ChromaDB for the details. Everything that doesn’t need to be in every prompt lives on the lower levels. Saves tokens without losing data.
Fact Store is a structured fact database with entity resolution and trust scoring. The agent writes here instead of MEMORY.md. Right now it has about 270 facts and can grow without limits.
ChromaDB indexes three sources: Obsidian (303 docs), Apple Notes (645) and Python projects (1,409). That’s 2,023 documents, about 20 MB. I write “find where I wrote about Jellyfin” and the agent finds it, even if the query doesn’t have the exact words from the title.
Apple Integration: From “It’s on the List” to “It Works”#
Hermes ships with five Apple skills. The skills are there, but they’re not configured.
Apple Notes – the biggest change. Out of the box, the agent reads notes through the memo CLI on Python + JXA: 6.5 minutes for 644 notes, 697 duplicates, crashes periodically. I swapped it for apple-notes-mcp – a Rust server on ScriptingBridge. 15x faster: 26 seconds, zero duplicates, stable. On top of that, I have incremental indexing into ChromaDB every 12 hours via cron.
iMessage. The skill exists, CLI (imsg) is installed. I added the integration to the gateway – now I can send an iMessage directly from the Telegram chat.
Apple Reminders. Works through remindctl with specific lists. I can add a reminder by voice through Telegram.
FindMy. AirTag tracking. Handy for “where’s my backpack.”
The whole Apple stack is accessible through a unified search script along with Obsidian and Python projects.
Architecture: Two Machines, One Agent#
Hermes runs on my MacBook locally. For the heavy tasks, there’s Omarchy – Arch Linux on a desktop with a TITAN X Pascal (12GB VRAM). I set up SSH for the agent there.
┌─────────────────────┐ SSH ┌──────────────────┐
│ macOS MacBook │ ──────────▶ │ Omarchy (Arch) │
│ │ │ │
│ • Hermes Agent │ │ • Ollama (LLMs) │
│ • Telegram gateway │ │ • ChromaDB │
│ • Apple stack │ │ • TwentyCRM MCP │
│ • Obsidian vault │ │ • PenPot │
│ • Local files │ │ • Heavy tasks │
└─────────────────────┘ └──────────────────┘Two machines, one agent. I type in Telegram – it works where it needs to. Heavy indexing and LLMs are on Omarchy. Daily tasks are local.
Transparency: I See Every Step#
I configured the system so no call goes unnoticed. Without transparency, the agent is a black box.
| Setting | Mine | Effect |
|---|---|---|
tool_progress_command: true | On | Every terminal call in Telegram |
streaming: false | Off | No streaming text over tool calls |
approvals.manual: true | On | Dangerous commands (rm -rf, git reset) require approval |
security.redact_secrets: true | On | API keys are redacted from output |
Plus cron mode: deny – scheduled tasks don’t execute dangerous commands. If something goes wrong, I just write “stop.”
Hats: Roles Instead of Profiles#
The original inspiration is Garry Tan’s gstack – about 30 slash commands for Claude Code, each with a methodology. I adapted the roles I needed and called them hats. One agent, one profile – it switches roles based on the task.
I have 13 hats – eight individual roles and five combined cycles:
Individual roles:
- Strategist – strategic thinking with forcing questions: who will pay? what can we ship tomorrow?
- Architect – architecture before code: data flow, state transitions, failure modes, ADR
- CSO – security audit: from secrets in git history to OWASP Top 10 and STRIDE
- Debugger – iron law: don’t fix until you find the root cause
- QA – smoke test, forms, empty states, HTML integrity
- Reviewer – code review: SQL injection, race conditions, scope drift
- Shipper – release engineer: sync, test, version, changelog, PR
- Documenter – documentation by Diataxis after merge
Combined cycles (run through several roles):
- full-cycle: Strategist -> Architect -> Dev -> Reviewer -> Shipper -> Documenter
- fix: Debugger -> QA -> Documenter
- quick-ship: Strategist -> Architect -> Dev -> Shipper -> Documenter
- research: Strategist -> Architect -> Documenter
- audit: Architect -> CSO -> Architect v2
I load /skill strategist and the Strategist methodology appears in the prompt: six questions, premise challenge, reference patterns. Until I take off the hat.
Other Details#
50+ custom skills. None of them are from the hub – all written for my own tasks: from a morning ritual with weather to Docker stacks and tailnet.
11 cron tasks. LLM tasks (free model via OpenRouter): morning weather + productivity, idea reminders, evening daily note. Script-only: Obsidian indexing (every 6h), Apple Notes (every 12h), Python projects (daily), memory optimization, cost dashboard.
Five profiles. default (DeepSeek), zai (formerly GLM), orchestrator (multi-agent), local (Ollama on Omarchy), developer (for experiments).
Telegram-first. I write in the chat – the agent replies. I don’t open the terminal or poke around in the dashboard.
PenPot via MCP – open-source Figma on Omarchy. The agent creates and edits designs from the chat.
MagicPath – search and install UI components via AI. Officially doesn’t support Hermes, I hooked it up manually through npx.
TL;DR#
| Aspect | Default | Mine |
|---|---|---|
| Interface | CLI + dashboard | Telegram-first |
| Gateway | Off | Telegram 24/7 |
| Model | Not set | DeepSeek v4 Flash |
| Compression | On | Off |
| Memory | 2 levels | 8 levels |
| Custom skills | 0 | ~50 |
| Cron | 0 | 11 tasks |
| MCP | 0 | 2 servers |
| Profiles | 1 | 5 |
| tool_progress | Hidden | Everything visible |
The biggest difference is Telegram as the entry point. I don’t open the terminal to ask about the weather, set an idea reminder or trigger indexing. I just write in the chat.
The second is multi-level memory. Without it, the agent loses context between sessions. Now it knows where everything lives and uses the right level for each type of information.
The third is cron automation. The default Hermes does nothing until you type something. Mine wakes up, checks the weather, indexes notes, reminds me of ideas.
The fourth is the Apple stack. Not “skill exists but isn’t configured” – actual working tools: Apple Notes in ChromaDB, iMessage from the chat, Reminders by voice.
June 16, 2026. Setup keeps evolving.
