All plugins

Official

camofox

Camofox browser backend: browse with a self-hosted anti-detection Firefox (Camoufox, C++ fingerprint spoofing) through the camofox-browser REST server. Registers the browser_* tools (navigate, snapshot with clickable refs, click, type, scroll, back, press, get_images, vision, JavaScript console, plus cookie import when CAMOFOX_API_KEY is set) in the camofox toolset, with hermes camofox setup|status; existing CAMOFOX_* variables and browser.camofox settings carry over. Formerly built into Hermes core; existing users are migrated automatically. Disclosure: one Python dependency (requests). It talks only to the Camofox server at CAMOFOX_URL (e.g. http://localhost:9377, which you run yourself: Docker or npm start), sending CAMOFOX_API_KEY as a bearer token when set. Page text reaches only your model as tool output; browser_vision sends the screenshot to your configured auxiliary vision model. Snapshots mask values that look like secrets (API keys, tokens), but text typed into form fields, passwords included, shows up in snapshots. Oversized snapshots and screenshots are written under the Hermes home (cache/web, browser_screenshots). Cookie import reads Netscape cookies.txt files only from browser.camofox.cookies_dir (default ~/.camofox/cookies). browser_vault fills saved passwords on the Camofox tab (sent only to a loopback or HTTPS CAMOFOX_URL). Inert on Hermes cores that still bundle Camofox.

NousResearch676Webv1.1.0Updated 7 days ago

About

Camofox browser backend: browse with a self-hosted anti-detection Firefox (Camoufox, C++ fingerprint spoofing) through the camofox-browser REST server. Registers the browser_* tools (navigate, snapshot with clickable refs, click, type, scroll, back, press, get_images, vision, JavaScript console, plus cookie import when CAMOFOX_API_KEY is set) in the camofox toolset, with hermes camofox setup|status; existing CAMOFOX_* variables and browser.camofox settings carry over. Formerly built into Hermes core; existing users are migrated automatically. Disclosure: one Python dependency (requests). It talks only to the Camofox server at CAMOFOX_URL (e.g. http://localhost:9377, which you run yourself: Docker or npm start), sending CAMOFOX_API_KEY as a bearer token when set. Page text reaches only your model as tool output; browser_vision sends the screenshot to your configured auxiliary vision model. Snapshots mask values that look like secrets (API keys, tokens), but text typed into form fields, passwords included, shows up in snapshots. Oversized snapshots and screenshots are written under the Hermes home (cache/web, browser_screenshots). Cookie import reads Netscape cookies.txt files only from browser.camofox.cookies_dir (default ~/.camofox/cookies). browser_vault fills saved passwords on the Camofox tab (sent only to a loopback or HTTPS CAMOFOX_URL). Inert on Hermes cores that still bundle Camofox.

Camofox for Hermes Agent

Part of the Hermes Official Plugins, Nous Research's official plugins for Hermes Agent. Formerly built into Hermes core (tools/browser_camofox.py).

Camofox is a self-hosted Node.js server wrapping
Camoufox, a Firefox fork with C++ fingerprint spoofing. This plugin drives it over its REST API, so
Hermes browses with a local anti-detection browser and no cloud dependency.

It registers the browser tools skills already call, in the camofox toolset:
browser_navigate, browser_snapshot, browser_click, browser_type, browser_scroll,
browser_back, browser_press, browser_get_images, browser_vision and browser_console, plus
browser_import_cookies when a Camofox API key is set.

If you already used Camofox with Hermes, you don't need to change anything: CAMOFOX_URL, the
other CAMOFOX_* variables and every browser.camofox.* config key work as before, and with
managed_persistence: true the plugin sends the same profile-scoped Camofox userId core sent, so
your saved logins carry over.

Install

hermes plugins install camofox                                      # from the plugin catalog
hermes plugins install NousResearch/hermes-official-plugins#camofox  # or straight from this repo

The installer asks for CAMOFOX_URL. Hermes never installs or starts the Camofox server; run it
yourself (next section), then check it:

hermes camofox setup     # save CAMOFOX_URL (and an optional CAMOFOX_API_KEY) to this profile's .env
hermes camofox status    # configured URL, identity mode, reachable or not, VNC address

The tools appear once CAMOFOX_URL is set and the camofox toolset is enabled
(hermes tools). On a Hermes release that still has Camofox built in, the plugin stays inactive
(one log line, no tools) and the built-in backend keeps working.

Run the Camofox server

Camofox's own quick start is native Node, no Docker; that path also works on Windows:

git clone https://github.com/jo-inc/camofox-browser
cd camofox-browser
npm install && npm start
# -> http://localhost:9377

The first run downloads Camoufox (hundreds of MB). GET http://localhost:9377/health should report
ok: true. Shorthand: npx @askjo/camofox-browser. To use Hermes-managed Node instead of a system
install, put ~/.hermes/node on PATH (Windows default profile: %LOCALAPPDATA%\hermes\node).

Headed vs headless (native installs). The lever is interactive.mode in camofox.config.json
(or the CAMOFOX_INTERACTIVE env var): off (default, headless), desktop (a visible Camoufox
window for manual logins), novnc, or auto. Restart the Camofox server after changing it.

Docker

docker run -d -p 9377:9377 -e CAMOFOX_PORT=9377 ghcr.io/jo-inc/camofox-browser:latest

Docker's headed path is VNC (ENABLE_VNC=1); builds with VNC, a persistent profile directory or a
larger Node heap are described in the camofox-browser README.

Then point Hermes at the server:

# ~/.hermes/.env
CAMOFOX_URL=http://localhost:9377

Docker: opening pages served from the host

CAMOFOX_URL points at the host-published control API, but page URLs are opened by the browser
inside the container, where 127.0.0.1 is the container. Rewrite loopback page URLs to the host:

# ~/.hermes/config.yaml
browser:
  camofox:
    rewrite_loopback_urls: true
    loopback_host_alias: host.docker.internal  # default; use a LAN IP if needed

(or CAMOFOX_REWRITE_LOOPBACK_URLS=true, CAMOFOX_LOOPBACK_HOST_ALIAS=...). Only localhost,
127.0.0.1 and ::1 page URLs are rewritten, CAMOFOX_URL itself is unchanged, and the tool result
tells the model about the rewrite. Leave it off for native installs.

Persistent browser sessions

By default each session gets a random Camofox identity, so cookies and logins don't survive a
restart. To keep them:

browser:
  camofox:
    managed_persistence: true

Hermes then sends a deterministic userId derived from the profile's browser_auth/camofox/ path,
so each Hermes profile gets its own Camofox browser profile, and it skips the server-side session
delete at the end of a session. The Camofox server must map that userId to a persistent profile.

Ending a Hermes session does not close the Camofox session: Hermes only drops its local entry and
the browser context keeps running, with live cookies held in that open context, not yet on disk.
Camofox writes them to disk at a checkpoint: POST /stop (needs CAMOFOX_ADMIN_KEY, sent as
x-admin-key) or a graceful Node shutdown (SIGINT / SIGTERM). Killing Node (kill -9,
taskkill /F, Task Manager) skips the shutdown hook and drops logins that were never checkpointed.

Headed login, then headless reuse:

  1. Start Camofox with interactive.mode (or CAMOFOX_INTERACTIVE) set to desktop.
  2. Start Hermes, open a login site in a browser task, and sign in in the visible window.
  3. Checkpoint without killing Node:
    curl -X POST http://localhost:9377/stop -H "x-admin-key: $CAMOFOX_ADMIN_KEY"
    
    State lands under ~/.camofox/profiles/ on the server. POST /stop answers 403 when
    CAMOFOX_ADMIN_KEY is unset: shut Node down gracefully instead, then start Camofox again.
  4. Set interactive.mode to off, restart Camofox, and start a new Hermes browser task.

Externally managed sessions

When another app drives the visible Camofox browser, Hermes can work inside that same identity:

SettingEnv varEffect
browser.camofox.user_idCAMOFOX_USER_IDCamofox userId for Hermes' tabs; setting it opts into externally managed mode (no server-side delete at session end).
browser.camofox.session_keyCAMOFOX_SESSION_KEYsessionKey/listItemId sent on tab creation and matched during adoption. Defaults to a per-task value.
browser.camofox.adopt_existing_tabCAMOFOX_ADOPT_EXISTING_TABReuse an open tab of that user (GET /tabs?userId=...) before creating one.

Env vars take precedence over config.yaml.

Adoption only reuses a tab whose listItemId equals the session key. With no such tab, the next
browser_navigate opens a new tab under the session key in the same Camofox user (same cookies and
profile). To make Hermes attach to the tab another app opened, set session_key to the key that app
used when it created the tab.

Cookie import

browser_import_cookies loads a Netscape-format cookies.txt (exported with a "cookies.txt"
browser extension) into the current Camofox user, so the agent can reach sites you are signed in to
without an interactive login. It is offered only when CAMOFOX_API_KEY is set, and the Camofox
server must run with the same key (-e CAMOFOX_API_KEY=...):

openssl rand -hex 32          # put the value in ~/.hermes/.env as CAMOFOX_API_KEY and on the server
mkdir -p ~/.camofox/cookies
cp ~/Downloads/linkedin_cookies.txt ~/.camofox/cookies/linkedin.txt

Then ask: "Import my LinkedIn cookies from linkedin.txt, then open my feed." Files must sit under
browser.camofox.cookies_dir (default ~/.camofox/cookies); absolute paths and ../ are refused,
files are capped at 5 MB and 500 cookies, domain_suffix filters to one site, and cookie values are
never logged. Imported cookies belong to the session's Camofox user: with
browser.camofox.managed_persistence: true later navigations keep that identity; with the default
ephemeral identity they last only while the same Camofox session lives.

Configuration reference

KeyDefaultMeaning
CAMOFOX_URL (.env)—Camofox server URL. Required.
CAMOFOX_API_KEY (.env)—Sent as Authorization: Bearer to a server started with an API key.
browser.command_timeout30Per-request timeout in seconds (floor 5; navigation allows 60).
browser.snapshot_threshold15000Snapshots longer than this are cut at a line boundary; the full tree is saved under cache/web and the cut says how to page it with read_file.
browser.restrict_evaluatefalseRefuse browser_console(expression=...) that names sensitive primitives (cookies, storage, network calls). browser.allow_unsafe_evaluate: true overrides it.
browser.camofox.cookies_dir~/.camofox/cookiesWhere browser_import_cookies reads cookie files.
auxiliary.camofox_vision.*inherits auxiliary.visionModel used by browser_vision.

Navigation refuses URLs that carry a Hermes secret, cloud-metadata endpoints, and hosts in your
security.website_blocklist. Private/LAN addresses stay reachable, as they were with core's Camofox
backend.

What differs from core's other browser backends

  • browser_snapshot has no compact/full switch (the Camofox snapshot is a single view).
  • browser_vision always answers through the auxiliary vision model; it has no numbered-label overlay.
  • browser_console evaluates JavaScript; the Camofox REST API has no console log capture.

Core seams this plugin asks for

The plugin uses only documented plugin APIs except for these core helpers, which have no public
plugin seam yet. Each is imported at its point of use:

ImportUsed for
tools.url_safety.is_always_blocked_url, normalize_url_for_requestthe cloud-metadata floor and URL normalization on navigate
tools.website_policy.check_website_accessthe user's website blocklist
agent.redact.redact_sensitive_text, agent.redact._PREFIX_REsecret redaction in tool output; refusing URLs that embed a secret
tools.credential_files.to_agent_visible_cache_paththe stored-snapshot path as the agent's file tools see it (Docker/SSH terminals)

Vault fill (browser_vault filling a login form) reaches the Camofox tab on Hermes cores that have
the browser page backend seam (ctx.register_browser_page_backend): the vault reads the tab's origin,
inspects the form and writes the password through Camofox's /tabs/<id>/evaluate, with the same
exact-origin checks as on a CDP browser. It only fills a tab browser_navigate already opened (it
never opens one), and sends the password only when CAMOFOX_URL is loopback or HTTPS. A value the
vault filled shows as «redacted-vault-secret» in browser_snapshot. On older cores, type
credentials with browser_type. Snapshots also mask values that look like secrets (API keys,
tokens), but Camoufox prints every other filled field's value and does not mark which field is a
password: a plain password typed into the page (by the agent, or by you over VNC) shows up in
browser_snapshot and the navigate result.

License

MIT

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

More by NousResearch

29 plugins by NousResearch in the catalog.

NousResearchaccent-pickerOKLCH accent colour picker for the Hermes Desktop status bar: drag it and the whole theme retints live, with palette commands to reset to the theme default or copy the current colour. A theme-authoring tool; the colour is scratch state and is never persisted. Desktop-only (desktop/plugin.js inside the plugin SDK surface); no agent tools, hooks, middleware or env vars.OfficialDesktop app676NousResearchadvanced-delegationTwo extra delegation modes for delegate_task, next to the built-in default. Model routes (delegation.backend: model_map): the agent picks a named model route per subagent from a list you define (e.g. fast, deep, local). Profile routes (delegation.backend: profile_routes): the agent runs a subagent as one of your Hermes profiles, with that profile's own model, credentials, skills and SOUL.md. Only route names and their one-line descriptions reach the model. Adds hermes delegation config (pick the mode and edit its routes; --show prints the setup) and the /delegation slash command (save a mode for the next session, or --now to apply it to the current chat). Needs Hermes 0.22.5 or newer, the first release with pluggable delegation providers; Hermes 0.22.0 to 0.22.4 refuses to install it, and on a core older than 0.22.0 it installs, logs one warning and does nothing. A model route can set daybreak: true to run its model with OpenAI's Daybreak trusted-access program; it is sent only from your own CLI, TUI or Desktop chats, on openai-codex, for models your Codex catalog lists, and a route that breaks a rule is refused. Disclosure — no Python dependencies and no network or model calls of its own, except that a Daybreak route checks the Codex catalog through core's cached lookup with your existing Codex login; subagents run through core's delegate_task on the routes you configured. Writes only delegation.backend and delegation.backends.* (model_map / profile_routes) in the active profile's config.yaml, through core's config writer. A model route's optional api_key is stored in config.yaml in plain text (provider: keeps keys in .env / auth.json). Listing a profile under profile routes lets this profile's subagents use that profile's credentials, SOUL.md and terminal policy.Officialtools676NousResearchagent-importershermes import-agent: import an OpenClaw (~/.openclaw, or legacy ~/.clawdbot / ~/.moltbot), Claude Code (~/.claude), Codex CLI (~/.codex), Cursor (~/.cursor), Grok Bot (a self-export the Bot writes from a prompt the importer prints) or OpenBot desktop (its openbot.db) setup into Hermes in one command; always previews first and asks before applying. Claude Code / Codex / Cursor: instructions, Cursor rules and memories become memory entries, Bash permission rules become command allow/deny lists, MCP servers land in config.yaml, skills are copied, and --sync re-imports sources that changed. OpenClaw (core's former hermes claw migrate; the plugin keeps that spelling, hermes claw cleanup and the openclaw-migration skill): persona, memories, skills, model and messaging settings, MCP servers and agent behaviour. Formerly built into Hermes core; hermes setup offers to install it when it finds one of these agents, and profiles with a registered sync source are migrated automatically. Disclosure — no Python dependencies, no network calls and no model calls. Claude Code / Codex / Cursor: reads those agents' local config trees (never their credential files; secret-looking MCP env vars and headers are stripped and listed) and writes only into the active profile (memories/MEMORY.md with a backup, config.yaml, skills/ and import-sync.json). OpenClaw: reads the OpenClaw dir (openclaw.json, its .env, workspace files such as SOUL.md / MEMORY.md / USER.md, skills); API keys and bot tokens come over only with --migrate-secrets (allowlisted names, shown in the preview). It writes into the active profile (config.yaml, .env, SOUL.md, memories/, skills/openclaw-imports/, a migration/openclaw/<time>/ report with item backups, and a backups/pre-migration-*.zip restore point), plus a workspace dir only when --workspace-target names one. It runs local pgrep / systemctl / tasklist checks to warn when OpenClaw or a Hermes gateway is still running, and hermes claw cleanup renames the OpenClaw dir to *.pre-migration after a confirmation. Grok Bot / OpenBot: instructions become SOUL.md, memories and user facts become memory entries, skills land in skills/<source>-imports/, scheduled routines become paused cron jobs (--activate-routines to start them) and event routines a notes file; credential-looking export keys refuse the file, and secret MCP env vars and headers are stripped and listed. OpenBot's database is opened read-only (or read from a scratch copy that is deleted after the read).Officialtools676NousResearchblenderOfficial Blender Lab MCP server over stdio, pinned to upstream v1.0.3, with a Blender workflow skill. Needs Git and uv; Blender 5.1+ is not needed at install. The skill opens Blender itself when a task needs it and, after you agree, installs Blender and Blender Lab's MCP add-on. First startup downloads Python dependencies; prepare the uv environment before connecting. Disclosure — tools execute arbitrary Python in Blender with your privileges; the skill starts Blender with online access for that session only (your saved preference is unchanged), and the add-on's local server on port 9876 has no password, so any program on this computer can use it while Blender is open; only after you agree does the skill download Blender from download.blender.org (about 400 MB, about 1.5 GB unpacked), check it against blender.org's sha256 list and install it in your own folder without administrator rights (Linux ~/.local/opt, macOS ~/Applications, Windows %LOCALAPPDATA%\Programs\Blender Foundation; never over an existing Blender), and download the v1.0.3 add-on, check its hash and install or enable it; first start downloads the pinned Blender Lab MCP server and its Python dependencies with uv. Server discovery does not prove scene readiness.Officialtools676

Developer Mode

Explore built-in Hermes toolsets and actions.

HermesAgent

Developer?

Create a Hermes extension for Desktop or agent workflows.

Developer Section