Everything you need to get started, connect local models, set up private search, and use Skills.
BroClaw is a 100% browser-native AI agent studio β no server, no backend, no account required. Your API keys and files never leave your machine.
| Model | Type | Cost | Best For |
|---|---|---|---|
| Claude Sonnet 4.6 | Cloud API | Medium | Best overall quality, extended thinking |
| Claude Haiku 4.5 | Cloud API | Low | Fast everyday tasks |
| GPT-4o / o3 | Cloud API | Med/High | Reasoning-heavy tasks |
| Gemini 2.0 Flash | Cloud API | Low | Fast with generous free tier |
| Ollama (local) | Self-hosted | Free | Privacy-first, no API cost |
| Qwen3 / Gemma / Llama | In-browser (WebGPU) | Free | Completely offline, no install |
| Shortcut | Action |
|---|---|
| Enter | Send message |
| Shift+Enter | New line in message |
| Escape | Stop agent / close modal |
| Ctrl+/ | Open the in-app docs panel |
Ollama lets you run powerful AI models (Qwen3, Llama, Phi-4, Mistralβ¦) locally on your own hardware β completely free, completely private. BroClaw connects to it directly from the browser over http://localhost:11434.
https://broclaw.io), Ollama must be told to allow that origin via a CORS environment variable. This is a browser security rule β BroClaw cannot work around it in code. The steps below handle this.
If you haven't already, download and install Ollama from ollama.com β. It runs on Windows, macOS, and Linux.
You must start Ollama with OLLAMA_ORIGINS=https://broclaw.io. The fastest way is BroClaw's built-in script downloader:
Or run manually:
Windows (PowerShell)
# Kill any running Ollama (including the tray app) taskkill /IM ollama.exe /F # Permanently write the origin to your user environment (survives reboots) setx OLLAMA_ORIGINS "https://broclaw.io" # Set it for this session too, then start serving $env:OLLAMA_ORIGINS="https://broclaw.io"; ollama serve
macOS / Linux (Terminal)
pkill ollama OLLAMA_ORIGINS=https://broclaw.io ollama serve
To make it permanent on Mac/Linux, add export OLLAMA_ORIGINS=https://broclaw.io to your ~/.zshrc or ~/.bashrc, then restart your shell.
Open a new terminal window and pull one of these recommended models:
| Model | RAM needed | Tool calling | Best for |
|---|---|---|---|
ollama pull qwen3:0.6b | 1 GB | β Native | Ultra-fast tasks |
ollama pull qwen3:1.7b | 2 GB | β Native | Everyday coding |
ollama pull llama3.2:3b | 2.5 GB | β Native | Instructions + chat |
ollama pull qwen3:4b | 5 GB | β Native + thinking | Complex tasks |
ollama pull phi4-mini | 3 GB | JSON structured | Reasoning |
ollama pull mistral:7b | 8 GB | β Native | High-quality output |
http://127.0.0.1:11434 (or http://localhost:11434).Browsers block HTTPS pages from making requests to HTTP endpoints unless the HTTP server explicitly permits it via Access-Control-Allow-Origin headers. OLLAMA_ORIGINS tells Ollama to send those headers for https://broclaw.io, authorising the browser to forward the response. Chrome and Edge do allow HTTPS β localhost as a special case β but only with the correct origin header from Ollama's side.
| Problem | Fix |
|---|---|
| CORS error in console | Restart Ollama with OLLAMA_ORIGINS=https://broclaw.io set β the tray app may have restarted without the variable. |
| No models appear in dropdown | Make sure you've pulled at least one model: ollama pull qwen3:1.7b |
| Connection refused | Ollama isn't running. Open a terminal and run OLLAMA_ORIGINS=https://broclaw.io ollama serve |
| Works today, broken tomorrow (Windows) | Run setx OLLAMA_ORIGINS "https://broclaw.io" once to write it permanently to your Windows user environment. |
| Firefox blocks it | Firefox may block HTTP localhost requests from HTTPS pages. Use Chrome 113+ or Edge 113+. |
BroClaw supports three search backends. SearXNG (self-hosted, free) is the recommended choice for privacy and reliability. Brave Search API and SerpAPI are cloud options that require an API key.
| Provider | Cost | Privacy | Setup effort |
|---|---|---|---|
| π SearXNG (local) | Free | βββ Best β queries never leave your machine | ~5 min (Docker) |
| π¦ Brave Search API | Free tier (2 000 req/mo) | ββ Good | 1 min (get API key) |
| π SerpAPI | Paid (100 free/mo) | β Searches via SerpAPI servers | 1 min (get API key) |
SearXNG is a self-hosted meta-search engine that aggregates Google, Bing, DuckDuckGo, and dozens of other engines. No API key. No rate limits. Results stay on your machine. A lightweight Caddy reverse proxy adds the CORS headers your browser requires to talk to it.
Prerequisites: Docker Desktop β installed and running.
Browser (BroClaw)
β POST /search?format=json
Caddy :8888 (adds CORS headers)
β proxies to
SearXNG :8080 (meta-search engine)
β queries
Google / Bing / DuckDuckGo / etc.
Without Caddy, the browser would block SearXNG's responses due to missing Access-Control-Allow-Origin headers. Caddy injects this header transparently.
Both files are already included in the searxng-config/ folder of your BroClaw download β you don't need to create them. They're shown here so you can verify or recreate them if needed.
π searxng-config/docker-compose.yaml
services:
searxng:
image: searxng/searxng:latest
container_name: searxng
volumes:
- searxng-data:/etc/searxng
expose:
- "8080"
restart: unless-stopped
caddy:
image: caddy:latest
container_name: caddy
ports:
- "8888:80"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
depends_on:
- searxng
restart: unless-stopped
volumes:
searxng-data:
π searxng-config/Caddyfile
:80 {
reverse_proxy searxng:8080
# Allow BroClaw (and any browser) to read SearXNG responses cross-origin.
# Without these headers the browser blocks the response even though the
# request goes through β SearXNG does not add CORS headers itself.
header Access-Control-Allow-Origin "*"
header Access-Control-Allow-Methods "GET, POST, OPTIONS"
header Access-Control-Allow-Headers "Content-Type, Accept"
@options method OPTIONS
respond @options 204
}
Open a terminal in the searxng-config/ folder (included in the BroClaw download β contains docker-compose.yaml and Caddyfile):
# First time or full reset β removes old data: docker compose down -v # Start SearXNG + Caddy reverse proxy: docker compose up -d # Wait ~10 seconds for SearXNG to boot and write its config
BroClaw reads search results as JSON. You must enable this in SearXNG's settings.yml after first boot (the file is generated by SearXNG on startup β editing it before boot causes YAML parse errors).
Docker Desktop (Windows/Mac):
searxng-config_searxng-dataetc/searxng/settings.yml and click to edit.Linux / terminal:
docker exec -it searxng sh vi /etc/searxng/settings.yml
Find or add the search block and make it read exactly:
search:
formats:
- html
- csv
- json
- rss
docker compose restart searxng # Verify JSON works (should return JSON, not an error): curl "http://localhost:8888/search?q=test&format=json"
http://localhost:8888.| Problem | Fix |
|---|---|
| 403 errors / blocked as bot | Create limiter.toml in the volume with: [botdetection.ip_limit] / link_token = false / [botdetection.ip_lists] / pass_ip = ["0.0.0.0/0", "::/0"] |
| "format not supported" | The search.formats block is missing. Repeat Step 2. |
| Port 8888 already in use | Change 8888:80 β 8889:80 in docker-compose.yaml and update the URL in BroClaw. |
| Need full reset | docker compose down -v && docker rmi searxng/searxng:latest then restart from Step 1. |
Why not a public instance? Public instances at searx.space β often disable the JSON format BroClaw needs, enforce rate limits that block repeated agent searches, and may log your queries. Running locally avoids all three.
Brave Search API supports CORS natively β no proxy or Docker needed.
SerpAPI routes through BroClaw's service worker proxy to handle CORS β no setup needed.
Connect any Model Context Protocol (MCP) server and BroClaw discovers its tools automatically β no code changes, no rebuild. Once connected, the agent can call those tools in chat exactly like its built-in ones (writing files, running code, etc.) β you just ask for what you want and the agent picks the right tool itself.
BroClaw talks to MCP servers over plain HTTP from inside your browser tab β the same way it already talks to Ollama. There's no built-in list of supported servers; you paste a URL into Settings β Connectors β MCP Servers and BroClaw asks that server what tools it has.
This only works for servers that speak MCP's Streamable HTTP transport. Most MCP servers you'll find described as npx -y some-package use a different transport called stdio (they only talk over a process's standard input/output) β a browser tab cannot start a process directly, so those need a small local bridge first (see Option B). Every connection β direct, bridged, or authenticated β ends up looking identical to BroClaw once it's added: just a URL, optionally with headers.
Once a server shows a green dot in Settings, its tools are simply available to the agent in every chat β there's no per-chat "enable this tool" step. If you connect a weather server and a GitHub server, just ask "what's the weather in Tokyo, and what are the open issues on my repo?" and the agent calls both automatically.
If a server is already reachable over HTTP and allows browser connections (sends CORS headers for this site), you can connect straight away β exactly like adding an Ollama endpoint:
https://mcp.example.com/mcp, or a local one already running on your machine such as http://localhost:8000/mcp.If the add fails with a network error, the server most likely isn't CORS-enabled for browser clients. That's a server-side setting (most MCP frameworks call it allowed_origins or similar) β see Option B below if you can't change it.
Most local MCP servers you'll see in setup guides β including code-sandbox servers like sandbox-mcp β are stdio-only. mcp-proxy β is a small, widely-used open-source tool that spawns the stdio server for you and exposes it as a local HTTP endpoint BroClaw can reach β the same role Caddy plays for SearXNG above.
Browser (BroClaw)
β fetch POST/GET http://localhost:8811/mcp
mcp-proxy :8811 (HTTP \u2194 stdio bridge)
β spawns & talks stdio to
Your MCP server (e.g. npx -y @pottekkat/sandbox-mcp)
β e.g. runs code inside
Docker container (isolated, ephemeral)
# Requires Python 3.10+ and uv (or pipx) uvx mcp-proxy --help # downloads & runs on first use, no install step needed # or install it once: pipx install mcp-proxy
Example using sandbox-mcp (runs arbitrary code in isolated Docker containers β requires Docker Desktop running):
uvx mcp-proxy --port=8811 -- npx -y @pottekkat/sandbox-mcp
Swap the part after -- for any other stdio MCP server's normal launch command β the pattern is identical regardless of which one you use.
http://localhost:8811/mcp.mcp-proxy terminal window running in the background while you use BroClaw β closing it disconnects the server (the same as quitting Ollama).Auth headers work the same way for every Streamable HTTP MCP connection β cloud-hosted, self-hosted on your own server, or local (including a local mcp-proxy bridge). There's nothing service-specific about it: whatever sits behind the URL, BroClaw attaches the same headers to every request it sends β the initial handshake, tool discovery, and every tool call. When adding a server, expand π Auth headers (optional) and enter one header per line as Name: Value, for example:
Authorization: Bearer sk-abc123 X-Api-Key: my-key
These are sent on every request to that server, the same way server.headers is already used for the session-id handshake. They're stored in localStorage alongside the server's URL β anyone with access to this browser profile can read them, so don't use this on a shared or public machine. To rotate or update a token later, click π Auth on that server's card in Settings, edit the textarea, and save β BroClaw reconnects automatically.
The one exception β stdio-only servers: a handful of MCP servers (most commonly database connectors, e.g. @modelcontextprotocol/server-postgres) are stdio-only and take their credential as a command-line argument or environment variable when launched, not as an HTTP header. For those, the credential is supplied at the mcp-proxy step in Option B instead of in BroClaw's Auth headers field β see Example 4 below.
A few concrete setups, covering the most common shapes of MCP server you'll run into.
Some hosted MCP servers are open to any browser, no key required β good for trying things out. If you have one's URL handy:
Public Demo, URL: https://example-mcp.fly.dev/mcp (substitute the real URL).Most production MCP servers (search APIs, project-management tools, CRMs) require a key. This is Option A + Option C together:
Linear (or whatever the service is), URL: the server's MCP endpoint, e.g. https://mcp.linear.app/mcp.Authorization: Bearer <your-api-key>X-Api-Key instead of Authorization).A filesystem or sandbox tool that just needs to run locally, with nothing to authenticate:
uvx mcp-proxy --port=8811 -- npx -y @modelcontextprotocol/server-filesystem /Users/you/projects
Then add http://localhost:8811/mcp in BroClaw with no auth headers. The path after the package name (/Users/you/projects) restricts that server to one folder β check the server's own README for its exact arguments.
Database connectors are the classic case where the credential lives in the launch command, not in BroClaw's UI:
uvx mcp-proxy --port=8811 -- npx -y @modelcontextprotocol/server-postgres "postgresql://user:password@localhost:5432/mydb"
Add http://localhost:8811/mcp in BroClaw with no auth headers β the credential never leaves your machine's terminal. The same pattern applies to any stdio server that takes a connection string, API key, or token as a CLI argument or environment variable (e.g. GITHUB_PERSONAL_ACCESS_TOKEN=ghp_xxx npx -y @modelcontextprotocol/server-github, bridged the same way).
Not every server is "cloud" or "localhost" β e.g. a Streamable HTTP MCP server you run on a home server or office machine:
Home Assistant, URL: http://192.168.1.50:9000/mcp (your machine's LAN IP).X-Internal-Token: my-shared-secret.Each server in Settings shows a green/red status dot, how many tools it exposes, and four controls: a checkbox to temporarily disable it without removing it, Reconnect to refresh its tool list after restarting the server, π Auth to view or update its auth headers, and Remove to delete it entirely. Disabled servers are not offered to the agent at all, so you can keep several configured and only turn on the one you need for a given task.
BroClaw is a browser-only app with no backend process, so it can never spawn a child process or speak stdio directly β this is a hard limitation of running inside a browser tab, not something specific to BroClaw. Every MCP client that supports stdio servers natively (Claude Desktop, Claude Code, Cursor, etc.) does so because it ships with its own Node.js/Electron backend able to call child_process.spawn(). BroClaw deliberately stays browser-only, so stdio servers always go through the mcp-proxy bridge described in Option B above β there is no plan to add a backend just to remove that step.
| Symptom | Fix |
|---|---|
| "Could not reach the server" on Add | If it's a local stdio server, make sure mcp-proxy (or your bridge) is still running in its terminal. If it's remote, the server isn't sending CORS headers for browser clients β ask the provider, or bridge it locally instead. |
| Server shows 0 tools after connecting | The server connected but returned an empty tool list β check its own logs; some servers require an API key or extra config passed via environment variables before they register any tools. |
| "401 Unauthorized" or "403 Forbidden" on Add/Reconnect | The server needs an auth header BroClaw isn't sending yet, or the header name/value is wrong. Expand π Auth headers when adding it, or click π Auth on an existing server card to add/fix one β check the service's own MCP docs for the exact header name it expects. |
| Agent never calls the tool I expect | Check the server's tool descriptions in Settings (hover/expand if shown) β the agent picks tools based on their name and description, so a vague description can get skipped in favor of a built-in tool that sounds closer to what you asked for. |
| Tool calls time out | Sandboxed code execution (e.g. installing packages, building a container image) can take longer than usual β this is expected for first-run tool calls on a cold sandbox. |
| Sandbox-style servers fail immediately | Confirm Docker Desktop is installed and running β sandbox-mcp and similar servers need it to create isolated containers. |
Skills are one-click prompt templates that accelerate common tasks.
{input} or {topic} with your specific content.Go to the Skills tab and click + New Skill. Give it a name, description, and a prompt template. Use {input} as the placeholder for what the user types.
# Example custom skill prompt:
You are a senior product manager. Given the following feature request:
{input}
Write a one-page PRD covering: problem statement, user story, success metrics, and out-of-scope items.
| Action | When Used | Output |
|---|---|---|
search | Need current info from the web | Top search results with titles, URLs, snippets |
open_tab | Need full page content from a URL | Extracted, clean page text |
create_file | Write output to workspace | File created in workspace folder |
create_project | Scaffold a multi-file project | New project folder with all files |
read_file | Read an existing workspace file | File contents passed back to LLM |
remember | Store a fact for future turns in this chat | Written to session memory |
done | Task is complete | Final answer rendered in chat |
output/"