
Browsing
Browse the web via Chrome automation for research, verification, and UI checks.
Install
npx skills add https://github.com/obra/superpowers-chrome --skill browsingWhat is this skill?
- Chrome-driven browsing from agent sessions.
- Research and verification workflows.
- Superpowers Chrome extension companion skill.
Adoption & trust: 308 installs on skills.sh; 312 GitHub stars; 0/3 security scanners passed (skills.sh audits).
Recommended Skills
Agent Browservercel-labs/agent-browser
Lark Imlarksuite/cli
Lark Calendarlarksuite/cli
Lark Sheetslarksuite/cli
Lark Vclarksuite/cli
Lark Contactlarksuite/cli
Journey fit
Common Questions / FAQ
Is Browsing safe to install?
skills.sh reports 0 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.
SKILL.md
READMESKILL.md - Browsing
node_modules/ package-lock.json IMPLEMENTATION_SUMMARY.md TEST_RESULTS.md test-*.png test-*.md #!/usr/bin/env node const process = require('process'); // Parse --port=N flag from anywhere in argv (filter it out of positional args) const allArgs = process.argv.slice(2); const portArg = allArgs.find(a => a.startsWith('--port=')); const positionalArgs = allArgs.filter(a => !a.startsWith('--port=')); const [command, wsUrlOrIndex, ...args] = positionalArgs; // Handle --help and --version before any other processing if (command === '--help' || command === '-h' || !command) { console.log(`Usage: chrome-ws <command> [args] Commands: start [port] Start Chrome with remote debugging stop Kill Chrome pid Print Chrome PID info Print Chrome info (JSON) tabs List open tabs new <url> Open a new tab close <tab> Close a tab navigate <tab> <url> Navigate tab to URL extract <tab> <selector> Extract element text content attr <tab> <selector> <attribute> Get element attribute html <tab> [selector] Get HTML content click <tab> <selector> Click an element fill <tab> <selector> <text> Fill an input field select <tab> <selector> <value> Select a dropdown option eval <tab> <js> Evaluate JavaScript wait-for <tab> <selector> [timeout-ms] Wait for element to appear wait-text <tab> <text> [timeout-ms] Wait for text to appear screenshot <tab> <filename.png> [--fullpage] Take a screenshot markdown <tab> <filename.md> Save page as markdown har <tab> <filename.har> Export HAR (after har-start) raw <ws-url> <json-rpc-payload> Send raw CDP command --help, -h Show this help --version, -v Show version --port=N Override CHROME_WS_PORT env var Tab arg: numeric index (0, 1, 2...) or full ws:// URL. `); process.exit(0); } if (command === '--version' || command === '-v') { const pkg = require('../../package.json'); console.log(pkg.version); process.exit(0); } const hostOverride = require('./host-override').createOverride(); const { createSession } = require('./chrome-ws-lib'); const CHROME_DEBUG_HOST = hostOverride.getHost(); const CHROME_DEBUG_PORT = hostOverride.getPort(); const WS_OVERRIDE_ENABLED = hostOverride.isOverrideEnabled(); const rewriteWsUrl = hostOverride.rewriteWsUrl; // Effective port: --port=N flag overrides CHROME_WS_PORT env / default 9222 const effectivePort = portArg ? parseInt(portArg.split('=')[1], 10) : CHROME_DEBUG_PORT; // Session pointed at the effective port. Built after effectivePort is known // so the lib's pooled connections target the right Chrome instance. const session = createSession({ host: CHROME_DEBUG_HOST, port: effectivePort }); // Minimal WebSocket client implementation (dependency-free) class WebSocketClient { constructor(url) { this.url = new URL(url); this.callbacks = {}; this.socket = null; this.buffer = Buffer.alloc(0); } on(event, callback) { this.callbacks[event] = callback; } connect() { return new Promise((resolve, reject) => { const http = require('http'); const crypto = require('crypto'); const key = crypto.randomBytes(16).toString('base64'); const options = { hostname: this.url.hostname, port: this.url.port || 80, path: this.url.pathname + this.url.search, headers: { 'Upgrade': 'websocket', 'Connection': 'Upgrade', 'S