chrome-cmd
v2.1.21
Published
Control Chrome from the command line - List tabs, execute JavaScript, and more
Maintainers
Readme
Overview
Control Chrome from the command line: list tabs, execute JavaScript, monitor network, capture screenshots, automate forms.
:sparkles: Features
✔️ Tab control - list, create, close, focus, and navigate tabs from terminal ✔️ JavaScript execution - run code in any tab and get instant results ✔️ Network inspection - capture HTTP requests with headers, payloads, and response bodies ✔️ Console monitoring - view color-coded logs with smart formatting and type filtering ✔️ Screenshots - capture full-page or viewport screenshots with single command ✔️ Form automation - click elements and fill input fields programmatically ✔️ Storage inspection - view cookies, localStorage, and sessionStorage data ✔️ Multi-profile support - manage multiple Chrome profiles with seamless switching
:rocket: Quick Start
# 1. Install
npm install -g chrome-cmd
# 2. Run install command
chrome-cmd install
# → Shows extension path
# → Guides you through the installation process
# → Waits for Extension ID
# 3. Load extension in Chrome
# → Open chrome://extensions/
# → Enable "Developer mode"
# → Click "Load unpacked" and select the path shown
# → Copy the Extension ID
# 4. Paste Extension ID in terminal
# → Paste and press Enter
# → Installation complete!
# 5. Start using!
chrome-cmd tab list:bulb: Usage
All commands use the selected tab by default. Override with --tab <index> flag.
# List all open Chrome tabs
chrome-cmd tab list
# Select tab for subsequent commands
chrome-cmd tab select
chrome-cmd tab select --tab 1
# Focus/activate a tab (bring to front)
chrome-cmd tab focus
chrome-cmd tab focus --tab 3
# Create a new tab
chrome-cmd tab create https://google.com
chrome-cmd tab create https://google.com --background
chrome-cmd tab create
# Navigate tab to a specific URL
chrome-cmd tab navigate https://github.com
chrome-cmd tab navigate https://github.com --tab 2
# Execute JavaScript in selected tab
chrome-cmd tab exec "document.title"
chrome-cmd tab exec "document.images.length"
chrome-cmd tab exec "Array.from(document.querySelectorAll('a')).map(a => a.href)"
chrome-cmd tab exec "2 + 2"
# Close selected tab
chrome-cmd tab close
# Reload/refresh selected tab
chrome-cmd tab refresh
# Capture screenshot of selected tab
chrome-cmd tab screenshot
chrome-cmd tab screenshot --output ~/Downloads/page.png
chrome-cmd tab screenshot --tab 2
chrome-cmd tab screenshot --only-viewport
# Extract HTML content from selected tab
chrome-cmd tab html
chrome-cmd tab html --selector "div.content"
chrome-cmd tab html --raw
chrome-cmd tab html --include-compacted-tags
# Get console logs from selected tab
chrome-cmd tab logs
chrome-cmd tab logs -n 100
chrome-cmd tab logs --error
chrome-cmd tab logs --warn
chrome-cmd tab logs --info --log --debug
chrome-cmd tab logs --error --warn
# Get network requests from selected tab
chrome-cmd tab requests
chrome-cmd tab requests -n 100
chrome-cmd tab requests --method GET
chrome-cmd tab requests --method POST
chrome-cmd tab requests --status 200
chrome-cmd tab requests --status 404
chrome-cmd tab requests --url "/api"
chrome-cmd tab requests --url "google.com"
chrome-cmd tab requests --all
chrome-cmd tab requests --failed
chrome-cmd tab requests --body
chrome-cmd tab requests --headers
chrome-cmd tab requests --method POST --status 200 --url "/api"
chrome-cmd tab requests --details 1
# Get storage data from selected tab
chrome-cmd tab storage
chrome-cmd tab storage --cookies
chrome-cmd tab storage --local
chrome-cmd tab storage --session
# Click on an element in selected tab
chrome-cmd tab click --selector "button.submit"
chrome-cmd tab click --text "Sign In"
# Fill an input field in selected tab
chrome-cmd tab input --selector "#username" --value "myuser"
chrome-cmd tab input --selector "#search" --value "query" --submit
# Execute JavaScript on selected tab
chrome-cmd tab exec "document.title"
# Output: "GitHub - Chrome CMD"
# More examples
chrome-cmd tab exec "document.images.length"
chrome-cmd tab exec "Array.from(document.querySelectorAll('a')).map(a => a.href)"
chrome-cmd tab exec "2 + 2"chrome-cmd tab logs
chrome-cmd tab logs -n 100
chrome-cmd tab logs --error
chrome-cmd tab logs --warn
chrome-cmd tab logs --info --log --debug
chrome-cmd tab logs --error --warnFeatures: Color-coded output, smart object formatting, type filtering, adjustable limit
chrome-cmd tab requests
chrome-cmd tab requests -n 100
chrome-cmd tab requests --method GET
chrome-cmd tab requests --method POST
chrome-cmd tab requests --status 200
chrome-cmd tab requests --status 404
chrome-cmd tab requests --url "/api"
chrome-cmd tab requests --url "google.com"
chrome-cmd tab requests --all
chrome-cmd tab requests --failed
chrome-cmd tab requests --body
chrome-cmd tab requests --headers
chrome-cmd tab requests --method POST --status 200 --url "/api"
chrome-cmd tab requests --details 1Captured data: URL, method, status, headers, payload, response body, timing, type, errors
chrome-cmd tab html
chrome-cmd tab html --selector "div.content"
chrome-cmd tab html --raw
chrome-cmd tab html --include-compacted-tagsFeatures: Pretty printing, CSS selectors, token optimization, raw mode
chrome-cmd tab screenshot
chrome-cmd tab screenshot --output ~/Downloads/page.png
chrome-cmd tab screenshot --tab 2
chrome-cmd tab screenshot --only-viewportchrome-cmd tab storage
chrome-cmd tab storage --cookies
chrome-cmd tab storage --local
chrome-cmd tab storage --sessionData includes: Cookie flags, expiry, size, key-value pairs
chrome-cmd tab click --selector "button.submit"
chrome-cmd tab click --text "Sign In"chrome-cmd tab input --selector "#username" --value "myuser"
chrome-cmd tab input --selector "#search" --value "query" --submit# Install Chrome CMD extension
chrome-cmd install
# Update to latest version
chrome-cmd update
# Shell completion (bash/zsh)
chrome-cmd completion install
chrome-cmd completion uninstall
# Profile management
chrome-cmd profile remove # Remove profile and bridge configuration
chrome-cmd profile select # Select active profile from configured profiles
Click the Chrome CMD extension icon in your browser toolbar to view recent commands, execution times, and results.
:package: Additional Information
Prerequisites: Node.js 18+, Google Chrome, Linux/macOS/Windows
You can use chrome-cmd with multiple Chrome profiles. Just repeat the Quick Start setup for each profile:
- Open your other Chrome profile
- Run
chrome-cmd installagain - Load the extension and paste the Extension ID
To switch between profiles:
chrome-cmd profile select
# → Shows list of registered profiles
# → Type the profile number
# → All commands now run on selected profileTo completely remove chrome-cmd, run these commands in order:
# 1. Remove shell completions (if installed)
chrome-cmd completion uninstall
# 2. Manually remove the Chrome extension
# Open chrome://extensions/ and click "Remove" on the Chrome CMD extension
# 3. Uninstall the CLI package
npm uninstall -g chrome-cmdFor local development:
# Clone repository
git clone https://github.com/lucasvtiradentes/chrome-cmd.git
cd chrome-cmd
# Build CLI
cd packages/cli
npm install
npm run build
# Use with npm run dev
npm run dev -- tabs listLoad extension from packages/chrome-extension/ directory.
The architecture uses a 3-layer design to enable terminal control of Chrome:
┌──────────────────────────────────────────────────────────────────────┐
│ LAYER 1: Command Line Interface │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ $ chrome-cmd tab exec "document.title" │ │
│ │ │ │
│ │ • Commander.js for CLI parsing │ │
│ │ • BridgeClient sends HTTP to bridge │ │
│ │ • ConfigManager selects active Chrome profile │ │
│ └────────────────────────────────────────────────────────────────┘ │
└────────────────────────────────┬─────────────────────────────────────┘
│
HTTP POST Request
http://localhost:8765-8774
│
┌────────────────────────────────▼─────────────────────────────────────┐
│ LAYER 2: Bridge Server │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ Node.js HTTP Server + Native Messaging Bridge │ │
│ │ │ │
│ │ • One instance per Chrome profile (auto-started) │ │
│ │ • HTTP server on dynamic port (8765-8774) │ │
│ │ • Converts HTTP ↔ Chrome Native Messaging (stdin/stdout) │ │
│ │ • Registered in ~/.config/chrome-cmd/bridges.json │ │
│ └────────────────────────────────────────────────────────────────┘ │
└────────────────────────────────┬─────────────────────────────────────┘
│
Native Messaging Protocol
(stdin/stdout JSON)
│
┌────────────────────────────────▼─────────────────────────────────────┐
│ LAYER 3: Chrome Extension (Service Worker) │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ background.ts - Main command handler │ │
│ │ │ │
│ │ • Connects to bridge via chrome.runtime.connectNative() │ │
│ │ • Dispatches commands to chrome.debugger API │ │
│ │ • Returns results through bridge to CLI │ │
│ │ • popup.ts shows command history │ │
│ └────────────────────────────┬───────────────────────────────────┘ │
└────────────────────────────────┼─────────────────────────────────────┘
│
Chrome Debugger Protocol (CDP)
chrome.debugger.sendCommand()
│
┌────────────▼─────────────┐
│ Chrome Tabs │
│ │
│ • Execute JavaScript │
│ • Network monitoring │
│ • Console log capture │
│ • Screenshots │
│ • DOM manipulation │
└──────────────────────────┘Key Features:
- Multi-profile support: Each Chrome profile gets its own bridge instance
- Auto-recovery: Bridge auto-starts when extension connects
- Port allocation: Dynamic ports (8765-8774) prevent conflicts
- Bi-directional: Commands flow down, results flow back up
Required permissions:
debugger- Execute JavaScript, capture screenshots, monitor network/consolescripting- Inject content script for command details modal in popuptabs- List and manage tabs, navigate, focus windowsnativeMessaging- Connect CLI to Chrome extension via bridgestorage- Track command history in extension popupidentity+identity.email- Auto-detect Chrome profile name (email)management- Get extension installation info
⚠️ Not suitable for Chrome Web Store distribution (requires debugger permission)
:star: Inspiration
- BroTab - Original Python implementation
