I Gave an AI Agent Permanent Residence on My Mac
I Gave an AI Agent Permanent Residence on My Mac: My Hermes Agent Setup
A hands-on walkthrough of installing, configuring, and living with Hermes Agent — the open-source agent framework from Nous Research.
First, what even is Hermes?
If you've used Claude Code, Codex, or OpenClaw, you know the genre: a terminal-native agent that reads your files, runs your shell, and gets real work done with tool calls. Hermes Agent is the open-source entry in that category — and the reason I picked it over the alternatives is what it does after the coding session ends:
- It remembers. Persistent memory carries facts about you, your environment, and lessons learned across sessions. I don't re-explain my setup every morning.
- It learns. Anything I teach it once — a workflow, a pitfall, a correction — gets saved as a skill that reloads automatically next time that kind of task comes up.
- It's everywhere I am. The same agent core runs in the terminal, a desktop app, and a gateway that connects it to messaging platforms. For me, that meant WhatsApp.
- It's provider-agnostic. It talks to OpenRouter, Anthropic, OpenAI, Google, local models, and 20+ others. You're not locked into one vendor's subscription.
This post is the walkthrough of how I actually set it up on macOS — install, model config, the WhatsApp gateway, cron automation, and skills — with the commands I ran.
Installation
The whole install is one line. The shell script bootstraps the package manager, Python, dependencies, and the launcher:
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
Then the interactive setup wizard walks you through picking a model and provider:
hermes setup
hermes model # pick model + provider
hermes doctor # health check — catches missing deps and bad config
hermes doctor is worth a mention: it's the "did I break anything?" command I run after every config change. Five minutes from curl to a working agent chat in the terminal.
Model configuration
Hermes stores settings in ~/.hermes/config.yaml and secrets in ~/.hermes/.env — a separation I appreciate, because it means I can share or version my config without leaking API keys.
I route through OpenRouter so I can swap models without touching anything else:
model:
default: z-ai/glm-5.3-flash
provider: openrouter
base_url: https://openrouter.ai/api/v1
api_mode: chat_completions
Two config details that turned out to matter more than I expected:
agent:
max_turns: 150 # how long an agent can grind on one task
tool_use_enforcement: auto
parallel_tool_call_guidance: true
verify_on_stop: false
compression:
enabled: true # auto-compress long sessions
threshold: 0.5
max_turns is the difference between an agent that can carry a multi-step task to completion and one that gives up halfway. And compression keeps long sessions from quietly eating your context window and your token budget.
Everything under auxiliary: (vision, web extraction, compression, title generation, etc.) defaults to provider: auto, which means it inherits your main provider setup. I didn't have to configure a dozen models individually — one OpenRouter key covers everything.
The part that changed my daily routine: WhatsApp
This is the feature that sold me. Hermes runs a gateway that connects it to messaging platforms — Telegram, Discord, Slack, WhatsApp, iMessage, and more — with full tool access, not just chat. Your agent isn't trapped in a terminal; it's in your pocket.
Setup for WhatsApp was a pairing flow, similar to linking WhatsApp Web:
hermes config set platforms.whatsapp.enabled true
# then pair the device — credentials land in
# ~/.hermes/whatsapp/session/creds.json
A couple of gotchas I hit, so you don't have to:
- Incoming messages only arrive while the bridge is connected. If your Mac sleeps or the gateway dies overnight, messages sent during that window are gone — the WhatsApp protocol doesn't backfill chat history. There is no store of past messages anywhere on disk. Plan your automations around "while running," not "catch up later."
- Voice notes arrive as
.oggfiles with no transcription. I fixed this with a small pipeline: convert with ffmpeg to 16 kHz mono WAV, base64-encode, and send asinput_audioto a multimodal model. It works, but it's the kind of rough edge you should expect from self-hosting your own agent stack.
The payoff is real: I message my Mac from my phone — "add this to my read list," "what's on my calendar," "summarize this article" — and it acts with the same tools it has in the terminal.
Scheduled work: cron without a cron file
Hermes has built-in scheduled jobs. Two of mine:
twitter ML Discussion — daily at 09:00
Summarize important posts from X in the last 20 hours about AI/LLM/
LRM/Data Science/AI Engineering, then produce a digest.
AMZN 1-week tracker — daily at 21:00
Track Amazon's share price for a one-week tracking engagement,
running daily until the engagement ends.
Every morning I get an AI-digested briefing of what happened in ML Twitter overnight, assembled by the agent with web access — no feed, no scrolling. The tracker is the other pattern worth stealing: instead of a one-off question ("what's AMZN at?"), you give the agent a standing engagement and it reports daily.
Skills: the agent that learns your workflows
This is Hermes's most underrated feature. When the agent figures out how to do something non-obvious — say, the ffmpeg-plus-multimodal-model voice note pipeline above — it can save that procedure as a skill, which loads into context automatically whenever a matching task appears.
My skills directory now covers twenty categories: Apple (Notes, Reminders, FindMy, iMessage), autonomous AI agents, creative, data science, email, finance, GitHub, media, MLOps, note-taking (Obsidian), productivity, research, smart home, social media, software development, web, WhatsApp messaging, and more.
The ones I lean on hardest:
- apple — Notes and Reminders from natural language ("remind me to…", "add this to Notes").
- obsidian — my Obsidian vault is wired in; "add to read list" literally appends a checkbox to the right note.
- social-media — posting to X, verified end-to-end before the agent reports success.
- github — PRs, issues, and reviews through the
ghCLI, already authenticated.
The compounding effect is the point: month one, you're teaching it your conventions. Month two, it already knows them.
Living with it: the desktop app
While the terminal is where I do serious work, the desktop app (hermes desktop) is where Hermes lives day to day — streaming chat, a session list, drag-and-drop files, native notifications, and a ⌘K command palette. Sessions persist on disk, so I can close the app, come back tomorrow, and resume exactly where we left off.
Lessons learned
- Secrets discipline pays off immediately.
.envfor keys,config.yamlfor settings. When I later shared my config, redacting was trivial. - Messaging integrations change how you use an agent. Terminal agents get used when you sit down to work. A WhatsApp-connected agent gets used at the moment you think of the task — which is a different, and arguably better, capture model.
- Cron prompts are prompts, not schedules. A good scheduled job has a well-specified prompt ("summarize posts from the last 20 hours about X, then format Y") — the quality of your 9 AM digest is entirely a function of how you wrote that prompt.
- Self-hosted integrations have rough edges. Voice-note transcription, expired tokens, API quirks — expect to write small glue scripts. The flip side is that once you fix something, the agent remembers the fix.
- Run
hermes doctorafter config changes. Cheap insurance against a typo silently breaking your gateway.
Should you do this?
If you want an agent that's a tool you use, any of the big-name coding agents will do. If you want an agent that's a resident — one that remembers you, learns your workflows, messages you back, and runs your morning briefing while you sleep — that's the niche Hermes fills, and the setup cost is an afternoon.
Everything here is open source: github.com/NousResearch/hermes-agent, with docs at hermes-agent.nousresearch.com/docs.