Hermes Agent v0.21.3
Overview
v0.21.3 — The Sign-In Patch. Released September 14, 2026. 1,036 non-merge commits · 2,642 changed files (+131,690 / −37,096) · 338 merged PRs since v0.21.2, measured at commit 9b419a2d3c2657c192008e732149d61170b32c01.
Some fixes only matter to the installs that never run hermes update by hand. This tag exists for exactly those: Docker images, Hermes Cloud and hosted deployments build from the newest release tag, so the remote-gateway sign-in work from the last window had to be rolled into a stable tag before cloud users could get it. The window itself is large — the same ~338 PRs also carry the gateway wire contracts, reasoning-effort selection on every model picker, OpenRouter OAuth PKCE login, HEIF/HEIC/AVIF decoding and a long list of platform work — but the curated write-up for all of that ships with v0.22.0, which will document everything from v0.21.0 onward. This page covers what the tag was cut for.
Highlights
1. A Desktop wake burst can no longer revoke your session
Remote dashboard sessions used to expire when several requests arrived at once. Both refresh paths on the gateway — the cookie gate and the Desktop’s native bearer route — would each present the same rotating refresh token; the identity provider rotates a refresh token on use and treats a second presentation of the old value as token theft, which revokes the entire session. A Desktop wake-up after sleep is a natural burst, so the failure looked random and always arrived at the worst moment (#110061, fixes #55712).
Now concurrent refreshes carrying the same rotating token are coalesced: one request performs the rotation, the others adopt the result. Refresh also runs off the event loop, so a slow identity provider no longer freezes /api/status while it waits.
The Portal side pairs with this (hermes-portal#1209): a sliding 30-day idle horizon and a 5-minute grace window for a rotated token, so a genuine race in flight does not read as reuse.
2. Long-lived processes stop leaking duplicate state.db writer handles
A healthy topology could still print the N live SessionDB handles precursor. The gateway, the dashboard/Desktop backend, the ACP surface and CLI readers each attached their own writer, so the count climbed and the diagnostics accused the install of exactly the problem they were meant to catch (#110934, fixes #100896 and #103339).
The shape is now explicit: readers attach read-only, and in-process writers share the registry handle rather than each opening one. Fewer handles means fewer chances for one component to cancel another’s locks — which is the class of failure the v0.21.2 patch spent six PRs closing.
Also in this window
The tag rolls up everything merged since v0.21.2, not only the two items above. Grouped by area, and deliberately left for the v0.22.0 notes to document properly:
- Gateway contract: server→client JSON-RPC requests replace the
*.request/*.respondevent pairs (#110521), and a Pydantic wire-contract registry generates the TypeScript and OpenRPC types (#110522, #110523). - Models and reasoning: reasoning-effort selection on every model picker, a composer pill and per-auxiliary effort control in Desktop; OpenRouter OAuth PKCE login.
- MCP: OAuth refresh tokens bound to the issuer that granted them, plus a daily re-auth nudge in Desktop.
- Media: HEIF, HEIC and AVIF image decoding.
- Providers: Wan 3.0, Kling 3.0 / Kling Image v3, MiniMax H3 Max Turbo, Gemini Omni Flash 1.1 and Meta Muse join the FAL catalogs; the Honcho peer-model setup was reworked.
- Platforms: Slack pasted tables and the Agent Sessions API.
- Storage and profiles: multiplexed-profile isolation and gateway-liveness fixes, and a refusal to run the WAL journal mode on cross-VM filesystems.
Upgrade
Existing installs update in place:
hermes update
Docker and Hermes Cloud build from this tag:
docker pull nousresearch/hermes-agent:v2026.9.14
The full diff is at v2026.9.11…v2026.9.14.
← Hermes Agent Changelog