SkillAgentSearch skills...

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-automation

Installs into whichever agent you are using.

About this skill
📄

SKILL.md

Installable skill definition

Quality Score

88/100

Category

Automation

Supported Platforms

Universal

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.

Substance
21/30
Structure
20/20
Description
15/15
Adoption
17/20
Freshness
15/15

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 found

Our 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.

SkillScoreStarsUpdatedFormat
hive.browser-automation (this skill)by aden-hive8811.1k12d agoSKILL.md
Agent-Reachby Panniantong10085.5k10d agoCLAUDE.md
headroomby headroomlabs-ai10073.8ktodayCLAUDE.md
rufloby ruvnet10073.3k1d agoCLAUDE.md
CowAgentby zhayujie10047.1ktodayCLAUDE.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.

name: 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 --json tells you and gives the user install steps. Launching Chrome yourself (any google-chrome/chromium command, --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/killall Chrome, 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 and bridge_host.
  • A timeout is NOT a stuck browser. All hive-browser commands share one transport across all agents; one slow call (a heavy hive-browser evaluate on 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 evaluate sweep into chunked queries; (2) close YOUR OWN tabs with hive-browser tab close <T> --json and reopen; (3) report the failure (report_to_parent or 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 evaluate scripts cheap: avoid innerText over thousands of nodes (each read forces layout). Prefer textContent, 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 a connected_profiles list 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 status reflects 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 --json routes 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 ... --json with no --selector dispatches keys to document.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

  1. hive-browser screenshot --json → JPEG. The image is attached to your context automatically on your next turn — do NOT attach_file / read the saved_to path; that is redundant and wasteful. The result JSON carries a saved_to path (read it ONLY if, in a later turn, no image actually appeared); meta includes cssWidth/cssHeight for reference.
  2. Identify the target visually → estimate its proportional position [fx, fy] where each is in 0..1.
  3. 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 includes focused_element: {tag, id, role, contenteditable, rect, inFrame?, ...} — use it to verify you actually focused what you intended. rect is in fractions (same space as your input). When focus is inside a same-origin iframe, the descriptor reports the inner element and adds inFrame: [...] breadcrumbs.
  4. hive-browser interact --action type --text "..." --json with no --selector → inserts text into document.activeElement (traverses into same-origin iframes automatically). Shadow roots, iframes, Lexical, Draft.js, ProseMirror all just work. Pass --selector instead when you have a reliable CSS selector for a light-DOM element.
  5. Verify via hive-browser screenshot OR hive-browser evaluate reading a known-reachable marker (e.g. check that the Send button's aria-disabled flipped to false).

The click→type loop (canonical pattern)

  1. Run hive-browser interact --action left_click --coordinate x,y --json to click the target element.
  2. Check the focused_element field in the result — it tells you what actually received focus (tag, id, role, contenteditable, rect).
  3. If the focused element is editable, run hive-browser interact --action type --text "..." --json to insert text. Verify the text took effect — prefer checking the underlying .value / innerText via hive-browser evaluate or 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.
  4. 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

View on GitHub
GitHub Stars11.1k
CategoryAutomation
Updated12d ago
Forks5.7k

Languages

Python

Trust signals

100/100

From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.

No cautions