unbrowse
Search and call websites through Unbrowse's hosted API or remote MCP, reuse indexed site tools, read pages, and learn missing…
Use whenever Unbrowse itself misbehaves - the unbrowse CLI, SDK, stdio MCP proxy or an agent plugin crashes, prints "looks like an Unbrowse bug", exits with the wrong code, ignores a documented flag, or its docs and skill describe something that does not happen; or the hosted
Claude Code
$ npx -y skills add unbrowse-ai/unbrowse --skill unbrowse-contribute --agent claude-code
Codex
$ npx skills add unbrowse-ai/unbrowse --skill unbrowse-contribute -a codex -y
Cursor
$ npx skills add unbrowse-ai/unbrowse --skill unbrowse-contribute -a cursor -y
Gemini CLI
$ npx skills add unbrowse-ai/unbrowse --skill unbrowse-contribute -a gemini-cli -y
GitHub Copilot
$ npx skills add unbrowse-ai/unbrowse --skill unbrowse-contribute -a github-copilot -y
OpenCode
$ npx skills add unbrowse-ai/unbrowse --skill unbrowse-contribute -a opencode -y
Windsurf
$ npx skills add unbrowse-ai/unbrowse --skill unbrowse-contribute -a windsurf -y
name: unbrowse-contribute description: Use whenever Unbrowse itself misbehaves - the unbrowse CLI, SDK, stdio MCP proxy or an agent plugin crashes, prints "looks like an Unbrowse bug", exits with the wrong code, ignores a documented flag, or its docs and skill describe something that does not happen; or the hosted service answers 5xx or returns a wrong or empty result for a site it lists. Reproduces it, checks for an existing issue or PR, and opens a fix PR to github.com/unbrowse-ai/unbrowse (or an issue for the hosted side), with the person's OK. Also use for "report this to Unbrowse", "file a bug", "send the fix upstream".
Unbrowse's client is open source. When it breaks in your hands, you hold the best bug report anyone will ever write: the exact command, the exact output and the code one `gh` away. Turn it into a fix the maintainers can merge, then carry on with the person's task.
Not bugs (follow the `unbrowse` skill instead):
Bugs:
(`unbrowse help`, `docs/cli.md`, the `unbrowse` skill).
unbrowse bug "expected X, got Y" # markdown: version, OS, Node, the last failure (secrets masked) unbrowse bug --json "expected X, got Y" # the same as JSON
The CLI keeps its last unexpected failure, redacted, in its config folder; `unbrowse bug` reads it. Add the shortest command that reproduces the problem. Never paste a token, cookie, password, customer data or a captured page body; replace them with `<redacted>`.
gh issue list -R unbrowse-ai/unbrowse --state all --search "<two or three words from the error>" gh pr list -R unbrowse-ai/unbrowse --state all --search "<same words>"
Already reported: add your reproduction as a comment only if it adds something (another version or OS, a shorter repro). Do not open a duplicate.
Opening an issue or PR publishes under the person's GitHub account, so ask before the first one in a session, in one line:
> Unbrowse's CLI has a bug: `<one line>`. I can reproduce it and have a fix with a test. Open a PR to > unbrowse-ai/unbrowse from your GitHub account?
Skip the question only when the person already said yes in this session, or `UNBROWSE_AUTO_PR=1` is set. If they say no, or `gh auth status` fails, hand them the report and https://github.com/unbrowse-ai/unbrowse/issues/new, then carry on.
The CLI, SDK, MCP proxy, plugins and docs live in the public repo. Work in a temporary folder, never inside the person's project:
cd "$(mktemp -d)" gh repo fork unbrowse-ai/unbrowse --clone -- --depth 50 cd unbrowse && git switch -c fix/<short-name> bun install
1. Read `AGENTS.md`, then the nearest `MODULE.md`. 2. Write the failing test first, next to the code: `packages/cli/tests/`, `packages/sdk/tests/`, or `tests/plugins.test.ts` for hooks and plugins. Run it and watch it fail. 3. Fix the cause, not the symptom. Keep the change to the one bug. 4. Prove it. All of these must pass, and the PR quotes the markers:
bun test ./packages ./tests bun run typecheck bun run check:plugins # PLUGIN_SKILLS_OK bun run check:public # PUBLIC_SURFACE_OK
5. Commit with a Conventional Commit (`fix(cli): …`, `fix(plugins): …`, `docs: …`), push to the fork and open the PR:
gh pr create -R unbrowse-ai/unbrowse --title "fix(cli): <what now works>" --body-file pr.md
`pr.md` follows `.github/pull_request_template.md`: the person's problem, the repro command and its output before the fix, the cause, the change, the new test and the markers above.
Do not edit upstream-owned files (`skill/SKILL.md`, `skill/references/tools.json`, `packages/sdk/src/mcp-install.ts`, `docs/public-surface.json`): `check:public` rejects it. A bug there is an issue, not a PR.
The server is not in this repo. Open an issue with the report, the `runId` or index `jobId`, the time (UTC) and the shortest repro:
gh issue create -R unbrowse-ai/unbrowse --title "hosted: <what failed>" --body-file report.md
Tell the person in one line, with the link. Go back to their task: use the workaround you found, or say plainly what is blocked. One bug per issue or PR. Never more than one PR per bug.
Every website, even those without an official API or MCP, still rely on a first party API to talk to their backend. Unbrowse calls these website's first party APIs to make agentic browsing 50-100x faster and 95% cheaper than using a browser.
Search and call websites through Unbrowse's hosted API or remote MCP, reuse indexed site tools, read pages, and learn missing…
Direct browser control via CDP for web interaction: automation, scraping, testing, screenshots, and site/app work. Also covers…
Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling…