Automate browser tasks in the user's real Chrome session via the agent-browser CLI.
Works with
AI-first code editor with Composer
Before installing skills in Cursor, ensure your development environment meets these requirements:
node --versionchrome-automationExecute the skills CLI command in your project's root directory to begin installation:
Fetches chrome-automation from zc277584121/marketing-skills and configures it for Cursor.
The CLI shows a list of agents. Use arrow keys and space to select Cursor:
Confirm successful installation by checking the skill directory location:
Restart Cursor to activate chrome-automation. Access via /chrome-automation in your agent's command palette.
We perform automated surface-level scans (Gen AI Scanner, Socket, Snyk) during installation. These checks detect common vulnerabilities but do not guarantee complete security. Always review skill source code and verify the publisher's reputation before production use.
Skills execute code in your environment. Always review source, verify the publisher, and test in isolation before production.
Submit your Claude Code skill and start earning
Create detailed user stories, acceptance criteria, and feature specs
Example
Generate user stories for 'password reset feature' with acceptance criteria, edge cases, and test scenarios
Reduce spec writing time by 50%, ensure comprehensive coverage
Research competitors, compare features, identify gaps
Example
Analyze 5 competitor products, create feature comparison matrix, suggest differentiation opportunities
Complete competitive research in 2 hours instead of 2 days
Evaluate features using frameworks (RICE, ICE, Kano) and create prioritized backlogs
Example
Score 20 feature ideas using RICE framework, generate prioritized roadmap with rationale
0
total installs
0
this week
0
upvotes
Run in your terminal
0
installs
0
this week
—
stars
Automate browser tasks in the user's real Chrome session via the agent-browser CLI.
Prerequisite: agent-browser must be installed and Chrome must have remote debugging enabled. See
references/agent-browser-setup.mdif unsure.
This skill operates on a single Chrome process — the user's real browser. There is no session management, no separate profiles, no launching a fresh Playwright browser.
Before opening any new page, always list existing tabs first:
agent-browser --auto-connect tab list
This returns all open tabs with their index numbers, titles, and URLs. Check if the page you need is already open:
agent-browser --auto-connect tab <index>
agent-browser --auto-connect open <url>
Always use --auto-connect to connect to the user's running Chrome instance:
agent-browser --auto-connect <command>
This auto-discovers Chrome with remote debugging enabled. If connection fails, guide the user through enabling remote debugging (see references/agent-browser-setup.md).
# List tabs to find existing pages
agent-browser --auto-connect tab list
# Switch to an existing tab (if found)
agent-browser --auto-connect tab <index>
# Or open a new page
agent-browser --auto-connect open https://example.com
agent-browser --auto-connect wait --load networkidle
# Take a snapshot to see interactive elements
agent-browser --auto-connect snapshot -i
# Click, fill, etc.
agent-browser --auto-connect click @e3
agent-browser --auto-connect fill @e5 "some text"
# Get all text content
agent-browser --auto-connect get text body
# Take a screenshot for visual inspection
agent-browser --auto-connect screenshot
# Execute JavaScript for structured data
agent-browser --auto-connect eval "JSON.stringify(document.querySelectorAll('table tr').length)"
The user may provide a recording exported from Chrome DevTools Recorder (JSON, Puppeteer JS, or @puppeteer/replay JS format). See Replaying Recordings below.
Use snapshot -i to see all interactive elements with refs (@e1, @e2, ...):
agent-browser --auto-connect snapshot -i
The output lists each interactive element with its role, text, and ref. Use these refs for subsequent actions.
| Action | Command |
|---|---|
| Navigate | agent-browser --auto-connect open <url> (optionally wait --load networkidle, but some sites like Reddit never reach networkidle — skip if open already shows the page title) |
| Click | snapshot -i → find ref → click @eN |
| Fill standard input | click @eN → fill @eN "text" |
| Fill rich text editor | click @eN → keyboard inserttext "text" |
| Press key | press <key> (Enter, Tab, Escape, etc.) |
| Scroll | scroll down <amount> or scroll up <amount> |
| Wait for element | wait @eN or wait "<css-selector>" |
| Screenshot | screenshot or screenshot --annotate |
| Get page text | get text body |
| Get current URL | get url |
| Run JavaScript | eval <js> |
fillkeyboard inserttextRefs (@e1, @e2, ...) are invalidated when the page changes. Always re-snapshot after:
After each significant action, verify the result:
agent-browser --auto-connect snapshot -i # check interactive state
agent-browser --auto-connect screenshot # visual verification
JSON (recommended) — structured, can be read progressively:
# Count steps
jq '.steps | length' recording.json
# Read first 5 steps
jq '.steps[0:5]' recording.json
@puppeteer/replay JS (import { createRunner })
Puppeteer JS (require('puppeteer'), page.goto, Locator.race)
navigate steps, reusing existing tabs when possible.snapshot -i) to see current interactive elementsaria/... selectors against the snapshottext/..., then CSS class hints, then screenshotsnapshot -i operates on the main frame only and cannot penetrate iframes. Sites like LinkedIn, Gmail, and embedded editors render content inside iframes.
snapshot -i returns unexpectedly short or empty resultsget text body content doesn't match what a screenshot showsUse eval to access iframe content:
agent-browser --auto-connect eval --stdin <<'EVALEOF'
const frame = document.querySelector('iframe[data-testid="interop-iframe"]');
const doc = frame.contentDocument;
const btn = doc.querySelector('button[aria-label="Send"]');
btn.click();
EVALEOF
Note: Only works for same-origin iframes.
Use keyboard for blind input: If the iframe element has focus, keyboard inserttext "..." sends text regardless of frame boundaries.
Use get text body to read full page content including iframes.
Use screenshot for visual verification when snapshot is unreliable.
If workarounds fail after 2 attempts on the same step, pause and explain:
find text "Dismiss" click or find text "Close" click)find text "..." click, or scroll to reveal with scroll down 300When pausing, explain clearly: what step you are on, what you expected, and what you see.
| Command | Description |
|---|---|
tab list |
List all open tabs with index, title, and URL |
tab <index> |
Switch to an existing tab by index |
tab new |
Open a new empty tab |
tab close |
Close the current tab |
open <url> |
Navigate to URL |
snapshot -i |
List interactive elements with refs |
click @eN |
Click element by ref |
fill @eN "text" |
Clear and fill standard input/textarea |
type @eN "text" |
Type without clearing |
keyboard inserttext "text" |
Insert text (best for contenteditable) |
press <key> |
Press keyboard key |
scroll down/up <amount> |
Scroll page in pixels |
wait @eN |
Wait for element to appear |
wait --load networkidle |
Wait for network to settle |
wait <ms> |
Wait for a duration |
screenshot [path] |
Take screenshot |
screenshot --annotate |
Screenshot with numbered labels |
eval <js> |
Execute JavaScript in page |
get text body |
Get all text content |
get url |
Get current URL |
set viewport <w> <h> |
Set viewport size |
find text "..." click |
Semantic find and click |
close |
Close browser session |
snapshot -i cannot see inside iframes. See Iframe-Heavy Sites.find text strict mode: Fails when multiple elements match. Use snapshot -i to locate the specific ref instead.fill vs contenteditable: fill only works on <input> and <textarea>. For rich text editors, use keyboard inserttext.eval is main-frame only: To interact with iframe content, traverse via document.querySelector('iframe').contentDocument...When the user requests an action across multiple platforms (e.g., "publish this article to Dev.to, LinkedIn, and X"), do NOT attempt all platforms in a single conversation. Instead, launch sequential Agent subagents, one per platform.
Each platform operation consumes ~25-40K tokens (reference file + snapshots + interactions). Running 3-5 platforms in one context risks hitting the 200K token limit and degrading late-platform accuracy. Each subagent gets its own fresh 200K context window.
general-purpose Agent subagent with a prompt that includes:
Read /path/to/skills/chrome-automation/references/x.md)--auto-connect. Parallel subagents would cause tab conflicts.You are automating a browser task on [PLATFORM].
First, read these files for context:
- /absolute/path/to/skills/chrome-automation/references/[platform].md
- /absolute/path/to/.claude/skills/agent-browser/SKILL.md (agent-browser command reference)
Then connect to the user's Chrome browser using `agent-browser --auto-connect` and perform the following task:
[TASK DESCRIPTION]
Content to publish:
[CONTENT]
Important:
- Always list tabs first (`tab list`) and reuse existing logged-in tabs
- Re-snapshot after every navigation or action
- Confirm with the user before submitting/publishing (destructive action)
- If login is required or a CAPTCHA appears, stop and explain
When automating tasks on specific platforms, consult the relevant reference document for page structure details, common operations, and known quirks:
| Platform | Reference | Key Notes |
|---|---|---|
references/reddit.md |
Custom faceplate-* components; networkidle never reached; unlabeled comment textbox; find text fails due to duplicate elements |
|
| X (Twitter) | references/x.md |
open often times out (use tab list to reuse existing tabs); click timestamp for post detail (not username); DraftJS contenteditable input (data-testid="tweetTextarea_0"); avoid networkidle |
references/linkedin.md |
Ember.js SPA; Enter submits comments (use Shift+Enter for newlines); comment box and compose box share the same label; avoid networkidle; messaging overlay may block content |
|
| Dev.to | references/devto.md |
Fast server-rendered HTML (Forem/Rails); standard <textarea> for comments/posts (Markdown); 5 reaction types; Algolia-powered search; networkidle works normally |
| Hacker News | references/hackernews.md |
Minimal plain HTML; all form fields are unlabeled; link "reply" navigates to separate page; networkidle works instantly; rate limiting on posts/comments |
For installation and Chrome setup instructions, see
references/agent-browser-setup.md.
Make data-driven prioritization decisions faster
Draft PRDs, status updates, and stakeholder presentations
Example
Create executive summary of Q3 roadmap, monthly progress report, feature launch announcement
Save 3-5 hours/week on communication overhead
Prerequisites
Time Estimate
30-60 minutes to see productivity improvements
Steps
Common Pitfalls
✓ Do
✗ Don't
💡 Pro Tips
✓ Use when
Use for user story writing, competitive research, roadmap prioritization, stakeholder communication, and PRD drafting. Best for reducing repetitive documentation and research work.
✗ Avoid when
Avoid for strategic product vision (requires deep customer empathy), pricing decisions (needs market and financial expertise), or when face-to-face customer discovery is more valuable than speed.
mattpocock/skills
parcadei/continuous-claude-v3
cursor/plugins
ailabs-393/ai-labs-claude-skills
ailabs-393/ai-labs-claude-skills
pproenca/dot-skills
Useful defaults in chrome-automation — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
chrome-automation is among the better-maintained entries we tried; worth keeping pinned for repeat workflows.
Keeps context tight: chrome-automation is the kind of skill you can hand to a new teammate without a long onboarding doc.
Keeps context tight: chrome-automation is the kind of skill you can hand to a new teammate without a long onboarding doc.
chrome-automation is among the better-maintained entries we tried; worth keeping pinned for repeat workflows.
chrome-automation has been reliable in day-to-day use. Documentation quality is above average for community skills.
Keeps context tight: chrome-automation is the kind of skill you can hand to a new teammate without a long onboarding doc.
chrome-automation has been reliable in day-to-day use. Documentation quality is above average for community skills.
Useful defaults in chrome-automation — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
Solid pick for teams standardizing on skills: chrome-automation is focused, and the summary matches what you get after install.
showing 1-10 of 48