guide · computers

Hermes Agent on a Mac mini M4 (or other Apple Silicon Macs)

How to install Hermes Agent on macOS: Homebrew for Python 3.11, Xcode CLI tools, launchd for cron, Ollama for local inference, and Apple Silicon-specific gotchas.

July 14, 2026 · By Alastair Fraser

A friendly retro robot sitting at a Mac mini on a wooden desk next to a Studio Display, with a launchd plist scrolling on the screen and small Ollama llama figurines lined up beside it.

A VPS is what you reach for when Hermes needs to be awake at 3am. A Mac mini is what you reach for when you want it awake, quiet, and running a real model on the desk. The same Mac mini M4 that hosts this site also drives /opt/data/atsrd/ (ATS Resume Designer), /opt/data/cloudflare-sites/nowandthenshirts.com.yaml, and a local Ollama runtime for the Telegram gateway I talk to most days.

This guide walks a fresh operator from a clean macOS install to a working hermes chat reply — Apple Silicon (M1/M2/M3/M4), macOS 14 or 15. By the end: Homebrew, Python 3.11, Hermes in ~/Library/Application Support/hermes-agent/, a launchd plist keeping the gateway alive, and Ollama running locally.

Why a Mac mini is the quietest Hermes host

A Mac mini M4 gives you 16-32GB unified memory (48-64GB on M4 Pro), Apple silicon efficiency, silent idle, and a footprint smaller than a paperback. Tradeoffs vs a VPS: no public IP out of the box (so inbound connections need a tunnel — see the VPS guide), no 24/7 uptime if the box sleeps, and macOS quirks (launchd not systemd, Homebrew not apt, Gatekeeper).

If your Hermes workload is “talk to a model, run cron jobs, ping me on Telegram,” the Mac mini is the right host. For “expose a public webhook, run 24/7 without thinking about it,” get a VPS.

Mac mini M4 vs Mac mini M2 vs Intel

ChipUnified memoryHermes on itLocal LLM ceilingVerdict
M4 / M4 Pro16-64 GBFirst-classQwen 3 30B at Q4, Llama 3.1 8B triviallyBuy this if you can
M2 / M2 Pro8-32 GBFirst-class; identical pathSame as M4, slightly slowerOften cheaper used
Intel Mac mini8-16 GBWorks, Ollama needs RosettaSmaller models onlySkip if Hermes is the only reason

Apple Silicon is the better pick: Ollama uses Metal natively. The same Llama 3.1 8B that takes seconds on an M4 grinds on an Intel Mac mini, and some pip install steps quietly pull Rosetta dependencies.

Step 1: Xcode CLI tools + Homebrew

xcode-select --install

That dialog asks for confirmation; say yes. It pulls in git, curl, and the BSD toolchain. Without it the Homebrew installer fails at git clone.

Then Homebrew:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

The installer prints two follow-up lines at the end — eval "$(/opt/homebrew/bin/brew shellenv)" for the current shell, and a recommendation to drop it into ~/.zprofile. Do both, then restart the terminal. One-time per machine.

Verify:

brew --version

Step 2: Python 3.11

brew install [email protected]

This adds /opt/homebrew/bin/python3.11 (the Apple Silicon path) and /opt/homebrew/bin/python3 as a symlink to 3.11. Don’t use the system Python 3.9 — Hermes v0.18.2 needs 3.10+, and the system Python is locked behind SIP.

Verify:

python3 --version
# Python 3.11.x
which python3
# /opt/homebrew/bin/python3

If which python3 points to /usr/bin/python3, your shell is still loading the system path. Restart the terminal or hash -r to rebuild the cache.

Step 3: Hermes install

curl -fsSL https://hermes-agent.nousresearch.com/install | bash

The installer detects macOS and uses ~/Library/Application Support/hermes-agent/ as the install dir (not /opt/hermes, the Linux path). The venv lands at ~/Library/Application Support/hermes-agent/venv/. Config goes in ~/.hermes/. Nothing outside your home directory is touched.

If you see pip: command not found, your Step 2 didn’t take. Re-run brew install [email protected] and restart the shell.

Step 4: smoke test

hermes chat -q "Reply with OK"

“OK” (or close) in 2-5 seconds. If hermes: command not found, your shell doesn’t have the venv on PATH:

export PATH="$HOME/Library/Application Support/hermes-agent/venv/bin:$PATH"

Drop that into ~/.zshrc (or ~/.bash_profile if you’re still on bash) and the issue stays fixed.

If hermes chat hangs for more than ten seconds, the likely cause is a missing provider key. Hermes prompts you through one at first run, but if you skipped it, run hermes config to set a provider and model. See Hermes Agent Setup v2.

Step 5: launchd for crons

macOS uses launchd, not systemd. To keep hermes gateway or a long-running hermes cron alive across reboots, write a LaunchAgent plist at ~/Library/LaunchAgents/com.alastair.hermes-gateway.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.alastair.hermes-gateway</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Users/alastair/Library/Application Support/hermes-agent/venv/bin/hermes</string>
    <string>gateway</string>
    <string>start</string>
    <string>telegram</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <true/>
  <key>StandardOutPath</key>
  <string>/tmp/hermes-gateway.out.log</string>
  <key>StandardErrorPath</key>
  <string>/tmp/hermes-gateway.err.log</string>
</dict>
</plist>

Then load and verify:

launchctl load ~/Library/LaunchAgents/com.alastair.hermes-gateway.plist
launchctl list | grep hermes
# 12345   0   com.alastair.hermes-gateway

A PID in the first column and 0 in the second (last exit code) means it loaded and is running. To stop: launchctl unload ~/Library/LaunchAgents/com.alastair.hermes-gateway.plist. KeepAlive means launchd restarts it on crash.

The path /Users/alastair/... assumes username alastair. Replace with $HOME — it expands inside the plist’s ProgramArguments at load time.

Step 6: local LLM with Ollama

Apple Silicon is the canonical local-inference hardware. Ollama uses Metal directly — no Rosetta:

brew install ollama
ollama serve &
ollama pull llama3.1:8b

ollama serve & backgrounds the server. Brew also installs a launchd plist for Ollama at ~/Library/LaunchAgents/homebrew.mxcl.ollama.plist, so launchctl load that one and skip the background process entirely.

Point Hermes at the local model:

hermes model --provider local

Hermes discovers Ollama on http://127.0.0.1:11434 automatically. To confirm: hermes chat -q "Reply with OK" --provider local and watch inference happen on-device.

What not to do

  • Don’t use the system Python. It’s 3.9 on macOS Ventura, locked behind SIP, and Hermes v0.18.2 requires 3.10+.
  • Don’t put the venv in ~/Documents/. Gatekeeper quarantines executables there. xattr -d com.apple.quarantine works, but installing into ~/Library/Application Support/ avoids the fight.
  • Don’t sleep the Mac during cron. launchd runs jobs in your user session; the display sleeping puts user LaunchAgents to sleep too. System Settings → Energy Saver → “Prevent computer from sleeping automatically when display is off” while plugged in. The Mac mini draws ~7W idle.
  • Don’t skip Xcode CLI tools. git and curl come from there. brew install git works but git won’t be on PATH until the shell loads Homebrew’s bin dir first.

Verification checklist

#CommandWhat it proves
1brew --versionHomebrew installed
2python3 --version3.10+ available, on the Homebrew path
3which hermesHermes binary found in venv
4hermes chat -q "Reply with OK"Runtime alive, provider reachable
5launchctl list | grep hermesLaunchAgent loaded
6ollama listLocal LLM ready

Run them in order; stop at the first failure. Each step’s success is a prerequisite for the next.

Sources

Last verified: 2026-07-14 against Hermes v0.18.2 on a Mac mini M4 with macOS 15.x.

Sources

#hermes#macos#mac-mini#apple-silicon#m4#launchd#homebrew#ollama#setup

Submit a take

Have a different read on this? Drop a comment below — your email isn't published, and I read every one. Nothing leaves the site until I approve it.

Your email address will not be published. Required fields are marked.