All plugins

zedmode

Every Hermes Desktop conversation in one stack that recedes into the screen, ordered like an inbox: failed, needs you, working, unread, pinned, then the rest. Answer approvals and questions on the card, hold a thread beside the stack, start or branch a chat without leaving, switch a live chat's model, and tune the 3D live. Desktop plugin (desktop/plugin.js inside the plugin SDK surface) plus a read-only dashboard backend that reads the session list from state.db. No network, no credentials, no agent tools, hooks, middleware or env vars. Disclosure — reads every session's titles, prompts and tool-call summaries from state.db read-only for its stack (cache in the profile's plugin-data folder); its Desktop page can send prompts, answer approval and clarify requests you click, rename/branch chats and switch a live chat's model; the backend calls Hermes' private model resolver (hermes_cli.model_switch.switch_model) to explain unusable models, which can query your configured provider's model list.

latentJakeDesktopv0.19.0Updated 7 hours ago

About

Every Hermes Desktop conversation in one stack that recedes into the screen, ordered like an inbox: failed, needs you, working, unread, pinned, then the rest. Answer approvals and questions on the card, hold a thread beside the stack, start or branch a chat without leaving, switch a live chat's model, and tune the 3D live. Desktop plugin (desktop/plugin.js inside the plugin SDK surface) plus a read-only dashboard backend that reads the session list from state.db. No network, no credentials, no agent tools, hooks, middleware or env vars. Disclosure — reads every session's titles, prompts and tool-call summaries from state.db read-only for its stack (cache in the profile's plugin-data folder); its Desktop page can send prompts, answer approval and clarify requests you click, rename/branch chats and switch a live chat's model; the backend calls Hermes' private model resolver (hermes_cli.model_switch.switch_model) to explain unusable models, which can query your configured provider's model list.

Zed Mode

Every Hermes conversation in one stack that recedes into the screen, ordered like an inbox.
A plugin for the Hermes desktop app.

Status: early beta (0.19.0). Built and tested against Hermes v0.23.0 on macOS.
See Compatibility for what that does and doesn't promise.

The Zed Mode stack: conversations ordered by what needs you

The screenshots in this README use sample conversations.

What it does

Press ⌘⌥Z (or the layers icon in the titlebar) and your conversations lift into a single
stack. The front of the stack is whatever needs you most:

Front → backState
1Failed: red edge, the error on the card
2Needs you: amber edge; an approval or a question
3Working: the app's own running arc, and what the agent is doing right now
4Process running: a dev server that outlived its turn
5Unread: finished while you were away
6Pinned
7Everything else, most recent first

On a quiet day the front of the stack is your pins (pin a chat in the Hermes sidebar). States come from the app's own status dot,
so Zed Mode agrees with the sidebar.

  • Answer on the card. An approval shows the exact command and the choices the gateway allows;
    a question shows its choices. One click answers that one request. ⇧Y / ⇧N approve once /
    deny, and are shifted on purpose so a stray keypress can't approve a command.
    A conversation that needs you, at the front of the stack

  • Hold a conversation (⇧⏎). The stack steps aside and the conversation floats in beside it as a
    thread: sticky prompts, a prompt rail, edit cards in your theme's colours, and a composer with
    images, files, URLs, the real model menu and Stop. Hold again to bring it to the foreground.
    A held conversation beside the stack

  • Start and branch chats without leaving Zed Mode: the round + (new chat, optionally in a
    folder) and the Branch icon on a prompt.

  • Tune the 3D live (****): sliders, presets and shareable zed1.…` codes.

Plain ⏎ never opens a chat; it is left for typing. Esc steps back one level at a time, all the
way to classic Hermes.

Quick start

git clone https://github.com/latentJake/hermes-zenmode.git
cd hermes-zenmode
./scripts/install.sh

Then in Hermes: ⌘K → Reload desktop plugins, and press ⌘⌥Z. Details, what the installer
changes, and troubleshooting are in docs/quickstart.md.

Keys

⌘⌥Zopen / close Zed Mode
↑ ↓ (or k j, ⇥ ⇧⇥)one card deeper / closer
⇧⏎ or spacehold the front card; ⇧⏎ again: foreground
⌘⏎open in classic Hermes, in a new tab
i or /write in the conversation
ajump to the next conversation that needs you
⇧Y / ⇧Napprove once / deny the front card's request
escback one level

Everything else, including mouse actions, is in docs/keybinds.md.

Compatibility

HermesRequires ≥ 0.23.0 (plugin.yaml). Developed and tested on v0.23.0. Newer versions are untested.
OSmacOS only is tested. The plugin SDK is cross-platform, but nothing here has been run on Windows or Linux (the shortcut would be Ctrl+Alt+Z).
NeedsThe Hermes desktop app. The CLI and web dashboard alone don't load desktop plugins.
BackendA small Python half runs inside the gateway for pins and old transcripts. Without it, Zed Mode still works for live conversations.

Zed Mode leans on a few parts of Hermes that are not documented plugin APIs. Which ones, how each
fails, and what you'd see are listed in docs/compatibility.md.

What it touches

NetworkNone. No telemetry, no remote code, no updater.
ReadsYour session list and transcripts, read-only. state.db is opened read-only with query_only; live conversations come through the desktop SDK. Titles and folder paths appear on cards.
WritesOnly its own files: your tuning and presets and a short list of failed turns (the plugin's storage in the app), and a cache of derived card facts at $HERMES_HOME/plugin-data/zedmode/cache.db. Never state.db. Pins are Hermes's own (pin a chat in the sidebar); Zed Mode only reads them.
Acts for youOnly what you click or type in Zed Mode: send a prompt, answer an approval or question, rename, start or branch a chat, switch a live chat's model or reasoning effort. Each goes through the same gateway request the app itself sends. Approvals are never answered automatically.
CredentialsNone read, stored or sent.
ProcessesNone started. The Python half is a request handler inside the Hermes gateway.
One private seamTo explain why a model can't be used, the backend calls Hermes' own model resolver. It isn't a public API; if it changes, Zed Mode shows the gateway's short reason instead.

The desktop half is opt-in, and the Python half only runs once zedmode is listed under
plugins.enabled. scripts/install.sh adds that line (with a backup); it is a script you run by hand.

Known limits

  • Unread and "process running" depend on how the app paints its status dot. If a Hermes update
    changes that, those two states silently drop out of the ordering; the others keep working.
  • A failure is seen only while the app is open. A turn that fails while Hermes is closed won't
    show as failed.
  • A conversation that isn't live can't take a message from Zed Mode, nor be branched from a single
    prompt. Zed Mode shows its transcript and keeps your text; Open continues it in Hermes.
  • Visual behaviour is checked by hand on one machine. The automated suite has no layout or 3D,
    so spatial polish is not something it can vouch for.
  • The 3D PAPER thread is parked behind an experimental dial.

Documentation

Quick startInstall, first run, troubleshooting, uninstall
Keys and mouseThe full reference
TuningThe dials, presets and share codes
CompatibilityVersions, what we depend on, failure modes
ArchitectureHow the two halves work
DesignThe rules the UI follows
DevelopmentTests, the promote gate, writing your own plugin
RoadmapWhat's next
ChangelogReleases

License

MIT

README from the reviewed commit 0e6ebba; it updates when the author re-pins.

Developer Mode

Explore built-in Hermes toolsets and actions.

HermesAgent

Developer?

Create a Hermes extension for Desktop or agent workflows.

Developer Section