This repository is the community extension library for Hermes WebUI.
The goal is to give trusted local extensions a shared place to document, package, review, and iterate without turning every optional workflow into Hermes WebUI core code.
This repository is young but the core loop is live: the registry, CI safety gates, and the one-click install/uninstall UI in WebUI (Settings → Extensions) have all shipped. The WebUI extension APIs are still growing, so the conventions here are a maintained foundation rather than a locked marketplace contract.
For the current WebUI-side loading contract, see
docs/EXTENSIONS.md
in the main Hermes WebUI repository. For authoring an entry in this repo, see
docs/extension-entry.md.
Hermes WebUI extensions are trusted local code. Extension JavaScript runs in the WebUI origin and can interact with the authenticated WebUI session. That means extensions should be reviewed like application code, not like passive themes.
Extension PRs should disclose:
extensions/
<extension-id>/
README.md
extension.json
manifest.json
assets/
screenshots/
docs/
extension-entry.md
examples/
manifest-bundle/
loopback-sidecar/
Each extension should stay self-contained under extensions/<extension-id>/.
Shared docs and examples live under docs/ and examples/.
Extensions should declare the WebUI extension API surface they expect, not just the WebUI version they were first tested with. This gives maintainers a way to check existing extensions when the main Hermes WebUI repo rolls forward.
Extension entries should document:
This repository validates existing extension entries as the main WebUI extension contract evolves.
Run the current repo-wide checks locally with:
node scripts/validate-extensions.mjs
node scripts/test-extension-validator.mjs
node scripts/test-message-pins-sync.mjs
node scripts/test-sidecar-contract.mjs
python3 scripts/test-sidecar-scaffold.py
node scripts/scan-extension-safety.mjs
node scripts/sync-sidecar-base.mjs --check
node scripts/check-sidecar-usage.mjs
node scripts/validate-desktop-companion.mjs
node scripts/generate-registry.mjs --out dist/registry.json
Pull requests run the same validation, contract, and safety checks in CI. Pushes to main
generate the registry and per-extension zip artifacts for GitHub Pages. The
registry entry includes a download URL and artifact-level sha256 for each
extension so the WebUI install client fetches and verifies reviewed bytes before
extracting them. The core-side install client — safe extraction, sha256
verification, and uninstall — has shipped in the main Hermes WebUI repo
(Settings → Extensions).
The live entry list is maintained in
extensions/README.md, and the published, installable set
is the generated registry
(registry.json).
See those rather than a hardcoded list here, which drifts on every merge.
The one-click install flow and registry UI shipped in core (Settings →
Extensions: browse the registry, review permissions, install/uninstall with
sha256 verification). Merged entries here are validated + safety-scanned in CI,
published to the registry, and become one-click-installable from inside WebUI.
The consent-gated per-extension loopback proxy is shipped. token-v1 runtimes use
that same-origin path and validate core’s per-install token; explicitly legacy
external adapters may still use direct loopback under the core CSP allowance.
Every sidecar entry must document its install and lifecycle requirements.