Skip to main content
Herm plugins are bundled TypeScript modules that register into the TUI at startup. A plugin exports a HermPlugin object with an id, optional enabled flag, and a tui(api) factory.
Herm does not load external npm or user-directory plugins yet. Current plugins must be compiled into the Herm bundle through src/plugins/internal.ts.

What plugins can do today

Plugins can register UI, routes, commands, gateway event listeners, namespaced state, lifecycle cleanup, and Eikon rasterizers.
Herm’s public slot type lists several possible slots. In the current host, app_bottom is the mounted plugin slot. It renders in the one-row gutter below the composer and receives { sid, tab, streaming }.The app_bottom call site uses single_winner composition. The contribution with the lowest order wins.
Register a named route and Herm appends it after the built-in tabs. Navigate to a plugin route with api.route.navigate("RouteName").
Register commands with a title, value, optional description, optional category, and onSelect callback. They appear in the Ctrl+K command palette.
Subscribe to the live gateway event stream with api.event.on(fn). Use it for UI updates, toasts, or route changes that react to Hermes Agent state.
Register a rasterizer for Eikon Studio. Studio owns cropping, state selection, playback, and knob UI. Your rasterizer maps the prepared window to terminal frames.

Add a bundled plugin

1

Create a bundled module

Add a module under src/plugins/bundled/. It must export a default HermPlugin value.
2

Register it in internal.ts

Import the module in src/plugins/internal.ts and append it to INTERNAL.

Default enablement

Plugins are enabled by default unless they set enabled: false. User toggles in the plugin manager override the compiled default and persist across launches. The bundled demo plugins, demo.clock and demo.files, ship disabled by default.

Persistent plugin state

Herm stores local plugin state in ~/.hermes/herm/tui.json, or $HERM_CONFIG_DIR/tui.json when set.
  • plugin.enabled stores per-plugin enablement overrides.
  • api.kv stores plugin data under keys scoped by plugin id.

When to build a plugin

Build a bundled plugin when you need a small Herm UI extension, a custom route, command-palette action, gateway event reaction, local plugin setting, or Eikon rasterizer. Do not use the plugin API for model providers, gateway RPC definitions, Hermes Agent tool execution, or Eikon package/catalog contract changes. Those belong to Hermes Agent or Eikon.