Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/davidondrej-browser-harness
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: testing, research, browser-automation, web-scraping
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/browser-harness
What's inside
- Skill name
browser-harness- Description
- Direct browser control via CDP. Use when the user wants to automate, scrape, test, or interact with web pages. Connects to the user's already-running Chrome.
- License
- MIT
- Instructions
- 196 lines in SKILL.md · view on GitHub
Files (2)
- SKILL.md
- install.md · references/
SKILL.md (first lines)
# browser-harness
Direct browser control via CDP. For task-specific edits, use `agent-workspace/agent_helpers.py`. For setup, install, or connection problems, read install.md.
**Routing check first:** if the task needs no interaction (no clicks, logins, or forms) and you just want page content, use DeepAPI `POST /v1/scrape/website` instead of driving a browser — see the `deepapi` skill. Use browser-harness when the task needs a real browser: interaction, JS-heavy flows, logged-in sessions, or visual verification.
Domain skills (community-contributed per-site playbooks under `agent-workspace/domain-skills/`) are off by default. Set `BH_DOMAIN_SKILLS=1` to enable them; see the bottom section.
**If `BH_DOMAIN_SKILLS=1` and the task is site-specific, read every file in the matching `agent-workspace/domain-skills/<site>/` directory before inventing an approach.**
## Usage
```bash
browser-harness -c '
new_tab("https://docs.browser-use.com")
wait_for_load()
print(page_info())
'
```
- Invoke as browser-harness — it's on $PATH. No cd, no uv run.
- First navigation is new_tab(url), not goto_url(url) — goto runs in the user's active tab and clobbers their work.
## Tool call shape
```bash
browser-harness -c '
# any python. helpers pre-imported. daemon auto-starts.
'
```
run.py calls ensure_daemon() before exec — you never start/stop manually unless you want to.
### Remote browsers
Use remote for parallel sub-agents (each gets its own isolated browser via a distinct BU_NAME) or on a headless server. BROWSER_USE_API_KEY must be set. start_remote_daemon, list_cloud_profiles, list_local_profiles, sync_local_profile are pre-imported.
When supervising those sub-agents, after each check send the user one very short status line: what they are doing and whether they are on track.
Claude Code cmux note: after Claude finishes, it may prefill a predicted next user message; that draft is Claude, not the user speaking.
```bash
browser-harness -c '
start_remote_daemon("work") # default — clean browser, no profile
# start_remote_daemon("work", profileName="my-work") # reuse a cloud profile (already logged in)
# start_remote_daemon("work", profileId="<uuid>") # same, but by UUID
# start_remote_daemon("work", proxyCountryCode="de", timeout=120) # DE proxy, 2-hour timeout
# start_remote_daemon("work", proxyCountryCode=None) # disable the Browser Use proxy
'
BU_NAME=work browser-harness -c '
new_tab("https://example.com")
print(page_info())
'
```
start_remote_daemon prints liveUrl and auto-opens it in the local browser (if a GUI is detected) so the user can watch along. Headless servers print only — share the URL with the user. The daemon PATCHes the cloud browser to stop on shutdown, which persists profile state. Running remote daemons bill until timeout.
Profiles (cookies-only login state) live in interaction-skills/profile-sync.md — covers list_cloud_profiles(), the chat-driven "which profile?" pattern, and sync_local_profile() for uploading a local Chrome profile.
## Interaction skills
If you start struggling with a specific mechanic while navigating, look in interaction-skills/ for helpers. They cover reusable UI mechanics like dialogs, tabs, dropdowns, iframes, and uploads. The available interaction skills are:
- connection.md
- cookies.md
- cross-origin-iframes.md
- dialogs.md
- downloads.md
- drag-and-drop.md
- dropdowns.md
- iframes.md
- network-requests.md
- print-as-pdf.md
- profile-sync.md
- screenshots.md
- scrolling.md
- shadow-dom.md
- tabs.md
- uploads.md
- viewport.md
## What actually works
- Screenshots first: use capture_screenshot() to understand the current page quickly, find visible targets, and decide whether you need a click, a selector, or more navigation.
- Clicking: capture_screenshot() → read the pixel off the image → click_at_xy(x, y) → capture_screenshot() to verify. Suppress the Playwright-habit reflex of "locate first, then click" — no getBoundingClientRect, no selector hunt. Drop to DOM only when the target has no visible geometry (hidden input, 0×0 node). Hit-testing happens in Chrome's browser process, so clicks go through iframes / shadow DOM / cross-origin without extra work.
- Bulk HTTP: http_get(url) + ThreadPoolExecutor. No browser for static pages (249 Netflix pages in 2.8s).
- After goto: wait_for_load().
- Wrong/stale tab: ensure_real_tab(). Use it when the current tab is stale or internal; the daemon also auto-recovers from stale sessions on the next call.
- Verification: print(page_info()) is the simplest "is this alive?" check, but screenshots are the default way to verify whether a visible action actually worked.
- DOM reads: use js(...) for inspection and extraction when the screenshot shows that coordinates are the wrong tool.
- Iframe sites (Azure blades, Salesforce): click_at_xy(x, y) passes through; only drop to iframe DOM work when coordinate clicks are the wrong tool.
- Auth wall: redirected to login → stop and ask the user. Don't type credentials from screenshots.
- Raw CDP for anything helpers don't cover: cdp("Domain.method", params).
## Design constraints
- Coordinate clicks default. Input.dispatchMouseEvent goes through iframes/shadow/cross-origin at the compositor level.
- Connect to the user's running Chrome. Don't launch your own browser.
- cdp-use is only for CDPClient.send_raw. Prefer raw CDP strings over typed wrappers.
- run.py stays tiny. No argparse, subcommands, or extra control layer.
- Core helpers stay short. Put task-specific helper additions in `agent-workspace/agent_helpers.py`; daemon/bootstrap and remote session admin live in the core package.
- Don't add a manager layer. No retries framework, session manager, daemon supervisor, config system, or logging framework.
## Hermes Agent integration
Installed at `~/Developer/browser-harness` as editable `uv tool install -e .`. Binary at `~/.local/bin/browser-harness`. Skill at `~/.hermes/skills/browser-harness/`.
**Frontmatter pitfall:** The upstream SKILL.md ships with `name: browser` in frontmatter, which collides with Hermes's built-in `browser` toolset. When copying into `~/.hermes/skills/`, rename to `name: browser-harness` in the frontmatter or Hermes will shadow/conflict with its own browser tools.
**Brave Browser:** Works identically to Chrome. Enable remote debugging at `brave://inspect/#remote-debugging` (same checkbox). The harness auto-discovers Brave's profile directory.
## Authenticated content extraction (proven pattern)
browser-harness connects to the user's real browser with their active sessions — ideal for extracting content from login-walled sites where `web_extract` or Hermes's built-in `browser_navigate` fail (e.g. X/Twitter articles, LinkedIn, paywalled sites).
**Pattern:**
```bash
browser-harness -c '
new_tab("https://x.com/user/status/123456")From davidondrej/skills, MIT.
More from davidondrej/skills
- 0.819score
domain-checker
davidondrej
Check domain registration in batches using public RDAP APIs, without keys or login.
SkillAFreshness: A★ 4.2KClaude Code +9 - 0.819score
deepapi
davidondrej
Use DeepAPI for all web search, deep research, and web scraping (websites, LinkedIn, GitHub, X/Twitter, YouTube, Instagram) instead of built-in search…
SkillAFreshness: A★ 4.2KClaude Code +9 - 0.819score
kimi-review
davidondrej
Launch an independent Kimi K3.1 Pro Max code review and return it verbatim, falling back across harnesses and routes until one works.
SkillAFreshness: A★ 4.2KClaude Code +9 - 0.819score
bb-cli
davidondrej
Use this when controlling bb.
SkillAFreshness: A★ 4.2KClaude Code +9 - 0.819score
cmux
davidondrej
Control the cmux macOS terminal app: workspaces, panes, surfaces, browsers, notifications, settings, and hooks.
SkillAFreshness: A★ 4.2KClaude Code +9 - 0.819score
persistent-localhost
davidondrej
Manage persistent dev servers, APIs, and other local processes on a port using macOS LaunchAgents.
SkillAFreshness: A★ 4.2KClaude Code +9 - 0.819score
reset-cursor-acp
davidondrej
Reset a stuck Cursor ACP thread in your chat app and reload its configuration.
SkillAFreshness: A★ 4.2KClaude Code +9 - 0.819score
cua-driver
davidondrej
Use Cua Driver for desktop or browser tasks that are awkward or unavailable through Bash/APIs, or when the user explicitly wants GUI interaction: app testing…
SkillAFreshness: A★ 4.2KClaude Code +9 - 0.818score
anti-sleep
davidondrej
Keep a Mac awake for a set duration or while a process runs.
SkillAFreshness: A★ 4.2KClaude Code +9 - 0.818score
repo-sync
davidondrej
Manage automatic Git syncing on macOS with repo-sync.
SkillAFreshness: A★ 4.2KClaude Code +9 - 0.816score
signal-from-expert
davidondrej
Compare the user's notes with an expert's work on a topic.
SkillAFreshness: A★ 4.2KClaude Code +9 - 0.816score
rename-process
davidondrej
Coordinate project or repository renames and moves involving Git, BB, services, or multiple machines.
SkillAFreshness: A★ 4.2KClaude Code +9
Compare and alternatives
Featured in
Signals
- Stars
- 4,167
- Forks
- 612
- Open issues
- 0
- Last commit (this folder)
- Oct 18, 2026 (9 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/davidondrej/skills
- Website
- www.cloudroom.dev
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
Same skill elsewhere
Copies of this SKILL.md published by others; search shows only one of them.
More from davidondrej
- 0.819score
domain-checker
davidondrej
Check domain registration in batches using public RDAP APIs, without keys or login.
SkillAFreshness: A★ 4.2KClaude Code +9 - 0.819score
deepapi
davidondrej
Use DeepAPI for all web search, deep research, and web scraping (websites, LinkedIn, GitHub, X/Twitter, YouTube, Instagram) instead of built-in search…
SkillAFreshness: A★ 4.2KClaude Code +9 - 0.819score
persistent-localhost
davidondrej
Manage persistent dev servers, APIs, and other local processes on a port using macOS LaunchAgents.
SkillAFreshness: A★ 4.2KClaude Code +9 - 0.819score
cua-driver
davidondrej
Use Cua Driver for desktop or browser tasks that are awkward or unavailable through Bash/APIs, or when the user explicitly wants GUI interaction: app testing…
SkillAFreshness: A★ 4.2KClaude Code +9 - 0.819score
reset-cursor-acp
davidondrej
Reset a stuck Cursor ACP thread in your chat app and reload its configuration.
SkillAFreshness: A★ 4.2KClaude Code +9 - 0.819score
kimi-review
davidondrej
Launch an independent Kimi K3.1 Pro Max code review and return it verbatim, falling back across harnesses and routes until one works.
SkillAFreshness: A★ 4.2KClaude Code +9
Cite this page
browser-harness skill. Agent Mart. https://agentmart.dev/skills/davidondrej-browser-harness (last updated 2026-10-24)