Hermes Agent Built-in Plugins: The Bundled Plugin Set

hermes-agentintermediate13 min readVerified Jul 26, 2026
Hermes Agent Built-in Plugins: The Bundled Plugin Set

Hermes includes a minimal collection of plugins that are distributed directly with the repository. These are located in the /plugins// directory and are loaded automatically, alongside any user-installed plugins found in ~/.hermes/plugins/. These bundled plugins utilize the same plugin interface available to third-party plugins—supporting hooks, tools, and slash commands—but are maintained within the core codebase.

For a comprehensive overview of the plugin system, refer to the Plugins page. To learn how to create your own plugin, consult the Build a Hermes Plugin guide.

How discovery works​

The PluginManager searches for plugins across four locations, checked in the following sequence:

  1. Bundled/plugins// (the plugins described on this page)
  2. User~/.hermes/plugins//
  3. Project./.hermes/plugins// (only active when HERMES_ENABLE_PROJECT_PLUGINS=1 is set)
  4. Pip entry pointshermes_agent.plugins

If two plugins share the same name, the one discovered later in this order takes precedence. For example, a user-installed plugin called disk-cleanup would override the bundled version with the same name.

The directories plugins/memory/ and plugins/context_engine/ are intentionally omitted from the bundled scanning process. These directories follow separate discovery mechanisms because memory providers and context engines are single-select providers. They are configured individually through hermes memory setup or the context.engine setting in your configuration file.

Bundled plugins are opt-in​

Bundled plugins are shipped in a disabled state. While the discovery process locates them—making them visible in both hermes plugins list and the interactive hermes plugins interface—none are loaded until you deliberately activate them:

hermes plugins enable disk-cleanup

Alternatively, you can enable them through ~/.hermes/config.yaml:

plugins:
  enabled:
    - disk-cleanup

This activation process is identical to how user-installed plugins are enabled. Bundled plugins are never automatically enabled, whether on a fresh installation or when an existing user upgrades to a newer version of Hermes. You must always explicitly opt in.

To disable a bundled plugin after enabling it:

hermes plugins disable disk-cleanup
# or: remove it from plugins.enabled in config.yaml

Currently shipped​

The repository includes several bundled plugins located under plugins/. All are opt-in — activate them using hermes plugins enable .

PluginKindPurpose
disk-cleanuphooks + slash commandAutomatically monitor temporary files and remove them when a session ends
security-guidancehooksScan for dangerous code patterns on write_file/patch calls and attach a security warning (or block the operation) — 25 rules (Apache-2.0 fork of Anthropic's claude-plugins-official patterns)
observability/langfusehooksSend turn / LLM call / tool traces to Langfuse
observability/nemo_relayhooksForward observability events (turns / LLM calls / tools) to an NVIDIA NeMo endpoint
teams_pipelinestandaloneMicrosoft Teams meeting pipeline — Graph-backed, transcript-first meeting summaries
spotifybackend (7 tools)Native Spotify playback, queue, search, playlists, albums, library
google_meetstandaloneJoin Meet calls, live-caption transcription, optional realtime duplex audio
image_gen/openaiimage backendOpenAI gpt-image-2 image generation backend (alternative to FAL)
image_gen/openai-codeximage backendOpenAI image generation via Codex OAuth
image_gen/xaiimage backendxAI grok-2-image backend
hermes-achievementsdashboard tabSteam-style collectible badges generated from your real Hermes session history
kanban/dashboarddashboard tabKanban board UI for the multi-agent dispatcher — tasks, comments, fan-out, board switching. See Kanban Multi-Agent.

Memory providers (plugins/memory/*) and context engines (plugins/context_engine/*) are documented separately on Memory Providers — they are managed through hermes memory and hermes plugins respectively. The full per-plugin detail for the two long-running hooks-based plugins follows.

disk-cleanup​

Automatically tracks and removes temporary files created during sessions — test scripts, temp outputs, cron logs, stale chrome profiles — without requiring the agent to remember to call a tool.

How it works:

HookBehaviour
post_tool_callWhen write_file / terminal / patch creates a file matching test_*, tmp_*, or *.test.* inside HERMES_HOME or /tmp/hermes-*, track it silently as test / temp / cron-output.
on_session_endIf any test files were auto-tracked during the turn, run the safe quick cleanup and log a one-line summary. Stays silent otherwise.

Deletion rules:

CategoryThresholdConfirmation
testevery session endNever
temp>7 days since trackedNever
cron-output>14 days since trackedNever
empty dirs under HERMES_HOMEalwaysNever
research>30 days, beyond 10 newestAlways (deep only)
chrome-profile>14 days since trackedAlways (deep only)
files >500 MBnever autoAlways (deep only)

Slash command/disk-cleanup available in both CLI and gateway sessions:

/disk-cleanup status                     # breakdown + top-10 largest
/disk-cleanup dry-run                    # preview without deleting
/disk-cleanup quick                      # run safe cleanup now
/disk-cleanup deep                       # quick + list items needing confirmation
/disk-cleanup track <path> <category>    # manual tracking
/disk-cleanup forget <path>              # stop tracking (does not delete)

State — everything lives at $HERMES_HOME/disk-cleanup/:

FileContents
tracked.jsonTracked paths with category, size, and timestamp
tracked.json.bakAtomic-write backup of the above
cleanup.logAppend-only audit trail of every track / skip / reject / delete

Safety — cleanup only ever touches paths under HERMES_HOME or /tmp/hermes-*. Windows mounts (/mnt/c/...) are rejected. Well-known top-level state dirs (logs/, memories/, sessions/, cron/, cache/, skills/, plugins/, disk-cleanup/ itself) are never removed even when empty — a fresh install does not get gutted on first session end.

Enabling: hermes plugins enable disk-cleanup (or check the box in hermes plugins).

Disabling again: hermes plugins disable disk-cleanup.

security-guidance​

Fast pattern-matched security warnings on file writes. When the agent's write_file / patch / skill_manage calls carry content matching a known-dangerous code pattern — pickle.load, yaml.load without SafeLoader, eval(, os.system, subprocess(..., shell=True), JS child_process.exec, React dangerouslySetInnerHTML, raw .innerHTML = / .outerHTML = / document.write, Node crypto.createCipher, AES ECB mode, TLS verification disabled, XXE-prone xml.etree / minidom parsers, `` without SRI, torch.load without weights_only=True, GitHub Actions ${{ github.event.* }} injection — the plugin appends a ⚠️ Security guidance block to the tool's result.

The file is still written. The model reads the warning in the next turn's tool message and can either fix the code or document why the construct is safe in this context. Pattern matching has a non-trivial false-positive rate, which is why warn (not block) is the default.

Coverage: 25 rules total, covering unsafe deserialization, command injection, XSS sinks, crypto footguns, XXE, supply-chain (SRI), and CI/CD workflow injection. The pattern data is a verbatim Apache-2.0 fork of Anthropic's claude-plugins-official — see the plugin's LICENSE and NOTICE files for attribution.

Modes:

Env varEffect
(unset)warn mode (default) — file is written, warning appended to result
SECURITY_GUIDANCE_BLOCK=1block mode — write refused, warning returned as the block reason
SECURITY_GUIDANCE_DISABLE=1kill switch — plugin loads but does nothing

Enabling: hermes plugins enable security-guidance (or check the box in hermes plugins).

Disabling again: hermes plugins disable security-guidance.

What it does not do (yet): the upstream Anthropic plugin has two more layers — an LLM diff review on each agent turn that touched files, and an agentic commit-time review that traces data flow across files. Neither is ported. The agent can already run those reviews on demand via delegate_task.

observability/langfuse​

Hermes traces every turn, LLM call, and tool invocation to Langfuse, an open-source observability platform built for LLM applications. Each turn becomes a root span, each API call becomes a generation child observation, and each tool invocation becomes a tool observation. The usage totals, per-type token counts, and cost estimates are derived directly from Hermes' canonical agent.usage_pricing numbers, so the Langfuse dashboard displays the same breakdown (input / output / cache_read_input_tokens / cache_creation_input_tokens / reasoning_tokens) that you see in hermes logs.

The plugin operates in a fail-open mode: if the SDK is not installed, credentials are missing, or Langfuse experiences a transient error, the hook silently becomes a no-op. The agent loop remains completely unaffected.

Setup (interactive — recommended):

hermes tools          # → Langfuse Observability → Cloud or Self-Hosted

The wizard collects your API keys, runs pip install for the langfuse SDK, and automatically adds observability/langfuse to the plugins.enabled list. Restart Hermes, and the next turn will ship a trace.

Setup (manual):

pip install langfuse
hermes plugins enable observability/langfuse

Then place your credentials in ~/.hermes/.env:

HERMES_LANGFUSE_PUBLIC_KEY=pk-lf-...
HERMES_LANGFUSE_SECRET_KEY=sk-lf-...
HERMES_LANGFUSE_BASE_URL=https://cloud.langfuse.com   # or your self-hosted URL

How it works:

HookBehaviour
pre_api_request / pre_llm_callOpens (or reuses) a per-turn root span named "Hermes turn". Starts a generation child observation for this API call, serializing recent messages as input.
post_api_request / post_llm_callCloses the generation, attaching usage_details, cost_details, finish_reason, assistant output, and tool calls. If no tool calls exist and content is non-empty, the turn is closed.
pre_tool_callStarts a tool child observation with sanitized args.
post_tool_callCloses the tool observation with sanitized result. For read_file payloads, the content is summarized (head + tail + omitted-line count) so that large file reads stay within HERMES_LANGFUSE_MAX_CHARS.

Session grouping is driven by the Hermes session ID (or task ID for sub-agents) via langfuse.propagate_attributes, so everything within a single hermes chat session lives under one Langfuse session.

Verify:

hermes plugins list                 # observability/langfuse should show "enabled"
hermes chat -q "hello"              # check the Langfuse UI for a "Hermes turn" trace

Optional tuning (in .env):

VariableDefaultPurpose
HERMES_LANGFUSE_ENVEnvironment tag on traces (production, staging, …)
HERMES_LANGFUSE_RELEASERelease/version tag
HERMES_LANGFUSE_SAMPLE_RATE1.0Sampling rate passed to the SDK (0.0–1.0)
HERMES_LANGFUSE_MAX_CHARS12000Per-field truncation for message content / tool args / tool results
HERMES_LANGFUSE_DEBUGfalseVerbose plugin logging to agent.log

Both Hermes-prefixed variables and standard SDK environment variables (LANGFUSE_PUBLIC_KEY, LANGFUSE_SECRET_KEY, LANGFUSE_BASE_URL) are accepted. When both are set, the Hermes-prefixed versions take precedence.

Performance: The Langfuse client is cached after the first hook call. If credentials or the SDK are missing, that decision is also cached, so subsequent hooks return quickly without re-checking environment variables or reloading configuration.

Disabling: Run hermes plugins disable observability/langfuse. The plugin module remains discoverable, but no module code executes until you re-enable it.

google_meet​

This plugin enables the agent to join, transcribe, and participate in Google Meet calls. The agent can take notes during a meeting, summarize the conversation afterward, follow up on specific points, and optionally speak replies back into the call using TTS.

What it adds:

  • A headless virtual participant that joins a Meet URL via browser automation
  • Live transcription of meeting audio using the configured STT provider
  • A toolset (meet_summarize, meet_speak, meet_followup) that the agent invokes to act on what it hears
  • Post-meeting artifacts (transcript, speaker-attributed notes, action items) saved under ~/.hermes/cache/google_meet//

Setup:

hermes plugins enable google_meet
# Prompts you to sign in via the plugin's OAuth flow on first use —
# needs a Google account with Meet access. Host approval may be required
# if the meeting enforces "only invited participants can join".

Usage from chat:

"Join meet.google.com/abc-defg-hij and take notes. After the call, send me a summary with action items."

The agent initiates the meeting join, streams the transcription back into its context as the call progresses, and produces a structured summary when the meeting ends (or when you instruct it to stop).

When to use it: Recurring standups where you want a bot to transcribe and summarize for async attendees; deposition-style interviews where structured notes are valuable; any scenario where you would otherwise rely on Fireflies, Otter, or Grain. If you prefer not to have an AI listening in, simply leave this plugin disabled.

Disabling: Run hermes plugins disable google_meet. Any cached transcripts and recordings remain in ~/.hermes/cache/google_meet/ until you remove them manually.

hermes-achievements​

This plugin adds a Steam-style achievements tab to the dashboard, featuring over 60 collectible, tiered badges generated from your real Hermes session history. Badges cover tool-chain feats, debugging patterns, vibe-coding streaks, skill and memory usage, model and provider variety, and lifestyle quirks (such as weekend and night sessions). Originally authored by @PCinkusz as an external plugin, it has been brought in-tree so it stays in lockstep with Hermes feature changes.

How it works:

  • Scans your entire ~/.hermes/state.db session history on the dashboard backend
  • Per-session stats are cached by a (started_at, last_active) fingerprint, so only new or changed sessions are re-analyzed on subsequent scans
  • The first-ever scan runs in a background thread — the dashboard never blocks waiting for it, even on databases with thousands of sessions
  • Unlock state is persisted to $HERMES_HOME/plugins/hermes-achievements/state.json

Tier progression: Copper → Silver → Gold → Diamond → Olympian. Each card includes a "What counts" section that lists the exact metric being tracked.

Achievement states:

StateMeaning
UnlockedAt least one tier achieved
DiscoveredKnown achievement, progress visible, not yet earned
SecretHidden until Hermes detects the first related signal in your history

API — routes mount under /api/plugins/hermes-achievements/:

EndpointPurpose
GET /achievementsFull catalog with per-badge unlock state (returns a pending placeholder while the first cold scan is running)
GET /scan-statusState of the background scanner: idle / running / failed, last duration, run count
GET /recent-unlocksTwenty most recently unlocked badges, newest first
GET /sessions/{id}/badgesBadges earned primarily in one specific session
POST /rescanManual synchronous rescan (blocks; use when the user clicks the rescan button)
POST /reset-stateClear unlock history and cached snapshot

State files — live under $HERMES_HOME/plugins/hermes-achievements/:

FileContents
state.jsonUnlock history: which badges you've earned and when. Stable across Hermes updates.
scan_snapshot.jsonLast completed scan payload (served immediately on dashboard load)
scan_checkpoint.jsonPer-session stats cache keyed by fingerprint (makes warm rescans fast)

Performance notes:

  • A cold scan on approximately 8,000 sessions takes a few minutes. It runs in a background thread on the first dashboard request; the UI shows a pending placeholder and polls /scan-status.
  • Incremental results during a cold scan — the scanner publishes a partial snapshot every ~250 sessions, so each dashboard refresh reveals more unlocked badges as the scan progresses. No minute-long wait with zeros.
  • A warm rescan reuses per-session stats for every session whose started_at + last_active fingerprint matches the checkpoint, completing in seconds even on large histories.
  • The in-memory snapshot TTL is 120 seconds; stale requests serve the old snapshot immediately and trigger a background refresh. You never wait on a spinner just because the TTL expired.

Enabling: No action is needed — hermes-achievements is a dashboard-only plugin (no lifecycle hooks, no model-visible tools). It auto-registers as a tab in hermes dashboard on first launch. The plugins.enabled configuration only gates lifecycle and tool plugins; dashboard plugins are discovered purely through their dashboard/manifest.json.

Opting out: Delete or rename plugins/hermes-achievements/dashboard/manifest.json, or override it with a user plugin of the same name in ~/.hermes/plugins/hermes-achievements/ that ships no dashboard. The plugin's state files under $HERMES_HOME/plugins/hermes-achievements/ persist — reinstalling preserves your unlock history.

Adding a bundled plugin

Bundled plugins are developed identically to any standard Hermes plugin — refer to Build a Hermes Plugin for the full guide. The key distinctions are:

  • The plugin directory is located at /plugins// rather than ~/.hermes/plugins//
  • The manifest source field displays as bundled when running hermes plugins list
  • User-installed plugins sharing the same name will take precedence over the bundled version

A plugin is well-suited for bundling when:

  • It has no optional dependencies (or those dependencies are already included via pip install .[all])
  • The functionality benefits the majority of users and is designed as opt-out rather than opt-in
  • The logic integrates with lifecycle hooks that users would otherwise need to remember to invoke manually
  • It enhances a core capability without increasing the model-visible tool surface area

Situations where a plugin should remain user-installable rather than bundled include: third-party integrations requiring API keys, specialized workflows, dependencies with large installation trees, and any plugin that would materially alter agent behaviour by default.

Newsletter

The #1 AI Newsletter

The most important ai updates, guides, and fixes — one weekly email.

No spam, unsubscribe anytime. Privacy policy

Related Guides