hive.browser-automation
Required before any hive-browser CLI command. The browser is driven from the terminal by running `hive-browser <command> ... --json` via terminal_exec — not via MCP tools.
Install / Use
npx skills add aden-hive/hive --skill browser-automationInstalls into whichever agent you are using.
SKILL.md
Installable skill definition
Quality Score
Category
AutomationSupported Platforms
Our assessment of hive.browser-automation
hive.browser-automation scores 88/100 on our quality scale, 679th of 1,335 Automation skills we index.
Its SKILL.md is 49 KB long, well organised into 51 sections with 12 code examples: long enough that it reads more like full documentation than a focused instruction file, which agents can find harder to follow.
With 11,072 GitHub stars, it is one of the more widely adopted skills in the catalogue.
Maintenance, license and trust
- The repository was last updated 12 days ago, so hive.browser-automation is actively maintained.
- It is released under the Apache-2.0 license, a permissive license that allows use, modification and commercial use with attribution.
- Its trust signals score 100/100, with no cautions. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
Safety scan
No issues foundOur scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands.
Automated pattern scan on 2026-09-26. It catches known dangerous patterns, not every risk — read a skill before letting an agent act on it.
hive.browser-automation compared with similar skills
All 4 of these similar skills score higher than hive.browser-automation; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| hive.browser-automation (this skill)by aden-hive | 88 | 11.1k | 12d ago | SKILL.md |
| Agent-Reachby Panniantong | 100 | 85.5k | 10d ago | CLAUDE.md |
| headroomby headroomlabs-ai | 100 | 73.8k | today | CLAUDE.md |
| rufloby ruvnet | 100 | 73.3k | 1d ago | CLAUDE.md |
| CowAgentby zhayujie | 100 | 47.1k | today | CLAUDE.md |
Frequently asked questions
- How do I install hive.browser-automation?
- Run
npx skills add aden-hive/hive --skill hive.browser-automation. The install tabs above show the steps for each supported agent. - Which AI agents does hive.browser-automation work with?
- It is written for Universal, as a SKILL.md file. Other agents that read the same format can often use it too.
- Is hive.browser-automation safe to use?
- Our scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. It is Apache-2.0-licensed and scores 100/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is hive.browser-automation still maintained?
- The repository was last updated 12 days ago, so hive.browser-automation is actively maintained.
Skill content
View source on GitHubname: hive.browser-automation
description: Required before any hive-browser CLI command. The browser is driven from the terminal by running hive-browser <command> ... --json via terminal_exec — not via MCP tools. Teaches the browser lifecycle rules (the bridge attaches to the USER'S running Chrome — never kill or launch browser processes; timeouts are transport issues, not crashes), the screenshot + coordinate workflow (hive-browser interact with a fractional coordinate) that reaches shadow-DOM inputs selectors can't see, the viewport-fraction coordinate rule (not pixels), rich-text editor quirks ("send button stays disabled" failures), and CSP gotchas. Covers Chrome via CDP through the GCU Beeline extension.
metadata:
author: hive
type: default-skill
version: "2.2"
GCU Browser Automation
All GCU browser automation drives a real Chrome instance through the Beeline extension and Chrome DevTools Protocol (CDP). You drive it from the terminal: every command is hive-browser <command> ... --json, run through terminal_exec. Always pass --json so the result is machine-readable. That means clicks, keystrokes, and screenshots are processed by the actual browser's native hit testing, focus, and layout engines — not a synthetic event layer. Understanding this unlocks strategies that make hard sites easy.
Browser lifecycle & recovery — read this before "fixing" anything
The bridge attaches to the user's already-running Chrome via the extension. The browser is not yours: it holds the user's logged-in sessions and other agents' work, and the runtime — not you — owns the connection to it. Consequences:
- There is nothing to "start." If no browser is connected,
hive-browser setup --jsontells you and gives the user install steps. Launching Chrome yourself (anygoogle-chrome/chromiumcommand,--remote-debugging-port,--user-data-dir, headless flags) is forbidden and blocked — it opens a browser the bridge can't see, often under the wrong profile. - There is no situation where killing the browser helps. Never use terminal tools to
kill/pkill/killallChrome, the bridge, or gcu processes. These commands are blocked, and attempting them breaks every agent sharing the connection. The same applies to the Hive desktop app andbridge_host. - A timeout is NOT a stuck browser. All
hive-browsercommands share one transport across all agents; one slow call (a heavyhive-browser evaluateon a big page) can make YOUR calls time out while the browser is perfectly healthy. The timeout message tells you whether the server passed its liveness check and whether recovery is already running — believe it. - Allowed recovery, in order: (1) wait ~30s and retry ONCE, with a smaller/simpler request — e.g. split a page-wide
hive-browser evaluatesweep into chunked queries; (2) close YOUR OWN tabs withhive-browser tab close <T> --jsonand reopen; (3) report the failure (report_to_parentor your reporting channel) and move on to work that doesn't need the browser. Escalate to the user; never to the process table. - Keep heavy
hive-browser evaluatescripts cheap: avoidinnerTextover thousands of nodes (each read forces layout). PrefertextContent, scope the selector, and paginate the sweep.
Targeting a specific Chrome profile / account
If your machine has more than one Chrome profile connected (different logged-in accounts), say which one to act in — if you omit it, the bridge falls back to the first-connected profile, which may be the wrong account. Pass --browser-profile <label> to hive-browser open (and hive-browser navigate / hive-browser script):
- See every connected profile in
hive-browser status --json/hive-browser setup --json— both return aconnected_profileslist of{label, is_default, starred}for ALL connected Chrome profiles (not just the one you're using). That's how you discover the labels. (hive-browser statusreflects ALL connections; don't conclude "only one profile" from the single profile label of your own context.) - The label is a connected profile label — the name shown in that profile's Hive extension side panel (or its auto 3-word id). If your task assigns you a profile (e.g. "your profile is
acct-jpn"), pass exactly that. - Every command's JSON echoes the profile it actually used. Check it: if it doesn't match what you intended, you opened the wrong account. Stop and fix the label (don't proceed).
- A label that isn't connected fails fast with the list of connected labels — bind to one of those.
- With one profile connected (or one starred default), you can omit it. With several connected and no star, omitting it uses the first-connected profile — fine for single-account work, risky for multi-account, so pass the label when the account matters.
Working on LinkedIn?
For ANY LinkedIn flow, load hive.linkedin-core first — it owns the auth check, rate limits, stop protocol, reply-text policy, and DOM gotchas every LinkedIn script depends on. Then load the capability skill for the task: hive.linkedin-discovery (scans / People search), hive.linkedin-messaging (lk_send_to_message_url, reply, inbox), hive.linkedin-connect (lk_send_invite, post comments), or hive.linkedin-sales-navigator (premium search + InMail).
Coordinates
Every hive-browser interact action that takes a --coordinate — and every command that returns one — operates in fractions of the viewport (0..1 for both axes). Read a target's proportional position off hive-browser screenshot — "this button is about 35% from the left and 20% from the top" → pass --coordinate 0.35,0.20. Rect-returning commands (hive-browser page shadow-query and the rect inside focused_element) also return fractions. The CLI converts to CSS pixels internally before dispatching to Chrome.
hive-browser screenshot --json → image + cssWidth/cssHeight in meta
hive-browser interact --action left_click --coordinate x,y --json → x, y are fractions 0..1
hive-browser interact --action hover --coordinate x,y --json → fractions
hive-browser interact --action key --coordinate x,y --text k --json → fractions
hive-browser page shadow-query "<selector>" --json → rect → rect.cx / rect.cy are fractions
Exception for zoomed elements: pages that use zoom or transform: scale() on a container (LinkedIn's #interop-outlet, some embedded iframes) render in a scaled local coordinate space. getBoundingClientRect there may not match CDP's hit space. Prefer hive-browser page shadow-query (which handles the math and returns fractions) or visually pick coordinates from a screenshot. Avoid raw hive-browser evaluate + getBoundingClientRect() for coord lookup — that returns CSS px and will be wrong when fed to a --coordinate.
Screenshot + coordinates is shadow-agnostic — prefer it on shadow-heavy sites
Start with hive-browser page snapshot when you need to inspect the page structure or find ordinary controls. If the snapshot does not show the thing you need, shows stale or misleading refs, or cannot prove where a visible target is, take hive-browser screenshot and use the screenshot + coordinate path. This is especially useful on sites that use Shadow DOM heavily.
Why:
- CDP hit testing walks shadow roots natively.
hive-browser interact --action left_click --coordinate x,y --jsonroutes through Chrome's native hit tester, which traverses open shadow roots automatically. You don't need to know the shadow structure. - Keyboard dispatch follows focus into shadow roots. After a click focuses an input (even one three shadow levels deep),
hive-browser interact --action key ... --jsonwith no--selectordispatches keys todocument.activeElement's computed focus target. - Screenshots render the real layout regardless of DOM implementation.
Whereas wait_for_selector and a selector-targeted left_click / type all use document.querySelector under the hood, which stops at shadow boundaries. They cannot see elements inside shadow roots. For shadow-DOM inputs, use a type action with no selector after focusing via a coordinate click.
Recommended workflow on shadow-heavy sites
hive-browser screenshot --json→ JPEG. The image is attached to your context automatically on your next turn — do NOTattach_file/ read thesaved_topath; that is redundant and wasteful. The result JSON carries asaved_topath (read it ONLY if, in a later turn, no image actually appeared); meta includescssWidth/cssHeightfor reference.- Identify the target visually → estimate its proportional position
[fx, fy]where each is in0..1. hive-browser interact --action left_click --coordinate fx,fy --json→ the CLI converts to CSS px and dispatches; CDP native hit testing focuses the element. The result includesfocused_element: {tag, id, role, contenteditable, rect, inFrame?, ...}— use it to verify you actually focused what you intended.rectis in fractions (same space as your input). When focus is inside a same-origin iframe, the descriptor reports the inner element and addsinFrame: [...]breadcrumbs.hive-browser interact --action type --text "..." --jsonwith no--selector→ inserts text intodocument.activeElement(traverses into same-origin iframes automatically). Shadow roots, iframes, Lexical, Draft.js, ProseMirror all just work. Pass--selectorinstead when you have a reliable CSS selector for a light-DOM element.- Verify via
hive-browser screenshotORhive-browser evaluatereading a known-reachable marker (e.g. check that the Send button'saria-disabledflipped tofalse).
The click→type loop (canonical pattern)
- Run
hive-browser interact --action left_click --coordinate x,y --jsonto click the target element. - Check the
focused_elementfield in the result — it tells you what actually received focus (tag, id, role, contenteditable, rect). - If the focused element is editable, run
hive-browser interact --action type --text "..." --jsonto insert text. Verify the text took effect — prefer checking the underlying.value/innerTextviahive-browser evaluateor confirming the submit button enabled. A screenshot alone can mislead: narrow input boxes visually clip long text, so only a portion may appear on screen even though the full string was accepted. - If it is NOT editable, your click landed on the wrong thing — refine coordinates and retry. Do NOT reach for
hive-browser evaluate+execCommand('insertText')or shadow-root traversals. The problem is the click target, not the typing method.
A --selector-based left_click also returns focused_element, so the same check works whether you clicked by selector or coordinate.
Empirically verified (2026-04-11)
Tested against https://www.reddit.com/r/programming/ whose search input lives at:
document > reddit-search-large [shadow]
> faceplate-search-input#search-input [shadow]
> input[name="q"]
Shadow-piercing selectors
When you DO want a selector-based approach and know the shadow structure, hive-browser page shadow-query supports >>> shadow-piercing syntax:
hive-browser page shadow-query "reddit-search-large >>> #search-input" --json
hive-browser page shadow-query "#interop-outlet >>> #ember37 >>> p" --json
Returns the element's rect as fractions of the viewport (feed rect.cx / rect.cy straight into a --coordinate). Remember: a type action's --selector and --wait-for-selector do not support >>> — only page shadow-query does.
Navigation and waiting
The basics
hive-browser navigate <url> --wait-until load --json # load | domcontentloaded | networkidle
hive-browser interact --action wait --wait-for-selector "h1" --timeout-ms 2000 --json
hive-browser interact --action wait --wait
Truncated for display — read the full file on GitHub.
Related Skills
Agent-Reach
85.5kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
headroom
73.8kCompress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.
ruflo
73.3k🌊 The original agent harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI systems. Features adaptive memory, self-learning intelligence, federation, vector RAG integration, and native Claude Code / Codex / Hermes and many more Integrated
CowAgent
47.1kOpen-source super AI assistant & Agent Harness. Plans tasks, runs tools and skills, self-evolves with memory and knowledge. Multi-agent, multi-model, multi-channel. Lightweight, extensible, one-line install.
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
