All plugins

hermes-jina

Jina Reader web backend for web_extract (r.jina.ai, works without a key) and web_search (s.jina.ai, needs JINA_API_KEY). Unofficial; not affiliated with Jina AI.

AdolaniumWebv0.1.0Updated 23 days ago

Hermes Jina

Hand Hermes a link. Get back the page, not the markup.

Hermes Jina plugs Jina Reader into the web_extract and web_search tools Hermes already has.
Pages come back as clean Markdown. Reading works without an account; search needs a free key.

POWERED BY HERMES AGENT  ·  COMMUNITY PLUGIN  ·  VERSION 0.1.0

What it does  ·  Install it  ·  Where your data goes

A marble hand pulls a web page out of a browser window as a scroll of Markdown

Powered by Hermes

Hermes Jina is a community-built web backend for Hermes Agent. It adds no tools of its own. It registers a provider named jina through Hermes's web provider API, so the agent keeps calling web_extract and web_search exactly as before, and Hermes routes those calls to Jina when you choose it.

It works in the CLI, Hermes Desktop, the messaging gateway, cron jobs and subagents: anywhere the web tools run.

The web as Markdown

| | |
| --- | --- |
| Readweb_extract sends each URL to r.jina.ai and returns the page as Markdown, with title and final URL. No key needed. | Searchweb_search queries s.jina.ai and returns titles, URLs and snippets. Needs JINA_API_KEY. |
| Mix and matchUse Jina only for reading and keep your current search backend, or use it for both. | Fail per pageOne broken URL comes back with its own error. The rest of the batch still arrives. |

Small decisions, already made

  • Hermes never switches you to Jina on its own. Without a key, Jina is used only when you name it in your config.
  • Several URLs are read in parallel: 2 at a time without a key, 5 with one, to stay under Jina's rate limits.
  • Only http:// and https:// links are sent. Anything else is refused before a request is made.
  • Images are dropped from the Markdown, since the agent reads text.
  • Search asks Jina for snippets only, not every result's full page, to save tokens. At most 20 results.
  • Errors say what to do next: set a key, wait out a rate limit, or check Jina's status page.
  • Each request times out after 60 seconds.

Make it yours

Install

hermes plugins install Adolanium/hermes-jina

The installer asks for JINA_API_KEY. Leave it empty if you only want reading.

Hermes Jina needs Hermes Agent 0.21.6 or later.

Choose it

Pick Jina Reader in hermes tools, or set the backends in ~/.hermes/config.yaml:

web:
  extract_backend: jina   # web_extract through Jina Reader, key optional
  search_backend: jina    # web_search through Jina Search, key required

Set only extract_backend to keep your current search provider.

Add a key

Get one at jina.ai/api-dashboard. New keys come with free tokens. A key turns on search and raises the reading limit above the anonymous one, about 20 requests a minute.

Set it with hermes tools, or as JINA_API_KEY in your Hermes environment. The plugin reads it through Hermes's secret scope, so each profile keeps its own key.

Test

The tests use Hermes's real plugin discovery with a mocked HTTP transport, so they make no network calls:

HERMES_SOURCE=/path/to/hermes-agent bash scripts/test.sh

Check the plugin the same way the catalog does:

hermes plugins validate . --install-deps

CI runs both on every push, against Hermes 0.21.6 and 0.22.2 on Python 3.11 and 3.13.

Privacy you can explain in one breath

Hermes web_extract / web_search  →  r.jina.ai / s.jina.ai (Jina AI)  →  the page or the results
  • What leaves your machine. The URLs the agent reads go to r.jina.ai, and its search queries go to s.jina.ai. Jina fetches and processes the pages on its own servers. See Jina's privacy policy.
  • Your key. Sent to Jina as a bearer token when it is set. The plugin reads it only through Hermes. It never stores, logs or writes it, and it is never echoed back in an error.
  • Nothing else. No files read or written, no shell commands, no background processes, no telemetry.

Compatibility

| Hermes Agent | Python | Status |
| --- | --- | --- |
| 0.22.2 | 3.11, 3.13, 3.14 | Tested in CI and by hand |
| 0.21.6 (minimum) | 3.11, 3.13 | Tested in CI |

The plugin depends only on httpx, which Hermes already ships.

Limits

  • Without a key, reading shares Jina's anonymous rate limit with everyone on your IP. Heavy use needs a key.
  • Search always needs a key.
  • Jina may serve a cached copy of a page. When it does, the result carries Jina's warning in its metadata.
  • Pages behind a login, a paywall or a bot wall may come back empty or partial. Those come back as a per-page error, not a crash.
  • Jina has no batch endpoint, so a long list of URLs is read a few at a time.

License

MIT.

Community project

Hermes Jina is an independent community plugin. It is not affiliated with, endorsed by, sponsored by, or officially associated with Nous Research, the Hermes Agent project, or Jina AI. Hermes, Hermes Agent, Nous Research, Jina and Jina Reader are names and marks belonging to their respective owners.

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

More by Adolanium

25 plugins by Adolanium in the catalog.

AdolaniumgadgetTalk to your Hermes from small ESP32 devices with a screen, microphone and speaker: hold a button, ask, and hear the answer. Adds a gateway platform where each device is a chat, plus tools to list devices, show a card on a screen and run device actions (LEDs, relays). Disclosure — the gateway listens for devices on a WebSocket port (8765, all interfaces by default; plain ws:// unless tls_cert/tls_key are set). New devices need a Hermes pairing code unless listed in GADGET_ALLOWED_USERS; GADGET_ALLOW_ALL_USERS skips pairing (development only). A paired device answers the agent's command approvals for its own chat (allow once or deny), within Hermes's approval timeout. The first approved device becomes the platform's home channel by default. Session hooks feed a dashboard on paired devices with each agent session's platform, a short id and its state (idle, busy, waiting for approval); a device that can switch profiles also sees the offered profiles' sessions. Optional profile switching (off unless `profiles` is set in the default profile's gadget config) lets a device paired on the default profile talk to the listed profiles; each profile approves the device through its own pairing flow (the device shows the `hermes -p <profile> pairing approve` command), the plugin writes nothing into other profiles, and revoking the device in the default profile sends it back there. A paired gadget that draws faces gets the answering profile's face: its `gadget-face.bin`, or its Hermes avatar (`assets/avatar.*`) converted with Pillow when installed; the plugin only reads these files, and `profile_faces: false` turns this off. `platforms.gadget.extra.stt_language` sets the transcription language of gadget recordings through the `pre_transcription` hook; other platforms' audio is untouched. Spoken replies that are not WAV are converted with the local ffmpeg; Opus reply audio uses the host's libopus when installed (loaded with ctypes, not bundled). `hermes gadget update --latest` downloads firmware from this repository's GitHub releases, checks size and SHA-256 against the release manifest (files carry build provenance attestations) and sends it to the device. A device that advertises `camera.capture` returns stills that are saved as PNGs under `~/.hermes/gadgetpix/` and kept until removed by hand. A Hermes Desktop page (`desktop/plugin.js`, plugin SDK only) runs a gadget in the window that connects to the local gateway as a device of its own: its device key, and the gateway access token when one is required, are kept in the page's plugin storage, it pairs like any device, and it uses the microphone only while its talk button or Space is held. The plugin's dashboard routes, behind the dashboard's login, can approve the pairing code a device is showing and send a card or run an advertised action on a connected, paired device; the requests pass through files under plugin-data/gadget/desk/. Otherwise writes only under plugin-data/gadget/. Uses Hermes's own STT, TTS and image cache; no telemetry. Independent community project, not affiliated with Nous Research.Communityplatform518Adolaniumhermes-resetwatchTrack subscription quotas and reset times in Hermes Desktop. Disclosure — probe.py re-executes itself under the Hermes Python interpreter located via HERMES_PYTHON / VIRTUAL_ENV / the parent process or the Hermes installer's managed venv (HERMES_HOME/installs). Every credential read is read-only and nothing is refreshed or stored: it reads provider API keys from the process environment, the Hermes .env (through Hermes's get_secret helper, else read directly), the Vaultwarden plugin's local secret cache (cache/vaultwarden_cache.json, only when Vaultwarden is the sole enabled secret source, keyed by a hash of BW_SESSION, which is never sent) and Docker s6 container env files; Hermes's saved OAuth logins (the credential pool through Hermes's read_credential_pool helper, else auth.json directly, and HERMES_HOME/.anthropic_oauth.json); and other coding-assistant CLIs' local logins: Claude Code (credentials file, macOS keychain or Windows Credential Manager), Codex, Cursor (macOS keychain and the IDE's state.vscdb, opened read-only), Kimi, Grok, ZCode and Command Code. For GitHub Copilot (on by default) it tries COPILOT_GITHUB_TOKEN / GH_TOKEN / GITHUB_TOKEN (through Hermes get_secret, else the process environment), then the Copilot editor's apps.json / hosts.json, then runs gh auth token (prompts disabled, 3-second limit), trying each token in turn until GitHub accepts one. For Codex, a 401 or 403 is retried once with another saved login for the same account. It sends each key only to its own vendor's usage endpoint, presenting the vendor client's identity headers where a private endpoint expects them (Claude Code and Codex CLI user agents, the Grok CLI client headers, and for Copilot the VS Code / Copilot Chat editor headers on api.github.com/copilot_internal/user, which GitHub does not document); environment variables such as GROK_CLI_CHAT_PROXY_BASE_URL (honored only for https grok.com / x.ai hosts), CLAUDE_CONFIG_DIR, CODEX_HOME and GROK_HOME change which host or file it uses. Usage results are cached under HERMES_HOME/cache/resetwatch, never tokens. It exposes nothing to the model: it is a Desktop page only.CommunityDesktop app83Adolaniumhermes-rssRead RSS and Atom feeds and discuss articles in Hermes Desktop. Disclosure — feeds and full articles are fetched with curl through the gateway's shell.exec on the connected Hermes host (public-IPv4 SSRF guard); opt-in AI grading sends article excerpts to your configured model and creates HERMES_HOME/skills/rss-importance-grading/SKILL.md if missing; opt-in image loading fetches publisher images directly from Desktop.CommunityDesktop app65Adolaniumhermes-tailscaleBrowse Tailscale devices and connect to remote Hermes instances in Hermes Desktop.CommunityDesktop app60

Developer Mode

Explore built-in Hermes toolsets and actions.

HermesAgent

Developer?

Create a Hermes extension for Desktop or agent workflows.

Developer Section