4 Hidden Hermes Tricks from the Latest Commits: Token Savings, In-App Browser Control, Cron, and Resilient Search


You’d think the big Hermes news this week was v0.20.4’s frosted-glass windows — but the official project quietly merged a batch of features over the last four days with no keynote, no promo art. They hide in the commit log, and each one saves you real money, real effort, or a real headache. This post covers the four most valuable: token savings, browser control, cron upgrades, and search resilience.

Trick 1 — Token savings: Muse Spark caching is fully on

If you use Meta’s Muse Spark (api.meta.ai), this is probably the most wallet-relevant line item this week.

PR #88601 (merged Aug 17) moves api.meta.ai traffic from chat completions to the Responses API — because only the latter supports prompt caching. The measured numbers are striking:

Wire Cache hit rate Contributor-tier input price
/v1/chat/completions (old) 0% $0.10 / M tokens
/v1/responses (new) 93–99% $0.002 / M (cached)

On agentic workloads — where the same system prompt and tool definitions are re-sent over and over — that’s roughly a 13× cost difference. Hermes also auto-sends prompt_cache_retention: 24h, Meta’s opt-in cache hint, to maximize the effect. After updating, Muse Spark users get caching automatically — nothing to configure.

Trick 2 — Browser: the agent can finally USE the page, not just look at it

The desktop app’s in-app browser used to be a one-way mirror: open_preview put a page in the pane, read_preview read its text back, but the agent could never touch it. Anything needing a click went to a separate Chromium the user can’t see — with none of the sessions you’re already signed into.

PR #90197 (merged Aug 20, on main) changes that, adding two tools to the desktop_ui toolset:

  • drive_preview: action="elements" inventories everything clickable/typable, then click, type, scroll, and press act on those elements; back/forward/reload drive the pane’s history;
  • annotate_preview: hold a mark on an element until the agent takes it off — for pointing at something rather than acting on it.

Two engineering details worth understanding:

  1. Real input, not synthetic events: actions go through Chromium’s sendInputEvent, not dispatched events — a page cannot tell the difference, and hover/focus state behaves exactly as a user’s would (synthetic clicks leave pages in states no user could have produced);
  2. Durable element handles: elements are named after what they are and say (btn-sign-in, inp-email); when a framework destroys a node and rebuilds it, the handle automatically re-binds (the agent is told rebound instead of being handed a removal to react to) — log-in-then-list-refresh flows no longer drop handles.

The payoff: “log into this site and pull my invoices” now happens inside the browser on your screen, using the sessions you already have.

Trick 3 — Cron: relay crons gain flat replies and rich formatting

Enterprise users fronting Slack through the relay adapter noticed the gap: on the native Slack adapter, cron briefs can post flat in the DM (cron_continuable_surface: in_channel) with a plain reply continuing the job — while on the relay lane, briefs always landed in a dedicated thread and rich content (Block Kit tables, highlighted code) rendered as literal - bullets.

PR #90038 (merged Aug 20) closes that gap (found in an enterprise side-by-side evaluation):

  • CapabilityDescriptor gains supports_inchannel_continuable, and the relay adapter now advertises and applies it — in_channel mode works on the relay lane;
  • the cron surface-knob resolution was rewritten so relay’s Slack knobs finally live somewhere that works (platforms.relay.extra.slack.*) instead of being read-but-ignored;
  • block formatting: native rich text, tables, and highlighted code now render properly over the relay.

Paired with the complete cron automation guide, relay users now get native-parity cron UX.

Trick 4 — Resilience: failing keyed search backends get a keyless rescue

Your web search is configured with an API-keyed backend. It goes down — and previously that meant an error, fall through to the next, and if every keyed backend is down, search dies.

PR #90688 (merged Aug 20) adds a quietly elegant fallback: when a keyed web backend fails, Hermes rescues onto the keyless ring for one call — and crucially, never sticky: the rescue applies to that single call only, so the keyed backend takes back over the moment it recovers.

For the user: one fewer “search failed” error, one more “found it without spending your quota.” Tiny change, enormous daily frequency.

Release status

Trick PR Merged Status
Muse Spark prompt caching #88601 Aug 17 In v0.20.4 (released Aug 18)
In-app browser control #90197 Aug 20 main, unreleased
Relay cron flat + rich text #90038 Aug 20 main, unreleased
Keyless search rescue #90688 Aug 20 main, unreleased

To try them: hermes update (v0.20.4 users get trick 1 automatically); the other three land with the next release or from main (hermes update --branch main).

Wrap-up

What these four tricks share: nobody announced them, and they affect you every day. Caching saves real money, browser control saves context switching, the cron upgrade saves enterprise integration headaches, and the search rescue saves a 3am failure. All merged August 17–20; the first is already out in v0.20.4. After upgrading, check the cron command reference and put what applies to you to work.