Stealth browser automation with anti-bot bypass and persistent page state. Use when users need to navigate Cloudflare-protected sites, fill forms, take screenshots, extract web data, or automate browser workflows on sites that block regular automation. Trigger phrases include "go to [url]", "click on", "fill out the form", "take a screenshot", "scrape", "automate", "bypass cloudflare", or any browser interaction request on protected sites.
/plugin marketplace add zippoxer/claude-skills/plugin install subcodex@zippoxer-skillsThis skill inherits all available tools. When active, it can use any tool Claude has access to.
client.pyrequirements.txtserver.pyserver.shsnapshot.pyBrowser automation using nodriver for anti-bot/Cloudflare bypass. Maintains page state across script executions. Write small, focused scripts to accomplish tasks incrementally.
Key difference from dev-browser: Uses nodriver instead of Playwright, which bypasses most anti-bot detection including Cloudflare Turnstile.
get_ai_snapshot() to discover elements and select_snapshot_ref() to interact with themImportant: Each session needs its own server. Do not reuse servers started by other sessions.
Start your server:
./skills/stealth-browser/server.sh &
--headless flag if user requests headless mode.Ready on port XXXX message before running scripts.connect(port=XXXX).If you see "Port 6222 is in use", that's another session's server. Start your own on the suggested port:
./skills/stealth-browser/server.sh --port 6223 &
Execute scripts inline using heredocs. Use the port from your server startup:
cd skills/stealth-browser && source venv/bin/activate && python <<'EOF'
from client import connect
client = connect(port=6222) # Use YOUR server's port!
page = client.page("example") # descriptive name like "cnn-homepage"
page.goto("https://example.com")
print(f"Title: {page.title()}")
print(f"URL: {page.url}")
client.disconnect()
EOF
Write to tmp/ files only when the script needs reuse, is complex, or user explicitly requests it.
"checkout", "login", not "main"client.disconnect() - pages persist on serverpage.evaluate() runs in browser - use JavaScript syntaxFollow this pattern for complex tasks:
from client import connect
client = connect(port=6222) # Connect to YOUR server's port!
page = client.page("name") # Get or create named page
pages = client.list() # List all page names
client.close("name") # Close a page
client.disconnect() # Disconnect (pages persist)
# ARIA Snapshot methods
snapshot = client.get_ai_snapshot("name") # Get accessibility tree (YAML)
ref = client.select_snapshot_ref("name", "e5") # Get element proxy by ref
ref.click() # Click the ref
ref.fill("text") # Fill the ref with text
client = connect(port=6222) # Your server's port
page = client.page("mypage")
# Navigation
page.goto("https://example.com")
# Get state
url = page.url # Current URL (property)
title = page.title() # Page title
# Interaction
page.click("button.submit") # Click by CSS selector
page.fill("input[name=q]", "search term") # Fill input
# JavaScript
result = page.evaluate("document.title") # Run JS, get result
# Screenshots
page.screenshot("screenshot.png") # Saves to tmp/ directory
# Waiting
page.wait_for_selector(".results") # Wait for element
page.screenshot("screenshot.png") # Saves to tmp/screenshot.png
page.screenshot("tmp/full.png") # Explicit path
Use get_ai_snapshot() to discover page elements. Returns YAML-formatted accessibility tree:
- banner:
- link "Hacker News" [ref=e1]
- navigation:
- link "new" [ref=e2]
- main:
- list:
- listitem:
- link "Article Title" [ref=e8]
- link "328 comments" [ref=e9]
- contentinfo:
- textbox [ref=e10]
- /placeholder: "Search"
Interpreting refs:
[ref=eN] - Element reference for interaction (visible, clickable elements only)[checked], [disabled], [expanded] - Element states[level=N] - Heading level/url:, /placeholder: - Element propertiesInteracting with refs:
snapshot = client.get_ai_snapshot("hackernews")
print(snapshot) # Find the ref you need
element = client.select_snapshot_ref("hackernews", "e2")
element.click()
Page state persists after failures. Debug with:
cd skills/stealth-browser && source venv/bin/activate && python <<'EOF'
from client import connect
client = connect(port=6222) # Your server's port
page = client.page("debug")
page.screenshot("debug.png")
print(f"URL: {page.url}")
print(f"Title: {page.title()}")
print(f"Body: {page.evaluate('document.body.innerText.substring(0, 200)')}")
client.disconnect()
EOF
This skill uses nodriver which has built-in stealth patches. Sites protected by Cloudflare (like lowendtalk.com) work automatically:
page.goto("https://lowendtalk.com/")
# No Cloudflare challenge - loads directly!
print(page.title()) # "LowEndTalk" (not "Just a moment...")
| Aspect | dev-browser | stealth-browser |
|---|---|---|
| Language | TypeScript | Python |
| Browser lib | Playwright | nodriver (stealth) |
| Anti-bot | None | Built-in bypass |
| Port | 9222 | 6222 |
| Extension mode | Yes | No |
| Script syntax | npx tsx <<'EOF' | python <<'EOF' |
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.
Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.
Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.