Hermes Agent Lab

Hermes Agent Blog — Practical Guides & Insights

Latest articles and insights.

Your renamed Hermes profile left a ghost in the state DB

A renamed profile used to leave the state DB pointing at the old name. PR #112653 migrates that identity, adds a retry command, and tombstones deleted profiles.

Read more

Gateway profile multiplexing is on by default now

gateway.multiplex_profiles now defaults to on, but a boot guard settles an unset flag at every boot: one gateway serves all profiles only when the fold is safe.

Read more

Why state.db Gets Corrupted Inside Docker Desktop, OrbStack and WSL2 Mounts

Bind-mount your data directory into a container and virtiofs or 9p cannot give SQLite WAL the shared lock it needs, so two writers corrupt state.db quietly while every integrity check passes. Since PR #111433, Hermes says so at startup and in hermes doctor, with two concrete fixes.

Read more

You Already Pay for Thinking You Don't Need: Reasoning Effort in Every Hermes Model Picker

Billing a one-line rename at ultra reasoning effort is the most common waste in an agent setup. PR #110346 puts an effort step on every model picker — hermes model, /model, the Ink TUI, the messaging gateway. Here is the whole control surface: /reasoning, the Desktop composer pill, per-task effort in Settings → Model → Auxiliary, agent.reasoning_overrides, and delegation.reasoning_effort.

Read more

Why Your MCP Tools Keep Logging You Out: Inside the OAuth Token Lifecycle

Figma, Linear, and Notion keep asking Hermes to sign in again — and it is usually not a misconfiguration. Here is the token lifecycle behind it: how concurrent refreshes trip reuse detection, why a refresh token must stay bound to the server that issued it, and the four fixes Hermes shipped for it.

Read more

hermes profile update used to delete your skills and cron jobs

PR #111344 fixes a P1 data-loss bug: updating a profile distribution replaced the whole skills/ and cron/ directories, wiping anything the user had added. They are now merged per root, so your additions survive while the author's shipped roots still update.

Read more

Hermes v0.21.3: your desktop session stops signing itself out after sleep

v0.21.3 (tag v2026.9.14) is the patch tag that carries remote sign-in fixes to Docker and Cloud users: concurrent refresh bursts no longer revoke the whole session, refresh runs off the event loop, and long-lived processes stop leaking duplicate state.db writer handles.

Read more

Your iPhone Photos Finally Work: HEIC Decoding in vision_analyze, and Vision Tools That Stop Vanishing

Feeding an iPhone photo to Hermes used to return one line: source is not a recognized image. PR #106408 added ISO-BMFF ftyp sniffing plus pillow-heif normalization; PR #110136 fixed the cache poisoning that made vision tools disappear in long-running processes.

Read more

How to Complete OAuth on a Remote Server: SSH Tunnels, Pasted Callbacks, and Device Codes

When Hermes runs on a cloud VM or behind a jump box, loopback-redirect OAuth (Spotify, remote MCP servers) breaks at 127.0.0.1. Three workable routes: an SSH local forward, pasting the redirect URL back, and device-code or paste-the-code flows.

Read more

169.254.169.254 Now Asks First: Hermes Gates Cloud Instance-Metadata Credential Fetches Behind Approval

On a cloud VM the instance-metadata service hands temporary IAM credentials to any local process with no authentication. After PR #106418, commands that hit 169.254.169.254, fd00:ec2::254, metadata.google.internal or 100.100.100.200 prompt for approval instead of being auto-approved.

Read more

When Your Fingers Hit Esc: Vim Keybindings for the Hermes CLI Composer (Plus the Branch Name in Your Status Bar)

You type a long prompt, spot a typo, and reflexively press Esc to fix it — nothing happens. After PR #106412, display.vim_mode turns the CLI input composer into a vi-style editor, with a live NORMAL/INSERT/REPLACE label on the status bar.

Read more

Hermes v0.21.2: Multi-Profile Isolation Hardening, and No More One Backend Per Profile

v0.21.2 closes seven cross-profile leak paths in multi-profile installs, stops the desktop from spawning a backend for every profile, and cleans up a batch of cron, kanban and memory behaviours that never made sense.

Read more

No More Restart: Hermes Hot-Serves Profiles You Create While the Gateway Is Running

You create a third profile at 2 a.m., paste in the bot token, send hello in Telegram, and nothing answers — the desktop still says that profile's gateway is stopped. The only documented fix is restarting the gateway, which interrupts the two profiles happily running long jobs. PR #109239 changes that: a running multiplex gateway now reconciles its profiles directory at runtime. New profiles are served on the spot, credentials pasted in later rebuild their adapter, deleted profiles get torn down and de-routed, and a 30-second rescan covers the failures. Merged to main on 2026-09-12, after the v0.21.2 release.

Read more

Hermes Now Gates Package-Manager Uninstalls Behind Approval

A global npm package is quietly slowing your builds, so you type `npm uninstall -g some-package` and hit Enter. Two days later CI is missing it and every project on that machine is affected. That command used to run with no prompt at all, because the dangerous-command gate only knew shell primitives. PR #109170 (merged to main) adds a package manager uninstall rule for npm, pnpm, yarn, pip, and brew: removals now ask, while installs and updates still slip through. The rules are anchored with _CMDPOS so quoted text isn't misflagged, and a global option plus one argument still gets caught.

Read more

Hermes MCP include: an explicit empty list now blocks everything, everywhere

tools.include: [] used to be read as “key not set” by several surfaces. After PR #109188, hermes mcp list, hermes mcp configure, hermes tools, catalog reinstall and the desktop MCP panel all read it as 0 selected.

Read more

Hermes Cron Jobs Now Degrade Instead of Failing on systemd Gateways With No User D-Bus Session

On systemd-managed gateways that have no user D-Bus session (containers, slim LXC, service users without linger), every due cron job used to fail right at dispatch. PR #109311 makes those jobs degrade instead: still a separate external worker process, just without cgroup isolation, with a single warning per gateway process. Set cron.require_restart_safe_scope: true to get the old fail-closed behavior back. Merged to main on 2026-09-12; not in a tagged release yet.

Read more