Skip to main content

Plugin Catalog

The plugin catalog is a curated, human-reviewed directory of Hermes plugins you can install by name with a single command:

hermes plugins install <name>

Browse it visually at /docs/plugins — entries are shelved by category (Memory, Desktop, Platforms, Web & Browser, Tools, Voice, Automation, Models), with search, tier filters (Official / Community), capability chips, and Install in Hermes buttons and copyable CLI commands for every entry.

In Desktop, open Capabilities → Plugins → Browse for the native catalog view. It is not an embedded website. Installed is a separate tab backed by the app's desktop-plugin registry and the selected profile's agent-plugin state, rather than catalog metadata. Skills uses the same Installed / Browse layout; search stays at the top and the tab switch and actions share one row. Browse defaults to cards. The list and card icons beside the filters switch layouts, preserving search and filters and remembering the choice across both catalogs.

The catalog complements — it does not replace — the existing plugin system. Anything you can install from the catalog is a normal plugin under the hood; the catalog just adds discovery and a review layer on top.

Published browse data

The website and Desktop read the same generated CDN snapshot: https://hermes-agent.nousresearch.com/docs/api/plugins.json. Desktop fetches it through https://nousresearch.github.io/hermes-agent/docs/api/plugins.json; the public docs alias serves the same data. The docs build reads plugin-catalog/*.yaml and adds cached repository star counts. It also publishes the installer's removed-entry list. Neither Browse view crawls source repositories or queries the GitHub API live.

This browse snapshot is distinct from the installer's plugin-catalog.json, which resolves catalog names and pins.

What's in an entry

Each catalog entry is a small YAML file in the plugin-catalog/ directory of the hermes-agent repository, declaring:

FieldMeaning
nameThe catalog key you pass to hermes plugins install
repoThe plugin's public git repository
shaThe exact 40-hex commit that was reviewed — installs check out this pin, not a branch tip
tierofficial (maintained by NousResearch) or community
categoryBrowse shelf: desktop (default), memory, platform, web, tools, voice, automation, models or general
maintainerWho owns the plugin
capabilitiesDeclared tools, hooks, middleware, and required env vars
requires_hermesMinimum Hermes version, e.g. >=0.19 (optional)
platformsOS restrictions, empty = all (optional)
docs_urlExternal documentation link (optional)
versionHuman-readable label for the pinned sha, e.g. "1.4.0"; shown as 1.4.0 @ abcd1234 in the CLI, on the catalog card and on the Desktop Update to button (optional, cosmetic)
imageBanner image for the catalog card, shown at 2:1 (1200×600 works; other shapes are centre-cropped); an https URL on raw.githubusercontent.com, github.com or *.githubusercontent.com (optional). Pin it to the entry's commit (raw.githubusercontent.com/owner/repo/<sha>/...) so it never changes under the review

Trust model

The catalog is designed so you know exactly what you're installing:

  • Human-merged admission. Every entry (and every pin update) lands via a pull request reviewed by a maintainer. Nothing enters the catalog automatically.
  • Exact SHA pins. Entries pin a specific commit, not a branch. A plugin author pushing new code to their repo does not change what the catalog installs — updating the pin requires another reviewed PR.
  • Scanned at admission, trusted at install. Admission CI runs the same security scanner the installer runs (hermes plugins validate includes a security scan check): a dangerous verdict fails the entry, caution findings are listed for the reviewer. Because the reviewer saw them, a catalog install checked out at exactly the pinned SHA does not stop to ask about caution again; dangerous still blocks, and anything installed from a raw URL or at another revision gets the normal prompt.
  • Capability declarations. Entries state up front which tools, hooks, and middleware the plugin provides and which environment variables (API keys etc.) it needs, so you can judge its blast radius before installing.
  • Removed list. Plugins pulled from the catalog (for example after a security incident) go on plugin-catalog/removed.yaml with a reason and date. The installer refuses to install anything on the removed list.
  • Installed ≠ enabled. Installing a catalog plugin puts it on disk; like any plugin it must still be enabled before it loads. See Plugins → Enabling and disabling.
Catalog review is a point-in-time review

A catalog entry means the pinned commit was looked at by a human, capability declarations were checked, and the repo met the submission bar. It is not a security audit, and it says nothing about other commits in the same repository. Review the code of anything you give credentials to.

Installing from the catalog

On the website, Install in Hermes opens a protocol link of this form:

hermes://plugin/install?repo=owner%2Frepo&catalog_name=example-plugin&sha=0123456789abcdef0123456789abcdef01234567

repo is URL-encoded, including any #subdir. Desktop asks you to review the source, destination and components before confirming; the link does not auto-install. For the agent-plugin component, the backend resolves catalog_name to its reviewed pin. The link's sha is display metadata only, not authority to choose or override a commit, and it is not a pin guarantee for a standalone desktop plugin.

Use an updated Desktop build for the catalog parameters (and for the public Skills Hub's new hermes://skill/install?identifier=... route). Older builds may only understand repository-only plugin links. The expanded cards retain CLI commands, so you can install by catalog name without Desktop:

# Install a reviewed catalog entry by name (checks out the pinned SHA)
hermes plugins install <name>

# Then enable it, as with any plugin
hermes plugins enable <name>

The install prompt shows the entry's capability summary — declared tools, hooks, and required env vars — before anything is cloned.

The catalog name and the plugin's own manifest name can differ; hermes plugins install prints the installed name, and enable takes that one. For example the touchdesigner entry (a portable Agent Plugins v1 package that bundles the twozero MCP server with the touchdesigner-mcp skill) installs as td, kept short so its generated MCP tool names stay under provider function-name limits:

hermes plugins install touchdesigner
hermes plugins enable td

Portable packages can also carry a stdio MCP server. The snyk entry pins the Snyk CLI (npx -y snyk@<version> mcp) and bundles the snyk-security-scan skill, so one install gives Hermes code, dependency, container and IaC scanning plus the workflow for using it; the catalog name and manifest name match:

hermes plugins install snyk
hermes plugins enable snyk

Updating a catalog install

hermes plugins update <name> never runs git pull for catalog installs — it compares your installed pin against the current catalog pin and, when the catalog moved (via a reviewed PR), force-reinstalls at the new SHA. Your enabled/disabled state is preserved. hermes plugins list shows catalog installs as catalog:<tier>@<sha> so you can see provenance at a glance.

Names not in the catalog

A bare name that isn't a catalog entry is an error: there is no second, unreviewed name index. Install such plugins by owner/repo or Git URL instead (custom source, see below), or submit them to the catalog.

Live refresh

The docs build publishes the catalog as one JSON document (https://hermes-agent.nousresearch.com/docs/api/plugin-catalog.json). search/install/update fetch it at most every six hours and cache it under ~/.hermes/cache/, so new entries and removals reach installed clients without updating Hermes. Offline, the copy shipped with your checkout is used. Removals from the in-tree list and the live list are always both enforced.

Custom git URLs are different

hermes plugins install <git-url> still works for any repository, but it bypasses the catalog entirely:

  • No review — you get whatever is at the branch tip, not a reviewed pin.
  • A warning banner is shown to make clear the code is unvetted.
  • The removed list is still consulted (a known-bad repo is refused by URL).

Use the git-URL path for your own plugins and repos you already trust; use the catalog for discovery.

Submitting a plugin to the catalog

Submissions are pull requests that add one plugin-catalog/<name>.yaml file. The full checklist lives in the plugin-catalog README; in short, an entry must be:

  1. Owner-submitted — the PR author owns or maintains the plugin repo. Maintainers also add batches of community plugins from a reviewed sweep (each pin validated and scanned at the pinned commit); if yours was swept in and you want it changed or removed, open a PR on your entry.
  2. A public repository — the repo URL is publicly cloneable.
  3. Released — the repo has real releases/tags, not just a default branch.
  4. Passing validation — the catalog validation GitHub Action is green on the PR (schema, SHA format, reachability).
  5. Not self-updating — the catalog build must not download and replace its own files; the pinned SHA is the only update path (a SHA-bump PR plus hermes plugins update <name>).

Pin updates (bumping sha to a newer commit) follow the same PR + review process; bump version in the same PR so the label users see matches the code. Installed plugins compare their recorded sha against the live pin: hermes plugins list --json reports update_available, the Desktop Plugins tab shows an Update to 1.4.0 button, and hermes plugins update <name> checks out exactly the new pin.

See also