Hermes Agent v0.20.5
Overview
v0.20.5 — The Housekeeping Release. Released August 19, 2026. ~323 merged PRs · ~746 commits · ~1,250 files changed (+111,500 / −20,701) since v0.20.4.
This window has no single headline feature — it finishes a stack of things that were long overdue. The top story is that Bot Mode group chats finally accept files: PDFs, images, and arbitrary attachments via drag & drop, seen by every responding bot; older conversations fold into one-line summaries so rooms stop scrolling into the stratosphere; and avatars become deterministic blob faces drawn from the agent’s name, with four new silhouettes. For everyday development, hermes worktree list/prune gives multi-agent workflows a safe, attended channel to reclaim accumulated worktrees and merged branches; hermes update --plan and structured update receipts make “what actually happened during the update” auditable for the first time; cron jobs gain persistent memory like every other agent and per-job reasoning effort; and opencode-free becomes a genuinely keyless free model — no env var, no account, appearing directly in /model and the desktop picker.
This is a patch release, so the official notes are brief and the full curated documentation ships with v0.21.0. This page covers the most valuable parts of the window.
Highlights
1. Bot Mode group chats: files in, old messages folded away
Group chats used to be text-only; now files are first-class: rooms accept PDFs, files, and drag & drop, and every bot responding to the turn sees the attachments (#97b41f8cf, #b359db72e). Long rooms stop scrolling forever — older conversations auto-fold into one-line summaries (“▸ API design … 14 replies · 2h ago”) while the latest conversation stays fully open (#8505559fa).
Avatars get a new look too: Bot Mode avatars default to blob faces deterministically drawn from the agent’s name (same name, same face, every time), with four new silhouettes from blobatar 2.0.0 (#a77ee88ce, #cb0fd836a).
2. hermes worktree list/prune — safe reclaim for accumulated worktrees
Multi-agent workflows (hermes -w / /worktree new) accumulate dozens of trees and hundreds of merged branches under .worktrees/ over time. The silent startup pruner only touches trees that are clean and fully merged; everything else lingers forever. Now there is an explicit, dry-run-first reclaim:
hermes worktree list # audit: one row per tree — age, size, verdict, reason
hermes worktree prune --dry-run # show the plan, change nothing
hermes worktree prune # reclaim safe trees + merged branches
Safety invariants are identical to the startup pruner: tracked modifications are never deleted at any age, unique unpushed commits are never deleted (git cherry patch-equivalence decides “unique”), live-locked trees are untouched, a branch is deleted only after its worktree removal succeeded, and untracked-only scratch is archived to ~/.hermes/archive/worktree-prune/ before its tree is reaped — trash goes, living work stays (#f309f92d3).
3. hermes update --plan + structured receipts — auditable updates
The updater now proves its outcome instead of assuming it (#0aecadc17, #1d74833d8):
hermes update --plan: read-only. Lists the install kind (git/docker/nix), every running Hermes service across all profiles with its supervisor and running code version, and how each will be restarted. Safe to run on a live fleet.- Structured receipts: every
hermes updatewrites a machine-readable JSON record — what it discovered, did, skipped (and why) — to<HERMES_HOME>/logs/update_receipts/. After the restart phase it reads every profile’sgateway_state.json, compares each live gateway’scode_shaagainst the freshly-updated checkout HEAD, and prints a fleet version matrix — mixed-version fleets (the #88654 class) become a loud, actionable report instead of a latent state.
4. Cron jobs have memory — and per-job reasoning effort
Cron jobs used to be constructed with skip_memory=True and a hard memory-toolset denial, so MEMORY.md/USER.md never loaded and the memory tool was stripped even from per-job enabled_toolsets. Cron agents now run with persistent memory enabled like every other agent (#ef04d846e): jobs can read — and update — your persistent memory.
Each job can also pin its own reasoning effort, independent of the global agent.reasoning_effort and per-model reasoning_overrides (#4e1dd1a74):
# heavy scheduled analysis at high, cheap recurring job at minimal — global default untouched
hermes cron create "0 7 * * *" --reasoning-effort high --prompt "Deep weekly repo-trend analysis"
hermes cron create "every 5m" --reasoning-effort minimal --prompt "Health check and report"
Levels: none/minimal/low/medium/high/xhigh/max/ultra. Levels a model doesn’t support are clamped by the provider at request time (pinning xhigh on a model that caps at high runs at high). Pass an empty string on edit to clear the pin.
5. opencode-free: a truly keyless free model
opencode-free is now fully keyless — no env var, no account, anonymous wire (#ca06b8768) — and the catalog-drift sync pulls live OpenRouter free models into the list while delisting dead slugs (#624723130). Keyless providers count as authenticated everywhere: opencode-free appears in /model and the desktop pickers with zero setup (#2a2307e68).
hermes model # pick opencode-free — no key required
6. Execution discipline and runtime stall guards
A batch of “execution discipline” hardening from the Composio eval findings: background-review cancellation is synchronized with correct foreground priority (#37da0d4d5, #b883756b7), Ox Alpha reasoning effort reaches the wire clamped across zen and free providers (#d4d04098a), and prompt-caching cache-control decoration is idempotent (#0fc52b055). Nothing flashy to demo — but long-running tasks stall less and spend tokens more predictably.
Improvements
- Desktop performance: paint-first Bot Mode hydration, compositor spinners, React Compiler in both renderers — the desktop feels faster and more responsive.
- Old-session message edits no longer fail (profile DB + window-relative ordinal, #02e270a47).
- Telegram DM drafts keep rich formatting after streaming (also for fresh persistent sends, #790c85014, #216c98aae).
- Docker stage2
API_SERVER_KEYbootstrap no longer depends on.envexisting (#7a17a1b8a). - Bot Mode: long-running group-chat member turns are no longer lost (#88885 follow-ups), cross-machine group routing survives connection switches (#88921), one bot can sit in several group chats at once (#88980).
Fixes
- Native compaction preserves compression summary messages during pre-checkpoint pruning (#fb27614ad).
- Scheduled cron jobs no longer stuff MEMORY.md into the job prompt (final semantics: jobs can read/write persistent memory, but the scheduler side does no extra injection; #fc9cbc872).
- Catalog drift sync: dead free slugs delisted, live OpenRouter free models pulled in (#624723130).
- Gateway: orphan-reaper service exclusion widened to the whole launchd fleet; BSD-compatible ps flags + all-profile launchd pid discovery (#42bd567a8, #d8047c303).
- OpenAI adapter tolerates sparse response objects; relay unwraps lazy completed streams and uses canonical managed operation names (#85581, #85579, #85582).
Upgrade
hermes update
After upgrading, run hermes doctor to verify the install and restart the gateway (hermes gateway) so platform changes take effect. To see what the next update will touch before running it: hermes update --plan.