0.8.14 gave your company a real MCP server. The ten releases since then went after the thing you actually stare at all day: the conversation between your people and your agents. Individually they read like a changelog of small fixes. Together they turn agent chat into a channel you can run a business on.
Every message knows who sent it
Human messages now carry real sender identity — senderName, senderEmail, and senderRole, resolved at write time and persisted in the message metadata. The agent bridge injects it straight into the prompt as [From Alice <alice@x.com>], so an agent knows whether it's the account owner or a junior teammate asking. In the chat UI, other members are labelled by name instead of an anonymous bubble. External webhook senders fall back to a generic label. (0.8.15)
Files, right in the thread
A paperclip button uploads files up to 25 MB — behind a MIME allowlist — and stores each one as a company artifact rather than a throwaway attachment. Messages carry the references, the UI renders download chips, and the agent bridge lists them in the prompt so the agent can pull the bytes itself via GET /api/mcp/artifacts/{id}/download. It's fully backward compatible with existing threads. Voice messages got the same treatment: they're now registered as artifacts and render as inline players instead of broken file paths. (0.8.15, 0.8.21)
Live activity, not fake typing dots
A generic "typing…" tells you nothing when a turn takes two minutes. The Hermes typing indicator now shows real activity — elapsed turn time and session-resume status, e.g. Viktor: working (42s) — threaded through /chat/status and cleared the moment work stops. And each message carries its own status, "Queued" or a pulsing "Being handled," instead of a single group-level receipt for the whole thread. You can see exactly which message an agent has picked up. (0.8.23, 0.8.24)
A "resolved" reply used to mark every open message in the thread as answered. Now it's scoped to the specific message that got a reply — while thread-wide states like "seen" and "acting" stay batched, exactly as intended.
Nothing drops, nothing resurfaces
The unglamorous work that makes the rest trustworthy. Sending a second message before an agent finished used to make the first one vanish — the execution state only advanced the latest human message and orphaned the backlog. It now advances every unresolved message together. Old messages could also randomly reappear in a direct chat, because an unordered thread lookup let races create duplicate threads; the lookup now orders by creation time and converges consistently, and eleven duplicate threads across eight production agents were consolidated with their original timestamps preserved. Finally, a hard-killed Hermes turn used to restart from scratch on every container recreate: profiles, sessions, and bridge state now live on a named Docker volume, and a graceful timeout (SIGTERM to the whole process tree, a grace window, then SIGKILL) lets a killed turn resume via --resume instead of re-running. (0.8.16, 0.8.20, 0.8.21)
Upgrade notes
Everything here is a standard rolling upgrade — no destructive migration, no config required to keep existing behavior:
docker compose pull
docker compose up -d
Existing Hermes agents pick up the resumption and timeout behavior on their next runtime container recreate. For browser-heavy agents, consider raising the turn budget with EMPEROR_CLAW_HERMES_TIMEOUT_SECONDS (default 300s); the kill grace window is EMPEROR_CLAW_HERMES_TIMEOUT_GRACE_SECONDS (default 10s). See the Agents & MCP guide for the full picture.