Hermes Agent v0.21.2 (v2026.9.11) — The state.db Patch Release
Release Date: September 11, 2026
Patch release. v0.21.0 shipped a large rewrite of the session store's connection handling, and for some installs it made
state.dbfragile: second writers cancelling each other's locks, healthy databases reported as corrupt, one bad row killingsessions list. This release closes that class and rolls up everything else that landed onmainin the four days since v0.21.1.
About this release
Measured at commit 04dd80a977f40b05e5b2054111747af07a61886a, the window since v0.21.1 contains 947 non-merge commits across 1,869 changed files (+182,504 / −15,564) and 312 merged PRs. 140 contributors appear in commits, co-author trailers, or salvage credits.
✨ Highlights
state.db reliability campaign (six PRs, 44 issues closed)
If your state.db broke after 0.21.0, this is the release for you. Six PRs fix the root causes rather than the symptoms:
- No more second writers. Profile gateways wrote hosted-room state into the root
state.dbevery 5 seconds; the dashboard opened a writable handle on startup; cron's lifecycle guard did a rawopen()on a live database (which cancels the gateway's POSIX locks — the classic "how to corrupt SQLite" recipe);doctor --fixwould checkpoint under a live holder. All four are gone: hosted rooms live inshared-state.db, the dashboard opens read-only first, the guard goes through the tracked connection registry, anddoctor --fixrefuses a checkpoint it can't prove is safe. ( — salvage , , , ; co-authored , — salvage + , , , , , ) - One corrupt row no longer kills
sessions list, export, or insights. A TEXT timestamp or a1e30epoch used to crash the whole listing; malformed marker JSON crashedjson_extract; more than 999 ids crashed bulk delete/prune. Onecoerce_epoch()helper on every reader (bad rows render?with a WARNING naming the session), ajson_validguard, IN-list chunking, and batched export hydration. ( — salvage , ) - Opening state.db no longer takes the write lock when nothing needs writing. A one-shot
hermesprocess opening the store behind a busy gateway stalled 4–20 s and then failed with "database is locked". Now 0.01 s. ( ), a handle that lost its WAL generation no longer checkpoints stale frames at shutdown (), a clobbered first page is quarantined with its WAL instead of opened destructively (), and quarantined handles refuse VACUUM/FTS optimize (). Most of these salvaged community diagnoses by ), adapters no longer send credentials to the default profile's host (),MEDIA:delivery can no longer attach another profile's.env/auth.json/state.db(, ).
Desktop backend spawn storms are over
Bot Mode used to spawn or dial one backend per profile on launch and on every roster tick, hovering the Bots roster spawned a backend per row, and profile switches could spawn a duplicate primary. (, , — salvage , and others by , ).
Plugin catalog and one Plugins page
A curated, SHA-pinned plugin index with CLI, admission CI, docs and dashboard (, ); Radio ships as an opt-in SDK plugin (, ), connector tools (Gmail, Linear, Notion, ...) searchable through
tool_search(, , ); a queued-lane final refused by the platform is recorded and redelivered (); the first turn no longer waits on the Python toolchain probe (); Matrix renders LaTeX (); WhatsApp replies to view-once messages keep their quote ().
Providers & routing
/modeland auxiliary auto never bill a provider you didn't select (); Bedrock Claude/Converse/Mantle models survive/model, fallback and restore (); Bedrock Guardrails enforced (); unentitled primary + fallback no longer oscillate ( ). Anthropic clients send exactly one credential (); GPT Image 2.5 via OpenAI and FAL ( ); a mid-turn/steeris persisted as its own user row (); local-inference memory-ceiling rejections back off instead of compressing history (); length continuation stops when the prompt filled the window ();model_thresholdskeys can be provider-scoped (); CLI keeps theapi_contentsidecar so the cache survives an early persist (); Shift+letter and Cmd+Shift+Z work on extended-key terminals (, ); update checks poll the GitHub API once a day instead of git-fetching every 30 min ().- Desktop: UI language survives the update relaunch (), HUD mode shows the transcript again and always gives the window back (), the backend exits when its Desktop parent dies (, ), Telegram quick setup with QR ported from the dashboard ( and ); a killed manual run no longer blocks the next one for 5 minutes (); unpinned jobs run on their creation-snapshot model ();
kanban promoterefuses undone parents ().
Tools & memory
- A stdio MCP server dying mid-call no longer replays the tool call (); mem0 memory no longer drops long turns (); remote NOPASSWD sudo no longer prompts ().
Housekeeping
config.yamlbackups live in one boundedbackups/config/dir ();hermes setup --resetbacks up the real config ().
👥 Contributors
Thank you to the 140 contributors whose commits, co-author trailers, and salvaged PRs landed in this window.
state.db campaign — salvaged PR authors: , , , , , , , , , , , , .
state.db campaign — issue reporters (the forensics in these threads were often better than the fixes): , , , , , , , , , , , , , and @Hitman117890 whose Discord report kicked the campaign off.
Everyone in the window (alphabetical): , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
SOCIAL SHARE CARD GENERATOR