CDP_URL | CDP endpoint to attach to | http://127.0.0.1:9222 |
WEBRAIN_PROXIES | Proxy rotation pool — comma/newline-separated proxy URLs, round-robin in list order (first entry used first), with a walled exit resting 120 s before it is retried. Used by the HTTP engines (webrain_serp, webrain_scrape) and baked into the google/brave guest-Chrome launch. Process-global — an explicit per-call proxy overrides it and never rotates | unset (no pool) |
WEBRAIN_HTTP_CACHE | Set 0/off/false/no to disable the HTTP revalidation cache (conditional GETs on repeat fetches) | on |
WEBRAIN_HTTP_CACHE_DIR | Dir holding the HTTP cache metadata file | platform cache dir (%LOCALAPPDATA%\webrain, ~/.cache/webrain) |
WEBRAIN_DOWNLOAD_MAX_BYTES | Per-file size cap in bytes for the webrain_download http engine | 536870912 (512 MiB) |
WEBRAIN_FETCH_TIMEOUT_SECS | Per-attempt HTTP timeout for engine/package downloads — raise it on a slow link so a slow install is slow, not failed | 300 |
WEBRAIN_CHROME | Explicit Chrome binary path | auto-discovered |
WEBRAIN_BROWSERS_DIR | Engine cache dir (Chrome for Testing, Obscura) | %LOCALAPPDATA%\webrain\browsers / ~/.cache/webrain/browsers |
WEBRAIN_LIGHTPANDA / WEBRAIN_OBSCURA | Explicit lightpanda/obscura binary paths | auto-discovered |
WEBRAIN_PROFILES_DIR | Per-account browser profile root | %APPDATA%\webrain\profiles / XDG data dir, i.e. ~/.local/share/webrain/profiles |
WEBRAIN_MAX_TABS | Cap on concurrent tabs an engine may open — lower it on a small box where a wide webrain_batch would thrash memory | engine default |
WEBRAIN_VAULT_DIR | Encrypted credential vault dir | %APPDATA%\webrain / ~/.config/webrain |
WEBRAIN_USER / WEBRAIN_PASS | Login fallback credentials (env channel) | — |
GROQ_API_KEY / OPENAI_API_KEY / FIREWORKS_API_KEY | Cloud STT (transcript) keys, tried GROQ → OPENAI → FIREWORKS. The vision ask chain is separate and uses all three too — see Vision ask chain | — |
OPENROUTER_API_KEY | Vision ask chain, first hop | — |
ANTHROPIC_API_KEY / CLAUDE_API_KEY | Vision ask chain, hop 3 (Claude). Either name works | — |
GEMINI_API_KEY / GOOGLE_API_KEY | Vision ask chain, hop 4 (Gemini). Either name works | — |
DASHSCOPE_API_KEY / QWEN_API_KEY | Vision ask chain, hop 6 (Qwen / DashScope). Either name works | — |
SERPAPI_API_KEY | serpapi.com paid Google SERP provider — used by webrain_serp when limit > 10 | — |
BRAVE_API_KEY | Brave Search API (api.search.brave.com, 20/page) — makes engine=brave work without a browser, and auto uses it for limit > 20 before any browser render | — |
WEBRAIN_SKILLS_DIR | Directory of operator skill files readable via webrain_guide(topic="skill:<name>") — ship house rules to the agent without recompiling. Unset means <engine cache>/skills, which webrain install skills fills and webrain skills add <url> extends; an empty directory serves nothing | — (empty) |
WEBRAIN_NO_STEALTH | Set 1 to skip the injected stealth JS + UA override (e.g. the webrain serp google flow). serp sets it for itself — if it leaks into the shell that starts mcp, the server boots with all stealth off and every later result is measured against a different identity | off |
WEBRAIN_STEALTH_NOISE | Set 0 to disable the canvas/audio/Object.defineProperty fingerprint-noise block. This is the fix when a page renders but never mounts. Verified on ab.gr/storelocator (real Chrome): the NOISE block made Next.js abort with Cannot read properties of undefined (reading 'getInitialProps'), and the same browser mounted cleanly with it off. Read at attach — restart the server, then open a fresh tab; injected scripts live for the tab’s lifetime, so re-navigating the same tab keeps the old one and the change looks ignored | on |
WEBRAIN_STT_MODEL | Cloud STT model override (e.g. whisper-large-v3) | provider default |
WEBRAIN_WHISPER_BIN / WEBRAIN_WHISPER_MODEL | Local whisper-cli binary / GGUF model paths | bundled cache |
WEBRAIN_VISION_MODEL | Which installed local vision model to load (qwen3-vl-2b, qwen3-vl-2b-q6k, qwen35-9b-q4km/q5km/q6k/q8). Unset resolves to the default id, then to whatever is installed, so a single-model cache keeps working | qwen3-vl-2b |
WEBRAIN_LLAMA_SERVER | Path to a different llama-server binary — drop in a CUDA/Vulkan build and GPU offload engages on its own | bundled CPU build |
WEBRAIN_VISION_GPU | 1 forces -ngl 99 layer offload, 0 forces CPU. Otherwise offload is enabled only when a GPU backend library (ggml-cuda, ggml-vulkan, ggml-metal, ggml-hip, ggml-sycl) sits beside the binary — -ngl on a CPU-only build is silently ignored, so the machine’s GPU is never trusted over the build’s | auto |
EMBED_URL / EMBED_MODEL / EMBED_API_KEY | OpenAI-compatible /v1/embeddings endpoint + model + Bearer token for webrain_vision op=index / retrieve (any compatible server: OpenAI, Ollama, TEI, local vLLM) | api.openai.com/v1/embeddings + text-embedding-3-small |
EMBED_FALLBACK_URL / EMBED_FALLBACK_MODEL / EMBED_FALLBACK_API_KEY | Secondary embeddings endpoint tried automatically when the primary EMBED_* call fails | http://127.0.0.1:8000/v1/embeddings + Qwen/Qwen3-VL-Embedding-2B |
WEBRAIN_HTTP_ADDR | Bind address for webrain mcp --http | 127.0.0.1:<port> (loopback only) |
WEBRAIN_HTTP_TOKEN | Bearer token for the HTTP transport, compared in constant time. Required on a non-loopback bind | unset (open on loopback) |
WEBRAIN_ALLOW_UNAUTHENTICATED | Set 1 to permit a non-loopback HTTP bind with no token — otherwise startup refuses | off |
WEBRAIN_NO_STATE | Set 1 to refuse the vault / launch / login / session tools and clamp fan-out (shared-instance mode) | off |
RUST_LOG | Log verbosity (webrain=info,tungstenite=warn) | as above |