npx skills add 不会自动执行 npm install,需进入技能目录手动安装 cloakbrowser 并下载二进制,否则 CloakBrowser 回退会报 ERR_MODULE_NOT_FOUND;SearXNG 默认关闭 JSON 输出,需在 settings.yml 中开启 search.formats 含 json 并关闭 limiter,否则脚本报 HTTP 403;SearXNG(:8080)与 Camofox(:9377)需自行用 Docker 起容器,项目不提供平台专用 compose 或安装脚本。

browser-search
Johell1NSMIT活跃维护给 AI Agent 用的自托管网页检索与浏览技能:SearXNG 搜索、Camofox 浏览、CloakBrowser 绕过反爬,从源头减少幻觉。
A skill for AI agents: search the web with SearXNG, browse with Camofox, bypass protections with CloakBrowser. Anti-hallucination by design. Self-hosted, free, unlimited.
npx skills add Johell1NS/browser-search
cd ~/.config/opencode/skills/browser-search && npm install && node -e "import('cloakbrowser').then(c => c.ensureBinary())"README 未说明显存或 GPU 要求;强调轻量,已在 Raspberry Pi 上构建并测试,可低功耗硬件 7x24 运行。
给 AI Agent 的自托管搜索与浏览技能,用 SearXNG 搜索、Camofox 浏览、CloakBrowser 绕过反爬,靠确定性脚本抑制幻觉
给 AI Agent 用的自托管网页检索与浏览技能:SearXNG 搜索、Camofox 浏览、CloakBrowser 绕过反爬,从源头减少幻觉。
核心能力
- 用 SearXNG 做多源元搜索并返回 JSON 结果
- 用 Camofox 通过 REST API 浏览常规站点
- 遇 Cloudflare/Akamai 等挑战自动升级到 CloakBrowser
- 强制走确定性脚本执行,减少模型编造答案
- Deep Research 模式要求先检索再作答并交叉验证
容易踩的坑
- v3.2.1v3.2.1 — Camofox stuck recovery, partial results in smart-extract最新正式版2026-10-22 · 2026-10-22 08:28 UTC
Highlights
Camofox stuck recovery
- When Camofox gets stuck after a session destroy (every
POST /tabsfails with a masked500while/healthstill reports the browser as running),camofox.mjsnow probes the browser with a short-timeout tab. If the probe fails, the browser is stopped and restarted, and the tab creation is retried once. If the probe works, the problem is the URL (dead domain, slow site) and nothing is restarted. smart-extractskips Camofox for the remaining URLs when the restart fails (the existing escalation to CloakBrowser applies).
smart-extract
- When interrupted (SIGTERM/SIGINT, e.g. by an outer timeout) it now prints the results already collected as
mode: "partial"instead of exiting silently.
Docs
SKILL.md: what to do after a timeout or apartialresult.
Known limits
- Partial output works on SIGTERM/SIGINT, not SIGKILL; POSIX signal support is limited on Windows.
- The
docker restartfallback assumes the container is namedcamofox-browser.
How to update
npx skills update # or: git pullNo
npm installneeded: dependencies are unchanged since v3.2.0.Pull request: #38 — closes #37.
- When Camofox gets stuck after a session destroy (every
- v3.2.0v3.2.0 — Camofox 1.18.1, SearXNG 2026.10, CloakBrowser 0.6.32026-10-21 · 2026-10-21 12:26 UTC
查看更新说明
Highlights
Camofox 1.18.1
- HTTP status and
warningin results, PDF download,select/press/--submitfor forms (#28) - Recommended container flags: core dumps, log rotation, profile volume, telemetry (#27)
- Unbounded storage state is reset periodically; tabs are closed when a step times out (#30)
smart-extract
--exprreturns a real error instead of{"ok":true}when the expression evaluates toundefined(#26)- No page reload for snapshot/text fallbacks; Readability failures on Trusted Types CSP are handled (#29)
SearXNG 2026.10
searxng.mjskeepspubdate, image/video fields andunresponsive_engines, honorsSEARXNG_URL, adds a request timeout (#31)- Required settings documented (JSON format,
use_default_settings), with a hint on HTTP 403 (#32)
CloakBrowser 0.6.3 (free binary, no license key)
- CloakBrowser 0.6.3, Playwright Core 1.64.1 (#33)
- Safer binary download, stable fingerprint per persistent profile, more reliable humanized actions
- Fixed a false-positive Cloudflare challenge detection that made
cloak-fetchwait 20s on normal pages;challenge.strategyis reported again (#35) - More robust per-origin session lock (token, heartbeat, stale detection, waiting) (#35)
ip-addressupdated,npm auditreports 0 vulnerabilities (#35)
Upgrade notes
- Node.js 20.19+ or 22.12+ is now required.
- SearXNG needs
jsoninsearch.formats(see the README section "SearXNG configuration (required)"). - Camofox image:
ghcr.io/jo-inc/camofox-browser:1.18.1(recommended flags indocker/setup.md). - Persistent CloakBrowser profiles now live in
~/.browser-search/cloak-sessions/profiles/: saved sessions start fresh after updating.
How to update
npx skills update # or: git pull cd <skill dir> # e.g. ~/.config/opencode/skills/browser-search npm install node -e "import('cloakbrowser').then(c=>c.ensureBinary())" bash scripts/check.shPull request: #34 — closes #26, #27, #28, #29, #30, #31, #32, #33, #35.
- HTTP status and
- v3.1.1v3.1.1 — Fix CloakBrowser setup after npx skills add2026-09-02 · 2026-09-02 17:33 UTC
查看更新说明
v3.1.1 — Fix CloakBrowser setup after
npx skills addHow to update an existing installation
npx skills updaterefreshes the skill files only (SKILL.md, scripts). The npm dependencies are updated separately withnpm install, from the directory where the skill (or repo) is installed.Common cases:
-
Installed via
npx skills add— update skill files, then deps + binary:npx skills update cd ~/.config/opencode/skills/browser-search # your skill dir (.agents/skills/browser-search if project-local) npm install node -e "import('cloakbrowser').then(c=>c.ensureBinary())" -
Cloned the repository — pull the new code, then refresh deps:
cd browser-search git pull npm install node -e "import('cloakbrowser').then(c=>c.ensureBinary())" -
Docker services (SearXNG, Camofox) — pull the updated image and recreate the container; the exact command depends on your setup.
Verify with
bash scripts/check.sh. If in doubt, show this release note to your AI agent — it will adapt the steps to your installation.
Fix: CloakBrowser
ERR_MODULE_NOT_FOUNDafternpx skills addnpx skills addcopies the skill files but does not runnpm install. Withoutcloakbrowserinstalled,smart-extract(--fallback/full-autoescalation) andcloak-fetch.mjs/cloak-script.mjsfailed at import time with a genericCannot find package 'cloakbrowser'/nessun output JSON valido.Fixed:
scripts/smart-extract.mjs— detects missingcloakbrowserand returns an actionable hint instead of a generic error:cloakbrowser not installed — run 'npm install' in skill dir (...) then 'node -e "import(\'cloakbrowser\').then(c=>c.ensureBinary())"' and verify with 'bash scripts/check.sh'scripts/cloak/cloak-fetch.mjs/scripts/cloak/cloak-script.mjs— dynamic import with the same hint andcode: CLOAK_NOT_INSTALLED(previously uncaughtERR_MODULE_NOT_FOUNDstack).
Docs:
README.md— Step 1 now documents the required post-installnpm install+ensureBinary+check.shafternpx skills add; Services overview clarifies CloakBrowser requiresnpm installin skill dir.SKILL.md— CloakBrowser row and Technical reference now state the prerequisite.FAQ.md— new troubleshooting entry forERR_MODULE_NOT_FOUND: Cannot find package 'cloakbrowser'.
Fix:
scripts/check.sh— on Windows the Chromium binary check now matcheschrome.exe/chromium.exe(previously onlychrome/chromium), so~/.cloakbrowser/chromium-.../chrome.exeis correctly detected.
No breaking changes. SearXNG/Camofox (Docker) unaffected — only the CloakBrowser fallback path is affected when
cloakbrowserwas not installed.
v3.1.0 — Dependency updates: CloakBrowser 0.5.5, Playwright Core 1.62.1
The skill's npm dependencies are updated to the latest CloakBrowser and Playwright Core releases, with cross-platform compatibility (Linux, Windows, macOS) and better error diagnosis.
Dependencies
cloakbrowser^0.4.12→^0.5.5— adds Linux arm64 binary support (Raspberry Pi) and Windows fixes.playwright-core1.60.0→1.62.1.- Added
mmdb-libandsocks-proxy-agent(optional peer deps of CloakBrowser 0.5.x, required for--geoipand SOCKS proxies). npm audit: 0 vulnerabilities.
Fixes
scripts/check.sh—cloak_version()no longer relies onrequire('cloakbrowser/package.json'), which CloakBrowser 0.5.x no longer exports (ERR_PACKAGE_PATH_NOT_EXPORTED). It now reads the version from disk.cloak-fetch.mjs/cloak-script.mjs— catchCloakBrowserLicenseError(session limit / license) and exit with code2and alicense: trueflag instead of a generic error.
Documentation
Version note in README + 12 i18n translations, covering Linux arm64 support and the known Windows + Pro license issue (cloakhq/cloakbrowser#479, wor
-
- v3.1.0v3.1.0 — Dependency updates: CloakBrowser 0.5.5, Playwright Core 1.62.12026-08-07 · 2026-08-07 08:49 UTC
查看更新说明
How to update an existing installation
npx skills updaterefreshes the skill files only (SKILL.md, scripts). The npm dependencies are updated separately withnpm install, from the directory where the skill (or repo) is installed.Common cases:
-
Installed via
npx skills add— update skill files, then deps:npx skills update cd ~/.config/opencode/skills/browser-search # your skill dir npm install -
Cloned the repository — pull the new code, then refresh deps:
cd browser-search git pull npm install -
Docker services (SearXNG, Camofox) — pull the updated image and recreate the container; the exact command depends on your setup.
Verify with
bash scripts/check.sh. If in doubt, show this release note to your AI agent — it will adapt the steps to your installation.
Dependency updates: CloakBrowser 0.5.5, Playwright Core 1.62.1
The skill's npm dependencies are updated to the latest CloakBrowser and Playwright Core releases, with cross-platform compatibility (Linux, Windows, macOS) and better error diagnosis.
Dependencies
cloakbrowser^0.4.12→^0.5.5— adds Linux arm64 binary support (Raspberry Pi) and Windows fixes.playwright-core1.60.0→1.62.1.- Added
mmdb-libandsocks-proxy-agent(optional peer deps of CloakBrowser 0.5.x, required for--geoipand SOCKS proxies). npm audit: 0 vulnerabilities.
Fixes
scripts/check.sh—cloak_version()no longer relies onrequire('cloakbrowser/package.json'), which CloakBrowser 0.5.x no longer exports (ERR_PACKAGE_PATH_NOT_EXPORTED). It now reads the version from disk.cloak-fetch.mjs/cloak-script.mjs— catchCloakBrowserLicenseError(session limit / license) and exit with code2and alicense: trueflag instead of a generic error.
Documentation
Version note in README + 12 i18n translations, covering Linux arm64 support and the known Windows + Pro license issue (cloakhq/cloakbrowser#479, workaround
--license-through-proxy).All skill features were re-tested with the new versions (SearXNG search, smart-extract, cloak-fetch, cloak-script, camofox tabs, check.sh).
See pull request #24 and issue #23.
v3.0.3 — SearXNG multi-query mode with rate limiting
When the agent needs several searches, it now groups them into a single command instead of launching rapid-fire separate queries that could look like bot traffic to the search engines.
exec node <skill_dir>/scripts/searxng/searxng.mjs search \ --query "<q1>" --time-range month \ --query "<q2>" --lang it \ --query "<q3>"- Each query can carry its own flags (
--lang,--categories,--time-range,--engines,--page). - Queries run in series with a 3s gap between them (configurable via
SEARXNG_QUERY_DELAYenv var,0disables it). - Legacy format
search "<query>" [flags]is unchanged (backward compatible). - Mixing a positional query with
--querygroups fails with a clear message. - Output: 1 query → previous schema; n queries →
{ ok, searches: [...] }. - SKILL.md documents the multi-query example and the rate-limit note; the env var is documented in
data/advanced-browsing-reference.md.
See pull request #22 and issue #21.
v3.0.2 — Rendered-text fallback in smart-extract
On JS-only or slow-rendering pages, the exploratory extraction could return only a partial shell, flagged as too short below the
--min-charsthreshold.smart-extract.mjsnow has a deterministic fallback: when both Camofox Readability and Snapshot come up too short, it re-opens the page with--waitand reads the rendered text viadocument.body.innerText. The threshold still applies to the result, so genuinely empty pages keep failing.Generic (works on any page), deterministic (no agent judgment needed), and zero overhead in the happy path.
See pull request #20 and issue #19.
v3.0.1 — SearXNG auto-recovery
When the SearXNG container is down, `searxng.mjs
-
- v3.0.32026-07-31 · 2026-07-31 17:57 UTC
查看更新说明
v3.0.3 — SearXNG multi-query mode with rate limiting
When the agent needs several searches, it now groups them into a single command instead of launching rapid-fire separate queries that could look like bot traffic to the search engines.
exec node <skill_dir>/scripts/searxng/searxng.mjs search \ --query "<q1>" --time-range month \ --query "<q2>" --lang it \ --query "<q3>"- Each query can carry its own flags (
--lang,--categories,--time-range,--engines,--page). - Queries run in series with a 3s gap between them (configurable via
SEARXNG_QUERY_DELAYenv var,0disables it). - Legacy format
search "<query>" [flags]is unchanged (backward compatible). - Mixing a positional query with
--querygroups fails with a clear message. - Output: 1 query → previous schema; n queries →
{ ok, searches: [...] }. - SKILL.md documents the multi-query example and the rate-limit note; the env var is documented in
data/advanced-browsing-reference.md.
See pull request #22 and issue #21.
v3.0.2 — Rendered-text fallback in smart-extract
On JS-only or slow-rendering pages, the exploratory extraction could return only a partial shell, flagged as too short below the
--min-charsthreshold.smart-extract.mjsnow has a deterministic fallback: when both Camofox Readability and Snapshot come up too short, it re-opens the page with--waitand reads the rendered text viadocument.body.innerText. The threshold still applies to the result, so genuinely empty pages keep failing.Generic (works on any page), deterministic (no agent judgment needed), and zero overhead in the happy path.
See pull request #20 and issue #19.
v3.0.1 — SearXNG auto-recovery
When the SearXNG container is down,
searxng.mjs searchnow recovers automatically: it finds the container exposing port 8080, restarts it, waits for it to come back up, and retries the search once. No manual intervention, no fixed container name — works on any installation. Fails safe with the previous error message if no container is found.See pull request #18 and issue #17.
Data freshness rule
The skill now has a Freshness rule in its Core rules: for time-sensitive questions (benchmarks, prices, news, releases, versions), the agent searches for updated sources aligned with the topic, using the
--time-rangeflag in SearXNG to prefer recent results.
v3.0.0 — smart-extract automatic orchestration
What's new
Automatic content extraction
The agent no longer has to choose between Camofox and Cloak:
smart-extract.mjshandles the decision automatically. Pass one or more URLs, and the script tries Camofox first, escaping to Cloak only when needed.Skill easier to read at zero context
Each tool now has an explicit goal. The old Camofox and Cloak sections have been consolidated into a quick reference with a link to a separate reference guide. The agent understands what to use and when at a glance.
Built-in feedback loop
After extracting content, the skill guides the agent to evaluate whether the data is enough; if not, it loops back to SearXNG with refined queries.
Separate advanced reference
Screenshots, interactive tabs, proxy, session management — anything not needed in daily research is documented in
data/advanced-browsing-reference.md, loaded only when needed.Reliable expression results
JS expressions returning objects or DOM elements are automatically converted to JSON or text — no more
[object Object]in the output.Automatic quality checks
If the extracted content is too short or empty, the script reports it immediately instead of passing it through as valid.
Technical details
For the full list of changes and tests, see pull request #16.
- Each query can carry its own flags (
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
browser-search
A skill for AI agents. OpenCode, Claude Code, Cursor, OpenClaw and beyond. Search the web with SearXNG, browse with Camofox, bypass protections with CloakBrowser. Anti-hallucination by design. All self-hosted, free, unlimited.
Why it exists
Today an AI agent browsing the web is like a thief in a balaclava sneaking around a police academy. The site protections block it, challenge it, reject it.
👮 browser-search flips the situation: your agent stops being the thief and becomes the chief of police. No more clumsy access attempts. It walks through every door because it has the right tools. SearXNG to search, Camofox to browse, CloakBrowser when the site plays hardball.
The skill enforces the exclusive use of deterministic scripts. This eliminates model hallucinations, even with the cheapest models. The 3 tools are described in natural language, but execution is rigid: the model can neither get the command wrong nor misinterpret the output. The result is guaranteed success on every query — the skill and its deterministic scripts guide the model to scour the web until it finds the answer.
- SearXNG — metasearch engine for the search phase (multi-source, JSON)
- Camofox — browser navigable via REST API for standard sites
- CloakBrowser — stealth browser for anti-bot protected sites
The typical flow: the agent first searches with SearXNG, then browses the results with Camofox (or CloakBrowser if the site is protected).
Benefits
-
100% free, self-hosted, unlimited. No API keys to buy, no subscriptions, no rate limits. Everything runs on your machine, Docker and npm. Unlimited usage, zero cost.
-
Lightweight, runs anywhere. Built and tested on a Raspberry Pi — if it runs there, it runs everywhere. Minimal resource consumption, no heavy infrastructure needed, runs 24/7 on low-power hardware.
-
Search + browse in one kit. No manual integration needed. Searching and browsing are two distinct phases, both covered.
-
Automatic navigation escalation. If Camofox gets blocked by Cloudflare/Akamai, the agent automatically switches to CloakBrowser.
-
Smart performance. SearXNG for the search phase (milliseconds). Camofox and CloakBrowser are only used to browse the sites that actually need it.
-
Automatic agent choice. The AI agent decides which tool to use: SearXNG for initial search, Camofox for browsing, CloakBrowser if the site is protected. Zero human intervention.
-
Anti-hallucination by design. The skill's Deep Research mode enforces a "search first, answer second" workflow: the agent must verify every factual claim against live web sources, cross-reference multiple angles, and never guess. No more made-up answers.
-
Fully customizable. The SKILL.md is plain text. You can edit the core rules, add your own, remove what you don't need. Adapt it to your workflow, your team, your standards.
-
Native stealth. CloakBrowser automatically detects Cloudflare, Akamai, DataDome, Imperva, PerimeterX, and DDoS-Guard challenges, and waits for them to resolve before extracting content.
-
Works with any agent. The SKILL.md is written for OpenCode, but the logic is identical for any AI agent. Same README, same package.json, everything works everywhere. Just ask your agent how to convert the skill for its environment.
Why it's different
Most web tools for AI agents stop where the wall starts: when a site throws a Cloudflare or Akamai challenge, they hand back an error and the agent gives up. browser-search is built to walk through instead.
- Search → browse → bypass in one skill. No manual integration, no per-query costs, no API keys to buy.
- Three-tier escalation. SearXNG for milliseconds-fast search, Camofox for the ~90% of standard sites, CloakBrowser when the site plays hardball — automatically, with zero human intervention.
- Proven anti-bot results. CloakBrowser applies 58 C++ source-level
patches and scores 0.9 on reCAPTCHA v3 (human-level, server-verified),
clearing Cloudflare, Turnstile, DataDome, Akamai, Imperva, PerimeterX
and DDoS-Guard — where other tools just return
blocked_by_challenge. - Free, private, self-hosted. SearXNG, Camofox and CloakBrowser all run on your machine. Zero cost, unlimited, nothing metered.
Where other tools give up, browser-search keeps going.
🏆 State of the art
These three tools were chosen because they represent the current state of the art available today. A skill like this is designed to evolve: when better tools emerge, updating the SKILL.md is all it takes to swap them in. 🔄
⭐ Star the repo and follow to stay up to date on new tools, flow improvements, and orchestration updates over time. 🚀
Architecture
┌─────────────────────────────────────────────────────────┐
│ browser-search │
│ │
│ ┌──────────────┐ │
│ │ Search │ │
│ │ │ │
│ │ SearXNG │ search engines → URLs │
│ │ (Docker) │ JSON results, fast │
│ │ :8080 │ │
│ └──────────────┘ │
│ │ │
│ │ results ready → to browse │
│ ↓ │
│ ┌─────────────────────────────────────┐ │
│ │ Browsing │ │
│ │ │ │
│ │ ┌──────────────┐ │ │
│ │ │ Camofox │ browser + REST │ │
│ │ │ (Docker) │ JS, click, eval │ │
│ │ │ :9377 │ │ │
│ │ └──────┬───────┘ │ │
│ │ │ │ │
│ │ │ if blocked │ │
│ │ ↓ │ │
│ │ ┌──────────────┐ │ │
│ │ │ CloakBrowser │ stealth Chromium │ │
│ │ │ (npm) │ anti-bot, proxy │ │
│ │ └──────────────┘ │ │
│ └─────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
How it works
Phase 1 — Search with SearXNG
Docker container on localhost:8080. Metasearch engine that queries
Google, Wikipedia, Bing, DuckDuckGo and many others simultaneously.
JSON output with titles, snippets, and URLs.
Example:
node scripts/searxng/searxng.mjs search "largest llm benchmark 2026"
The agent now has a list of URLs to visit and autonomously decides whether to browse them with Camofox or CloakBrowser based on the site.
Phase 2 — Browse with Camofox
Docker container on localhost:9377. Exposes a full Firefox browser
through a REST API. The agent can create tabs, navigate, click,
scroll, execute arbitrary JavaScript, and structure data.
Includes: Mozilla's Readability.js for extracting clean articles, removing nav, sidebar, and ads (~70% token savings).
Main commands:
# Single-URL extraction (Readability.js, auto-fallback to snapshot)
node scripts/camofox/camofox.mjs readability "https://example.com"
# JavaScript evaluation
node scripts/camofox/camofox.mjs evaluate "https://example.com" "document.title"
# Accessibility snapshot
node scripts/camofox/camofox.mjs snapshot "https://example.com"
Phase 3 — Browse with CloakBrowser (when Camofox isn't enough)
npm package based on Playwright + cloakbrowser. Launches a Chromium
browser with advanced fingerprinting to bypass Cloudflare, Akamai,
DataDome and other anti-bot systems. Automatic challenge detection
with wait and retry.
Available scripts:
cloak-fetch.mjs— universal fetch with challenge detectioncloak-script.mjs— custom Playwright script execution
Example:
node scripts/cloak/cloak-fetch.mjs "https://protected-site.com"
node scripts/cloak/cloak-fetch.mjs "https://protected-site.com" --proxy socks5://... --geoip
# Markdown output (requires: pip install markitdown)
node scripts/cloak/cloak-fetch.mjs "https://example.com" --format markdown
Version note: browser-search pins CloakBrowser
^0.6.3and Playwright Core1.64.1. CloakBrowser 0.6 requires Node.js 20.19+ or 22.12+. The skill uses the free CloakBrowser binary (Chromium 146; 145 on macOS), which needs no license key; the wrapper updates (Linux arm64 support, safer binary download, stable fingerprint per persistent profile, more reliable humanized actions) apply to it too. A free key (GitHub sign-in viacloakbrowser login) unlocks the newest binary with one concurrent session; the skill neither uses nor requires it.
Why both Camofox and CloakBrowser?
Because speed and stealth are a tradeoff, and the right tool depends on the site.
Camofox — fast, structured, persistent. Camofox wraps Camoufox (a C++-level Firefox fork) in a REST API with an always-warm browser. After a ~1-3s cold start, every request is near-instant. Its accessibility snapshots are ~90% smaller than raw HTML, with stable element refs (e1, e2, ...) for reliable interaction. It handles the ~90% of sites that don't use advanced anti-bot protection: articles, docs, search engines, standard web pages.
CloakBrowser — stealth, anti-bot, on-demand. CloakBrowser launches a fresh Chromium instance per request (~1-3s startup each time). It uses advanced fingerprinting, proxy support, geoip, and automatic challenge detection to bypass Cloudflare, Akamai, DataDome, Imperva, PerimeterX, and DDoS-Guard. It is the last resort for the ~10% of sites that block Camofox.
Real-world numbers:
| Tool | Cloudflare standard | Cloudflare Turnstile | DataDome |
|---|---|---|---|
| Camoufox (Camofox engine) | up to ~92% [¹] | ~65-78% [¹] | 60-75% [¹] |
| Playwright Stealth | ~70-80% [¹] | ~40-55% [¹] | ~30-50% [¹] |
- CloakBrowser applies 58 C++ source-level patches and scores 0.9 reCAPTCHA v3 (human-level, server-verified), passing all major anti-bot tests including Cloudflare Turnstile and FingerprintJS [²]
- Camofox cold start: ~1-3s (one-time, then ~0ms per request via warm REST API) [³]
- Playwright/Chromium cold start: ~0.5-6s (every launch, varies by environment) [⁴]
Camofox handles the fast path. CloakBrowser handles the edge cases. Together they cover the entire web with no gaps. The agent decides which to use.
Sources
¹ "Camoufox Vs Playwright Stealth: Complete Comparison & Alternatives (2026)" — blog.send.win ² CloakBrowser README — github.com/cloakhq/cloakbrowser ³ camoufox-pi README (cold start comparison) — github.com/MonsieurBarti/camoufox-pi ⁴ Playwright issue #4345 (launch time variability) — github.com/microsoft/playwright/issues/4345
Installation
Step 1 — Install the skill
Install the skill definition into your AI agent with a single command:
npx skills add Johell1NS/browser-search
This works with 70+ AI agents including OpenCode, Claude Code, Cursor, GitHub Copilot, and more.
Required after
npx skills add: CloakBrowser is an npm dependency (cloakbrowser+playwright-core). Theskillsinstaller copies files but does not runnpm installautomatically. You must install it manually inside the skill directory:# Find your skill directory (OpenCode example): # ~/.config/opencode/skills/browser-search # or .agents/skills/browser-search (project-local) cd ~/.config/opencode/skills/browser-search npm install node -e "import('cloakbrowser').then(c => c.ensureBinary())" # Verify everything: bash scripts/check.shWithout this step, SearXNG and Camofox (Docker) will work, but
smart-extract→ CloakBrowser (--fallback/full-autoescalation) will fail withERR_MODULE_NOT_FOUND: Cannot find package 'cloakbrowser'— runbash scripts/check.sh(seecloakbrowser not installed) orFAQ.md→ Troubleshooting.
Step 2 — Set up the infrastructure (alternative: manual clone)
If you prefer to work from a git clone instead of npx skills add:
git clone https://github.com/Johell1NS/browser-search
cd browser-search
npm install
node -e "import('cloakbrowser').then(c => c.ensureBinary())"
CloakBrowser is installed by npm (requires npm install + binary download via ensureBinary). SearXNG and Camofox require separate Docker containers — make sure they are running before using the skill.
Show this README to your AI agent for a complete installation tailored to your environment and platform.
browser-search does not provide platform-specific docker-compose files or install scripts. Your AI agent reads the references below and adapts the setup to your OS, architecture, and environment automatically.
Services overview:
| Service | How | Reference |
|---|---|---|
| SearXNG | Docker, :8080 | docs.searxng.org |
| Camofox | Docker, :9377 | github.com/jo-inc/camofox-browser |
| CloakBrowser | npm (requires npm install in skill dir + ensureBinary) | scripts/cloak/cloak-fetch.mjs + scripts/setup.sh / scripts/check.sh |
SearXNG configuration (required)
The default SearXNG install has JSON output disabled, and the skill needs it: without it the script fails with HTTP 403. In SearXNG's settings.yml (the core-config folder in the official Docker setup) use:
use_default_settings: true
server:
secret_key: "<random>" # or set SEARXNG_SECRET
limiter: false # local instance: the limiter would block the script's JSON requests
search:
formats: [html, json]
use_default_settings: truekeeps engines and defaults aligned with upstream on every update. To switch on extra engines, add entries such asengines:→- name: bingwithdisabled: false.- Keep it local: bind SearXNG to
127.0.0.1(SEARXNG_HOST=127.0.0.1in.env). - Valkey/Redis is not needed by the skill (SearXNG uses it only for the limiter, which stays off).
- If SearXNG is not at
http://127.0.0.1:8080, setSEARXNG_URL.
For the AI agent — read these files:
| File | What it contains |
|---|---|
SKILL.md | Complete skill: commands, escalation, troubleshooting |
scripts/cloak/cloak-fetch.mjs | CloakBrowser CLI usage and all options |
scripts/setup.sh | System dependencies |
scripts/check.sh | Post-installation verification |
docker/setup.md | Docker setup tips |
Note: SKILL.md is written for OpenCode syntax (exec, node scripts).
If your agent uses a different format (Claude Code, Cursor, etc.), read it
and convert the commands to your agent's syntax before using the skill.
Environment variables
| Variable | Required for | Default |
|---|---|---|
CAMOFOX_API_KEY | evaluate, session, cleanup in Camofox | — |
CAMOFOX_ADMIN_KEY | Camofox stop endpoint | — |
What this skill does NOT do
- Social media. Instagram, Facebook, TikTok, LinkedIn, and Twitter/X
require login.
browser-searchdoes not attempt to browse them. - Download files. It is read-only (except for explicit screenshots).
- Bypass paywalls. Does not circumvent payment or login systems.
Security
browser-search includes multiple layers of security hardening:
Built-in protections
- SSRF prevention. URLs are validated before navigation — internal IPs (
127.x,10.x,192.168.x,169.254.x), cloud metadata endpoints, and.internal/.localTLDs are blocked. DNS resolution is also checked to prevent DNS rebinding attacks. - Script sandbox. Custom scripts (
cloak-script.mjs) run in a sandbox that restricts the Playwright API surface (only whitelisted methods onpage,browser,contextare accessible). Note: Node.js APIs remain available — for full isolation, avm.Contextwould be required. Use--unsafeto bypass the sandbox and SSRF protection. - Path traversal protection.
--scriptpaths must be within the skill directory. Absolute paths and../traversal are blocked. - Rate limiting. 30 requests/minute by default to prevent accidental DoS or anti-bot triggers (use
--no-rate-limitto disable). - Secure filenames. Screenshots use random UUIDs instead of predictable timestamps.
- Stack trace suppression. Error output omits stack traces by default. Use
--verbosefor debugging.
Best practices
- API keys. Use environment variables (
$CAMOFOX_API_KEY) or--env-filefor Docker. Never paste keys on the command line — they appear inps auxand shell history. - Docker binding. Always use
127.0.0.1:prefix for port mapping (-p 127.0.0.1:9377:9377). Never expose to0.0.0.0. - URL encoding. Deterministic scripts handle encoding internally. No manual escaping needed.
- Version pinning. Dependencies use exact versions (no
^caret ranges) andpackage-lock.jsonfor reproducible builds.
Audit
Run bash scripts/audit.sh to verify the security posture of your installation.
Residual risks
- Prompt injection. An AI agent can be tricked into performing harmful actions. The tooling mitigates damage but cannot prevent a fully compromised agent.
- Supply chain. CloakBrowser downloads a Chromium binary from
cloakbrowser.dev. The binary is SHA-256 verified but proprietary. - Browser automation. Any tool with browser access has inherent risks. Run in isolated environments when possible.
Get involved
browser-search is open source and free. If you find it useful:
- ⭐ Star the repo — helps others discover it
- 🐛 Open an issue — report bugs or suggest features
- 🔀 Submit a PR — fix, improve, extend
- 💬 Share it — with your team, on Reddit, Twitter, Discord
- 🧠 Adapt it — fork it, tweak the SKILL.md, make it yours
Every contribution, no matter how small, makes this better.
FAQ
See FAQ.md for frequently asked questions about installation, architecture, design decisions, and common issues.
License
MIT