Skill flagged — suspicious patterns detected

ClawHub Security flagged this skill as suspicious. Review the scan results before using.

Browse

v1.0.0

Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking...

0· 100·0 current·0 all-time

Install

OpenClaw Prompt Flow

Install with OpenClaw

Best for remote or guided setup. Copy the exact prompt, then paste it into OpenClaw for danjdewhurst/forjd-browse.

Previewing Install & Setup.
Prompt PreviewInstall & Setup
Install the skill "Browse" (danjdewhurst/forjd-browse) from ClawHub.
Skill page: https://clawhub.ai/danjdewhurst/forjd-browse
Keep the work scoped to this skill only.
After install, inspect the skill metadata and help me finish setup.
Use only the metadata you can verify from ClawHub; do not invent missing requirements.
Ask before making any broader environment changes.

Command Line

CLI Commands

Use the direct CLI path if you want to install manually and keep every step visible.

OpenClaw CLI

Bare skill slug

openclaw skills install forjd-browse

ClawHub CLI

Package manager switcher

npx clawhub@latest install forjd-browse
Security Scan
VirusTotalVirusTotal
Suspicious
View report →
OpenClawOpenClaw
Suspicious
medium confidence
!
Purpose & Capability
The SKILL.md documents a full-featured 'browse' CLI (daemon, Playwright wrapper, session state, uploads, traces, webhooks, auth-state handling). Yet the skill declares no required binaries, no install steps, and no primary credential. Either the agent environment must already have a compatible 'browse' binary (not documented), or the skill is missing an install declaration — this mismatch is unexpected for a tool of this complexity.
!
Instruction Scope
The instructions command list includes operations that access local files (upload, auth-state save/load, trace out <path>), run arbitrary JS in page context (eval/page-eval), and send data to external endpoints (flow/healthcheck --webhook <url>). The SKILL.md also suggests using 'login --env <name>' and persisting cookies/auth tokens — these are broad actions beyond a simple read-only browser. The doc gives the agent freedom to read/write files and to POST results to arbitrary webhooks, which is high scope for an instruction-only skill without declared constraints.
Install Mechanism
There is no install specification (instruction-only). That is lowest install risk, but unusual here: the skill assumes a specific CLI 'browse' and a persistent daemon on a Unix socket. The absence of an install step or source URL means there's no guarantee the binary is present or trustworthy; if present, its provenance is unknown.
!
Credentials
The skill declares no required environment variables, yet the runtime docs explicitly reference env-based login (login --env <name>) and persistent auth-state (cookies/localStorage/auth tokens). Commands like upload <file> and webhooks allow exfiltration of local files and session data. Declaring zero env/config access is not proportional to the documented features and obscures what credentials might be used or exposed.
Persistence & Privilege
always:false and normal autonomous invocation are fine. The SKILL.md describes a persistent daemon and session state (cookies, localStorage, tokens), which could allow long-lived authenticated sessions. While the skill does not request platform-wide privileges, autonomous invocation combined with the described file/network capabilities increases blast radius if enabled — consider this when granting the skill use.
What to consider before installing
This skill's documentation describes a powerful browser automation CLI that can read/write files, persist session cookies, run arbitrary in-page JS, and send data to webhooks — but the package declares no binary, no install instructions, and no required environment variables. Before installing or enabling: - Ask the publisher: where does the 'browse' binary come from? Request a verified homepage or install instructions and a trusted release URL (GitHub release or official project domain). - Do not enable this skill in environments with sensitive credentials until you confirm its provenance. The tool can persist and access cookies/tokens and can upload files or post to arbitrary webhooks. - If you must test it, run the agent in an isolated sandbox or dedicated VM with restricted network access and no sensitive files or creds mounted. - Require the skill to document exactly what 'login --env <name>' expects and list any env names it will read, and to limit or whitelist webhook targets if possible. - Prefer a skill that includes an explicit, auditable install spec (signed release or known package) and minimal declared environment access. If those are not provided, treat the skill as untrusted.

Like a lobster shell, security has layers — review code before you run it.

latestvk9775b94hk1c550f3y72gv8jkn83ppqv
100downloads
0stars
1versions
Updated 1mo ago
v1.0.0
MIT-0

Browse — Browser Automation for Agents

How it works

browse is a CLI that wraps Playwright behind a persistent daemon on a Unix socket. The daemon cold-starts in ~3s on first use, then every command runs in sub-200ms. Session state (cookies, localStorage, auth tokens) persists across commands within a session.

All output is plain text. Objects are JSON-stringified. Commands return non-zero on failure with an error message.

Important constraints:

  • Commands are sequential — do not run multiple browse commands in parallel. The daemon handles one command at a time.
  • Run browse help for the full command list, or browse help <command> for detailed usage and flags.

The ref system — read this first

Refs (@e1, @e2, ...) are how you target elements. They replace CSS selectors for most interactions.

Rules:

  1. Always browse snapshot before interacting. Refs only exist after a snapshot.
  2. Refs are ephemeral. Every snapshot call regenerates them. Old refs are invalid.
  3. Refs go stale after navigation. Any goto or click that changes the page invalidates refs. You'll get a clear error — just browse snapshot again.

Core interaction loop:

browse snapshot              # see what's on the page — get refs
browse fill @e3 "test"       # fill the search field
browse click @e4             # click a button
browse snapshot              # re-snapshot after the page changes

Workflow

The standard pattern for any browser task:

  1. Navigate: browse goto <url>
  2. Observe: browse snapshot for page structure (interactive elements with refs). Use browse snapshot -i to include structural elements (headings, text), or -f for the full accessibility tree.
  3. Check for errors: browse console --level error after navigation.
  4. Interact: browse fill @eN "value", browse click @eN, browse hover @eN, browse press Tab, browse select @eN "option", browse scroll @eN (scroll into view).
    • Use browse press <key> for keyboard navigation (Tab, Escape, Enter, ArrowDown, Shift+Tab, etc.). Multiple keys: browse press Tab Tab Tab.
    • Use browse scroll down/up to page through content, browse scroll top/bottom to jump to extremes.
    • After clicks that trigger SPA navigation, use browse wait url /path, browse wait text "Expected", or browse wait visible .selector before snapshotting.
  5. Verify: browse snapshot or browse screenshot after each interaction to confirm the result.
  6. Repeat: Move through pages and flows.

For configured applications, browse healthcheck gives a quick pass/fail across key pages.

Key commands by category

CategoryCommands
Navigategoto <url>, url, back, forward, reload [--hard], text, version, quit, wipe
Observesnapshot, screenshot (--diff, --threshold), console, network
Interactclick @eN, hover @eN [--duration ms], press <key> [key ...], fill @eN "value", select @eN "option", upload @eN <file> [file ...], attr @eN [attribute], scroll down/up/top/bottom/@eN/x y, form --data '{"field":"value"}'
Waitwait url <str>, wait text <str>, wait visible <sel>, wait hidden <sel>, wait network-idle, wait <ms>
Viewportviewport, goto --viewport/--device/--preset
Evaluateeval <expr> (in-page JS), page-eval <expr> (Playwright page API)
Authlogin --env <name>, auth-state save/load <path>
Tabstab list/new/switch/close
Assertassert visible/text-contains/url-contains/..., assert-ai "<visual assertion>"
Accessibilitya11y (full page), a11y @eN (element), a11y --standard wcag2aa, a11y --json, a11y coverage, a11y tree, a11y tab-order, a11y headings
Performanceperf (Core Web Vitals), perf --budget lcp=2500,cls=0.1, perf --json
Securitysecurity (headers, cookies, mixed content), security --json
Responsiveresponsive (multi-viewport screenshots), responsive --breakpoints 320x568,1920x1080, responsive --url <url>
Extractextract table <sel> (--csv, --json), extract links (--filter), extract meta, extract select <sel> (--attr)
Flowsflow list, flow <name> --var key=value (--reporter junit|json|markdown, --dry-run, --stream, --webhook <url>), healthcheck (--reporter junit|json|markdown, --parallel, --concurrency, --webhook <url>), test-matrix --roles r1,r2 --flow <name>, diff --baseline <url> --current <url>
Sessionssession list/create/close, --session <name> on any command
Tracingtrace start (--screenshots, --snapshots), trace stop --out <path>, trace view [<path>] --latest --port <n>, trace list, trace status
Videovideo start [--size WxH], video stop [--out <path>], video status, video list
Crawlcrawl <url> (--depth, --extract table|links|meta|text, --paginate, --rate-limit, --output, --dry-run)
Recordrecord start (--output, --name), record stop, record pause/resume
Network Simthrottle <preset|off|status> (slow-3g, 3g, 4g, wifi, cable), offline on/off
NL Commandsdo "<instruction>" (--dry-run, --provider, --model)
VRTvrt init, vrt baseline, vrt check (--threshold), vrt update (--all), vrt list
SEOseo [url] (--check, --score, --json)
Compliancecompliance [url] (--standard gdpr|ccpa|eprivacy, --json)
Security Scansecurity-scan (--checks xss,csp,clickjack,forms, --verbose, --json)
i18ni18n --locales en,fr,de --url <url>, i18n check-keys, i18n rtl-check
API Assertapi-assert <url-pattern> (--status, --timing, --schema, --body-contains, --header)
Designdesign-audit --tokens <file>, design-audit --extract
Doc Capturedoc-capture --flow <file> --output <dir> (--markdown, --update)
Gesturesgesture swipe <dir>, gesture long-press @eN, gesture double-tap @eN, gesture drag @eN --to @eN
Devicesdevices list, devices search <query>, devices info <name>
Monitormonitor check --config <file>, monitor history, monitor status
Dev Serverdev start, dev stop, dev status
CI/CDci-init (--ci github|gitlab|circleci)
Eventssubscribe (--events navigation,console,network, --level, --idle-timeout)
Watch/REPLwatch <flow-file>, repl
Toolinginit, report --out <path>, replay --out <path>, flow-share export/import/list/install/publish, screenshots list/clean/count, completions bash/zsh/fish, status [--json] [--watch] [--exit-code]

Run browse help <command> for flags and detailed usage — don't guess at flags.

Named sessions

Use named sessions to run multiple independent page groups:

browse session create worker-1               # shared context (same cookies/storage)
browse session create worker-2 --isolated    # isolated context (separate cookies/storage)
browse --session worker-1 goto https://a.com
browse --session worker-2 goto https://b.com
browse session list
browse session close worker-1

By default, sessions share the browser context. Use --isolated for fully separate cookies, storage, and permissions.

Authentication

Configured login (preferred — uses browse.config.json):

browse login --env staging

Manual login:

browse goto https://app.example.com/login
browse snapshot
browse fill @e1 "user@example.com"
browse fill @e2 "password123"
browse click @e3
browse snapshot        # verify redirect / dashboard loaded

Session reuse — save after login, load in future sessions:

browse auth-state save /tmp/auth.json
browse auth-state load /tmp/auth.json

Use browse wipe to clear all session data before switching accounts or at the end of a session.

Visual diff

Compare screenshots against a baseline to detect visual regressions:

browse screenshot current.png --diff baseline.png
browse screenshot current.png --diff baseline.png --threshold 5

Output includes similarity percentage, diff pixel count, and a path to the diff image (changed pixels highlighted in red).

Multi-browser

Browse defaults to Chromium. Use --browser to switch:

browse --browser firefox goto https://example.com
browse --browser webkit goto https://example.com
BROWSE_BROWSER=firefox browse goto https://example.com

Stealth features and CDP console capture are Chromium-only; Firefox/WebKit use standard Playwright.

Proxy

Route browser traffic through a proxy:

browse --proxy http://proxy:8080 goto https://example.com
BROWSE_PROXY=socks5://proxy:1080 browse goto https://example.com

Or configure in browse.config.json with "proxy": { "server": "http://proxy:8080", "bypass": "localhost", "username": "u", "password": "p" }.

Playwright passthrough

Pass any Playwright launch or context option via browse.config.json without waiting for explicit browse support:

{
  "playwright": {
    "launchOptions": { "locale": "fr-FR", "timezoneId": "Europe/Paris" },
    "contextOptions": { "colorScheme": "dark", "geolocation": { "latitude": 48.86, "longitude": 2.35 } }
  }
}

launchOptions are applied at browser startup; contextOptions are applied to isolated sessions and video recording contexts. Browse's own options (headless, viewport, stealth) take precedence on conflict.

Headed mode

Launch the browser visibly for debugging (set before the daemon starts):

BROWSE_HEADED=1 browse goto https://example.com

Timeout control

Any command accepts --timeout <ms> (default 30s). Use for slow pages:

browse goto https://slow-page.example.com --timeout 60000

Error recovery

ErrorFix
"element is outside of the viewport"Run browse scroll @eN to scroll it into view, then retry
"Refs are stale" / "Unknown ref"Run browse snapshot to refresh refs
"Daemon connection lost"Re-run the command — CLI auto-restarts the daemon
"Command timed out after Nms"Use --timeout 60000, or check the URL
"Daemon crashed and recovery failed"Run browse quit, then retry
"Unknown command" for a valid commandStale daemon — run browse quit, then retry
"Unknown flag"Check browse help <cmd> for valid flags
Login failsCheck env vars, verify login URL, browse screenshot to see the page

Comments

Loading comments...