老 CPU 或 NAS 需改用 :1.10.1-baseline 镜像;部分挑战需特定浏览器模式、不同出口 IP 或外部服务,hCaptcha 内置支持不含图片九宫格;2Captcha 回退需自备 key 且默认关闭,MCP 与 API 应只放在可信网络。
trawl
germondaiAGPL-3.0活跃维护自托管的网页抓取引擎,能绕过 Cloudflare、Turnstile、reCAPTCHA、hCaptcha、GeeTest 等 JS 挑战和验证码,可作为 FlareSolverr、Byparr 的替代品接入 *arr 套件。
Self-hosted scraping engine — bypasses any JS challenge & captcha: Cloudflare, Turnstile, reCAPTCHA, hCaptcha, GeeTest. FlareSolverr & Byparr alternative and drop-in replacement for your *arr stack.
docker run -d --name trawl -p 127.0.0.1:8191:8191 --shm-size=1gb -e SESSION_CACHE_DRIVER=memory -e BROWSER_POOL_SIZE=1 -e MCP_ENABLED=true -e METRICS_DASHBOARD_ENABLED=true -v trawl_metrics:/data/metrics ghcr.io/germondai/trawl:1.10.1
curl http://localhost:8191/healthREADME 未说明具体显存或 CPU 要求;官方提供 :1.10.1-baseline 镜像供老 CPU 或 NAS 硬件使用,启动示例要求 --shm-size=1gb。
自托管抓取引擎,自动过 Cloudflare 等 JS 挑战与验证码,可替代 FlareSolverr
自托管的网页抓取引擎,能绕过 Cloudflare、Turnstile、reCAPTCHA、hCaptcha、GeeTest 等 JS 挑战和验证码,可作为 FlareSolverr、Byparr 的替代品接入 *arr 套件。
核心能力
- 先走 HTTP,复用已验证 clearance,必要时才启动 Camoufox 浏览器
- 支持 Cloudflare、Turnstile、reCAPTCHA v2、hCaptcha、GeeTest 等挑战
- 提供 /scrape 原生 API 与 FlareSolverr 兼容的 /v1 端点
- 内置 MCP 服务,供 AI 客户端读取 Markdown、截图与结构化提取
- 隔离浏览器会话保留 cookie 与 storage,并带本地请求历史面板
容易踩的坑
- v1.11.0最新正式版2026-11-09 · 2026-11-09 10:03 UTC
Highlights
- Native HTTP proof of work: supported NCBI and Anubis GET challenges can complete before browser escalation. Hashing runs in a cancellable worker with one search thread and a one-second budget within the request deadline; unsupported or rejected attempts keep browser fallback.
- Opt-in POST clearance reuse: set
httpReplay: trueto reuse browser-verified Cloudflare or Anubis clearance over HTTP. Accepted or ambiguous POST submissions are not resent during recovery. - Prowlarr proxy pings fixed: successful pings no longer require cookies when
FLARESOLVERR_COOKIE_FALLBACK=true; protected indexers retain the cookie handoff checks.
Major changes
- 8080501: add bounded native NCBI/Anubis proof-of-work solving, cookie scoping and protocol checks (#272).
- a3052c3: add safe, opt-in HTTP clearance replay for POST requests (#268, #274).
- a921f12: preserve cookie-free Prowlarr ping checks (#273, #275).
- cde7abc: refresh compatible workspace and cryptographic dependencies; build native PoW with Rust 1.99.1 and retain the validated browser/runtime combination.
No configuration or data migration is required. Recreate the container with the updated image and keep existing data volumes. The client workspace remains at 0.1.0; this release does not publish it to npm.
Thanks to @yuxi-liu-wired for the native PoW contribution, @TheBeastLT for POST clearance replay and @Feredzhanov for the Prowlarr ping report.
Full changelog: https://github.com/germondai/trawl/compare/v1.10.1...v1.11.0
- v1.10.12026-11-06 · 2026-11-06 17:11 UTC
查看更新说明
Highlights
- Non-root Docker startup fixed: standard and baseline images no longer retain build-time browser caches that prevented startup under another UID.
- Charset-aware HTML: the HTTP tier respects declared encodings, including Windows-1251.
- Optional Prowlarr cookie handoff: set
FLARESOLVERR_COOKIE_FALLBACK=trueto try one browser tier when a successful stateless/v1GET returns no usable cookies. It remains off by default and respects the original request deadline. - GeoIP build validation: accept current snapshots and check the bundled database with its MaxMind reader.
Major changes
- 25032bc: isolate build-time browser caches and test readiness as UID 1000 (#265, #269).
- 0dd8e40: validate bundled GeoIP snapshots (#269).
- e9a6144: decode HTTP-tier HTML using the declared charset (#266).
- f907a6a: add opt-in FlareSolverr cookie fallback (#267, #270).
- 22fdc83: refresh Elysia 1.4.31, node-forge 1.4.3, Turndown 7.2.5, Biome 2.6.6 and tsdown 0.23.7; retain the validated browser/runtime pairing.
No configuration changes are required. Recreate the container with the updated image and keep existing data volumes. The client workspace remains at 0.1.0; this release does not publish it to npm.
Thanks to @TheBeastLT for the charset fix, @poulpor for the non-root startup report and @Feredzhanov for the cookie-handoff report.
Full changelog: https://github.com/germondai/trawl/compare/v1.10.0...v1.10.1
- v1.10.02026-11-03 · 2026-11-03 23:07 UTC
查看更新说明
Highlights
- Safer MCP connections: validate and pin public destination IPs for HTTP and browser traffic, including upstream proxies. Isolate MCP clearance caching and require public-only named sessions.
- Browser certificate revocations: import bundled OneCRL data at startup and include the six eMudhra intermediate revocations in standard and baseline images.
- Offline WAF diagnostics: identify providers through wafmeow by default and expose metadata in results, logs, metrics and the dashboard. Solver routing is unchanged.
- Optional cold boot: launch browsers on demand and combine it with idle retirement for occasional use. Warm startup remains the default.
- Native content endpoints: use
/readand/extractdirectly over HTTP. The typed client workspace supports Node.js, Bun, Deno and browsers; npm publication remains a separate step.
Major changes
- 17cdb33: pin MCP connections, separate clearance caching and restrict named sessions (#263).
- 587a590: backport browser certificate revocations and verify their effective state during image builds (#263).
- ab8a987, 7e49f24: add offline provider detection and diagnostic metrics (#258, #262).
- 0003c35, 5d17167: add opt-in browser cold boot and coordinate pool startup (#256, #257).
- 994394f, 0e9096c: expose native content endpoints and add the portable client workspace (#260).
- 8d99f36: preserve browser fallback when HTTP response headers stall (#259, #261).
- 2b87ee6: distinguish generated MITM failures from origin page responses (#254, #255).
- cb902ca: refresh compatible dependencies, including node-forge 1.4.2, Nuxt 4.6.4, LinkeDOM, web modules and client tooling. Align web/docs builds and CI on Node.js 26.13.0, build the WAF worker with Go 1.27.3, and update Redis to 8.10.3. Keep the compatible Camoufox/Playwright and uBlock Origin versions.
MCP upgrade: recreate sessions used by MCP with
publicOnly: true. MCP now uses its own clearance cache. Upstream HTTP(S) proxies must support literal-IP CONNECT, including to port 80; TRAWL's intercepting MITM listener cannot serve as their upstream. See the migration guide. Native API,/v1and ordinary MITM access retain their trusted-operator behavior.Thanks to @StLyn4 for cold boot, @IkariDevGIT for suggesting wafmeow, @Leardian for the security report, and @Project516 for the report and certificate-revocation backport.
Full changelog: https://github.com/germondai/trawl/compare/v1.9.3...v1.10.0
- v1.9.32026-10-24 · 2026-10-24 14:23 UTC
查看更新说明
Highlights
- Readable UTF-8 fragments: preserve charset-less HTML across the native API, FlareSolverr API, MCP and proxy, while keeping JavaScript-rendered content and solved challenges intact.
- Safer Cloudflare interaction: stop pending click and keyboard fallbacks after an interstitial clears.
- Patched runtimes: Bun 1.4.4 and Node.js build tooling 26.12.1 include the upstream Brotli security fixes.
- Compatible dependency updates, Nginx 1.31.8 for web/docs, and the TRAWL logo favicon.
Major changes
- c10eaab preserves UTF-8 fragments without replacing rendered results with stale source (#251, #252).
- 80a6f72 retains adjacent fragment text in MCP outputs; 675c393 stops delayed Cloudflare clicks after clearance.
- 8ec4e7d updates Bun to 1.4.4; 94aa3a4 updates Node.js build tooling to 26.12.1.
- 0098977 updates web/docs favicons. 5fa105f refreshes compatible workspace and transitive dependencies, Docker images and versioned examples.
Thanks to @everpcpc and @Project516 for their contributions.
Full changelog: https://github.com/germondai/trawl/compare/v1.9.2...v1.9.3
- v1.9.22026-10-20 · 2026-10-20 18:23 UTC
查看更新说明
Highlights
- Prometheus metrics: monitor main browser pool utilization, waiting requests and checkout counters through
GET /metrics. - Opt-in graceful shutdown: let accepted HTTP requests finish before sessions and browsers close. The default remains immediate shutdown.
- Short document support: use
allowShortContentin native scraping for browser documents under 100 characters, while retaining challenge and network-error checks. - MHTML compatibility: export folded archive headers that work with readers expecting Blink-style boundaries.
Major changes
- bf0b439 fixes MHTML Content-Type header folding (#243).
- 1aa41ed adds
allowShortContent; c38f449 retains rejection of short error pages (#246, #247). - 5a9d9bf adds Prometheus pool metrics; cea549c excludes failed checkout waits and 81d8237 exports cumulative wait in seconds (#244, #248).
- 75790ef adds shutdown draining; c4af8ba coordinates HTTP, named sessions and browser signal handling within one drain window (#245, #249).
- b4d96b4 forwards the drain setting in all Compose variants; 6707315 refreshes compatible build dependencies and prepares v1.9.2.
Thanks to @emandel2630 for the contributions.
Full changelog: https://github.com/germondai/trawl/compare/v1.9.1...v1.9.2
- Prometheus metrics: monitor main browser pool utilization, waiting requests and checkout counters through
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
Self-hosted web scraping for applications and AI agents. Get page content through an API or MCP, with built-in handling for supported browser challenges and CAPTCHAs.
TRAWL starts with HTTP, reuses verified clearance and opens Camoufox when a browser is needed. Repeat requests fetch fresh content without repeating a full solve whenever the site accepts the saved session.
Website · Documentation · Latest release
Features
- Challenge handling: Cloudflare, Anubis, NCBI proof of work, Akamai, Imperva, DDoS-Guard and supported AWS WAF and DataDome flows. Built-in CAPTCHA paths include Turnstile, reCAPTCHA v2, hCaptcha, GeeTest Slide, ALTCHA, Friendly Captcha and CAP. Coverage and limits.
- Fast repeat requests: automatic HTTP clearance reuse, Redis or in-memory caching, and browser fallback when required. No named session is needed for shared clearance reuse.
- MCP for agents: read Markdown, scrape HTML, extract structured JSON, capture screenshots and inspect browser activity from known URLs.
- Isolated browser sessions: retain cookies, localStorage, sessionStorage and browser identity. Scrape within a session, keep a page open for JavaScript eval and read cookies. Session API.
- API and forward proxy: use
/scrape, the FlareSolverr-compatible/v1endpoint, or a challenge-aware HTTP/HTTPS proxy with WebSockets and Range support. - Local dashboard: persistent request history, tier outcomes, failure causes and live updates.
- Local solving by default: optional 2Captcha fallback and opt-in Firefox TLS/HTTP2 impersonation; Bun fetch remains the default HTTP transport.
Sponsors
Performance
Selected same-machine comparisons show faster first and repeat responses than FlareSolverr and Byparr on the default Cloudflare workload:
| Protected page | Best first | Best repeat |
|---|---|---|
| NopeCHA Cloudflare demo | 6.0 s | 879 ms |
| 1337x | 3.8 s | 85 ms |
| EZTV | 4.6 s | 473 ms |
Measured 2026-10-17 on a development build after v1.8.0. These are verified minima from the recorded sample. First requests used a warm browser with an empty target cache; repeats are fresh fetches with reusable clearance. Results vary by site, IP and session state.
Full comparison, medians and CPU/RAM · Method · Performance guide · Low-resource setup
Quick start
Run one browser with MCP, an in-memory clearance cache and persistent dashboard history:
docker run -d --name trawl \
-p 127.0.0.1:8191:8191 \
--shm-size=1gb \
-e SESSION_CACHE_DRIVER=memory \
-e BROWSER_POOL_SIZE=1 \
-e MCP_ENABLED=true \
-e METRICS_DASHBOARD_ENABLED=true \
-v trawl_metrics:/data/metrics \
ghcr.io/germondai/trawl:1.10.1
curl http://localhost:8191/health
Open the local dashboard. Keep the API and MCP endpoint on a trusted network; dashboard history survives container recreation through the mounted volume.
For Redis and Compose deployments, see the quick-start guide and Compose examples. Use :1.10.1-baseline on older CPUs or NAS hardware.

The screenshot uses illustrative traffic. Your dashboard shows requests actually handled by your instance. Metrics setup.
API
Native scraping
curl -X POST http://localhost:8191/scrape \
-H 'Content-Type: application/json' \
-d '{"url":"https://nopecha.com/demo/cloudflare","solveEmbeddedCaptchas":false}'
Returns HTML, cookies, the winning tier and timings. Set solveEmbeddedCaptchas: false for page content only; omit it to attempt supported embedded form widgets. Access challenges still need to clear. A delivered page does not by itself prove a form CAPTCHA was solved.
JavaScript and TypeScript client
The packages/client workspace provides a typed client for Node.js, Bun, Deno and
browser applications, including scrape options, session handles and structured errors.
Build it locally before the first npm publication. Client guide.
Prowlarr, Jackett and FlareSolverr clients
curl -X POST http://localhost:8191/v1 \
-H 'Content-Type: application/json' \
-d '{"cmd":"request.get","url":"https://nopecha.com/demo/cloudflare"}'
Set your client's FlareSolverr URL to http://trawl:8191 on a shared Docker network, or the TRAWL host address otherwise. /v1 prioritizes page delivery and skips optional embedded widget solving by default.
Prowlarr setup · Jackett setup · Compatibility reference
MCP for AI clients
With MCP_ENABLED=true, connect your client using Streamable HTTP at http://localhost:8191/mcp or the TRAWL host address. Tools: read, scrape, extract, screenshot and inspect, plus the scrape_url compatibility alias.
TRAWL loads known public URLs; it does not provide web search. Reuse browser sessions with sessionId; create sessions used by MCP with publicOnly: true. MCP guide.
Browser sessions
Create an isolated session and pass its ID on subsequent requests:
curl -X POST http://localhost:8191/sessions \
-H 'Content-Type: application/json' \
-d '{"id":"research"}'
curl -X POST http://localhost:8191/scrape \
-H 'Content-Type: application/json' \
-d '{"url":"https://nopecha.com/demo/cloudflare","sessionId":"research","solveEmbeddedCaptchas":false}'
curl -X DELETE http://localhost:8191/sessions/research
Sessions preserve browser storage between requests and keep login state out of the shared clearance cache. Requests within one session are sequential. Sessions expire when idle and do not survive an API restart; open tabs are closed after each request.
Session API, authentication and lifecycle
Challenge and CAPTCHA support
TRAWL detects supported walls and runs the matching browser flow before returning content. Coverage includes JavaScript and proof-of-work challenges, interactive controls, and supported CAPTCHA widget variants.
Some challenges need a particular browser mode, a different egress IP or an external provider. For example, DataDome Device Check uses the opt-in headful pool; built-in hCaptcha support does not include image grids. Passive reCAPTCHA v3 scripts are not treated as blocking widgets.
The optional 2Captcha fallback supports captured Cloudflare Challenge Pages and supported declarative Turnstile/reCAPTCHA v2 widgets without a site profile. Other documented tasks require a site profile. It is disabled without a provider key; paid-service acceptance remains unverified.
Full coverage matrix and external task catalogue · Solver configuration
HTTP/HTTPS forward proxy
Enable MITM_ENABLED=true and point your HTTP-compatible client at port 8192. Normal traffic is forwarded directly; detected challenge responses escalate through TRAWL's browser tiers. HTTPS clients must trust the generated TRAWL CA. Keep the proxy private and persist its CA directory.
Proxy setup · Install the CA · Prowlarr and other clients
Docker images
| Tags | Use case |
|---|---|
:latest, :1.10.1 | Standard release for modern hardware |
:baseline, :1.10.1-baseline | Older x86 CPUs and NAS kernels |
:nightly, :nightly-<dev-sha> | Development builds from dev |
All tags use ghcr.io/germondai/trawl. Both release variants are published for Linux AMD64 and ARM64. Standalone containers and source builds.
- docker-compose.yml: scraper and Redis.
- docker-compose.minimal.yml: scraper with in-memory caching.
- docker-compose.prod.yml: Redis, restart policy and health checks.
- TrueNAS Community Apps and Unraid Community Apps: community-maintained packages.
Configuration
| Setting | Default | Purpose |
|---|---|---|
BROWSER_POOL_SIZE | 1 | Warm browsers available for concurrent work |
SESSION_CACHE_DRIVER | redis | Choose Redis or single-process memory caching |
SCRAPE_MAX_TIMEOUT_MS | 60000 | Default scrape deadline; request timeouts take precedence |
TIER1_TRANSPORT | bun | Set wreq for optional Firefox TLS/HTTP2 impersonation |
BROWSER_SESSION_MAX_ENTRIES | 4 | Maximum named browser sessions per instance |
PROXY_URL / RESIDENTIAL_PROXY_URL | unset | Optional upstream proxies and proxy pools |
All settings · Environment example · Upgrade guide
Documentation and development
- Architecture and tier routing
- Clearance cache and HTTP reuse
- Browser pool and resource management
- Troubleshooting
- Release history
- Contributing and local development
| Workspace | Purpose |
|---|---|
apps/api | Bun + Elysia API, MCP, dashboard and forward proxy |
apps/web | Nuxt landing page |
apps/docs | VitePress documentation |
packages/browser | Camoufox pool and clearance cache |
packages/tiers | Routing, browser sessions and challenge solvers |
packages/types | Shared types |