Cloudflare Browser Rendering
einverne/dotfiles
Guide for implementing Cloudflare Browser Rendering - a headless browser automation API for screenshots, PDFs, web scraping, and testing.
Connects to Oxylabs remote agent browsers over the Chrome DevTools Protocol (CDP) with Playwright or Puppeteer.
$ npx skills add oxylabs/agent-skills --skill agent-browser -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install oxylabs/agent-skills agent-browser --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/oxylabs/agent-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/agent-browser .claude/skills/agent-browser && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "agent-browser" agent skill from https://github.com/oxylabs/agent-skills/tree/main/skills/agent-browser into .claude/skills/agent-browser/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agent-browser", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/oxylabs/agent-skills/tree/main/skills/agent-browserType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add oxylabs/agent-skills --skill agent-browser -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install oxylabs/agent-skills agent-browser --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/oxylabs/agent-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/agent-browser .agents/skills/agent-browser && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "agent-browser" agent skill from https://github.com/oxylabs/agent-skills/tree/main/skills/agent-browser into .agents/skills/agent-browser/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agent-browser", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add oxylabs/agent-skills --skill agent-browser -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install oxylabs/agent-skills agent-browser --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/oxylabs/agent-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/agent-browser .cursor/skills/agent-browser && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "agent-browser" agent skill from https://github.com/oxylabs/agent-skills/tree/main/skills/agent-browser into .cursor/skills/agent-browser/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agent-browser", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/oxylabs/agent-skills.git --path skills/agent-browser--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add oxylabs/agent-skills --skill agent-browser -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install oxylabs/agent-skills agent-browser --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/oxylabs/agent-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/agent-browser .gemini/skills/agent-browser && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "agent-browser" agent skill from https://github.com/oxylabs/agent-skills/tree/main/skills/agent-browser into .gemini/skills/agent-browser/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agent-browser", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install oxylabs/agent-skills agent-browserInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add oxylabs/agent-skills --skill agent-browser -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/oxylabs/agent-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/agent-browser .github/skills/agent-browser && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "agent-browser" agent skill from https://github.com/oxylabs/agent-skills/tree/main/skills/agent-browser into .github/skills/agent-browser/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agent-browser", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add oxylabs/agent-skills --skill agent-browser -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install oxylabs/agent-skills agent-browser --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/oxylabs/agent-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/agent-browser .opencode/skills/agent-browser && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "agent-browser" agent skill from https://github.com/oxylabs/agent-skills/tree/main/skills/agent-browser into .opencode/skills/agent-browser/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agent-browser", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
agent-browserConnects to Oxylabs remote agent browsers over the Chrome DevTools Protocol (CDP) with Playwright or Puppeteer.
Agent Browser is an agent skill from oxylabs/agent-skills. Connects to Oxylabs remote agent browsers over the Chrome DevTools Protocol (CDP) with Playwright or Puppeteer. Built-in anti-detection, residential proxies, geo-targeting, persistent sessions and profiles, session recording and live VNC inspection for debugging. Use instead of WebFetch or a local browser whenever a site renders with JavaScript, blocks bots (DataDome, Cloudflare, Akamai), needs a real browser session, screenshots or PDFs. Covers connection, retries, error recovery and safe scraping of protected…
Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 7 other files, including scripts (for example `errors.md`, `examples.md` and `parameters.md`).
It sits in Productivity & Automation, covering Browser automation, Browser testing and Web scraping. It works with Playwright, Puppeteer, JavaScript and Cloudflare. The repository describes itself as: Official Agent skills of Oxylabs products. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit a410198. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 2 files in scripts/ (JavaScript and Python), which the agent can run.
From the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
hb.oxylabs.ioip.oxylabs.ioFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
OXY_UNBLOCKER_PASSWORDOXY_HB_PASSWORDFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Agent Browser loads about 3k tokens when it runs. Until then it costs about 141 tokens; SKILL.md has 1,337 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from oxylabs/agent-skills at commit a410198, republished under its MIT licence (© oxylabs). 1,337 words, ~3,028 tokens.
.claude/skills/agent-browser/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.Remote Chrome sessions with anti-detection, proxy rotation and geo-targeting built in.
Nothing runs locally: you connect over a WebSocket, drive the browser with the CDP library you already
use, and close the session when done. This file holds the rules; the detail lives next to it:
scripts/ (copyable templates), parameters.md, errors.md, examples.md, targets.md.
| Item | Value |
|---|---|
| Endpoint | wss://USERNAME:PASSWORD@hb.oxylabs.io |
| Credentials | OXY_UNBLOCKER_USERNAME / OXY_UNBLOCKER_PASSWORD (aliases: OXY_HB_USERNAME / OXY_HB_PASSWORD) |
| Options | URL query parameters only, e.g. ?p_cc=US&session_name=job-42 (see parameters.md) |
| Libraries | Playwright chromium.connectOverCDP (recommended), Puppeteer puppeteer.connect, any CDP client |
| Dashboard / support | https://hb.oxylabs.io/dashboard · support@oxylabs.io |
Rules that prevent the most common 401:
wss://. Plain ws:// is accepted but sends your password unencrypted.new URL() or urllib.parse: they percent-encode the password and authentication fails._ab12.: cannot be sent in the URL. Ask for a new password or send the
Authorization: Basic header yourself (see examples.md).401 before looking at anything else.Minimal shape (Playwright, JavaScript):
const { chromium } = require("playwright");
const url = `wss://${process.env.OXY_UNBLOCKER_USERNAME}:${process.env.OXY_UNBLOCKER_PASSWORD}@hb.oxylabs.io?p_cc=US`;
const browser = await chromium.connectOverCDP(url, { timeout: 60000 });
try {
const page = await browser.contexts()[0].newPage(); // default context: backed by fingerprint, proxy, o_profile
await page.goto("https://example.com", { waitUntil: "domcontentloaded", timeout: 30000 });
console.log(await page.content());
} finally {
await browser.close(); // always: an unclosed session keeps its concurrency slot
}For real work copy scripts/playwright_scrape.js or scripts/playwright_scrape.py whole instead of
reimplementing. They add the five behaviours everything else in this file assumes:
429, 5xx,
CDP_SESSION_IN_USE, CDP_NO_BROWSERS_AVAILABLE, CDP_BROWSER_OVERWORKED, CDP_BAD_PROXY,
CDP_GENERAL_ERROR, timeouts. 400/401/403 mean the request is wrong: fix, never retry unchanged.image, stylesheet, media, font by default; they cost time and are not needed for data extraction.X-Error-Description response header marks an Oxylabs-side
error on page traffic.browser.close() in finally, and wrap the job in an overall deadline so a wedged session still gets there.Puppeteer, Python async, raw CDP, session hand-over, profiles, recording and fan-out: examples.md.
| Limit (account defaults) | Value | When exceeded |
|---|---|---|
| New sessions per second | 10 | 429 CDP_SESSION_RATE_LIMIT_REACHED (space launches >= 150 ms) |
| Concurrent sessions | 100 | 429 CDP_MAX_CONCURRENT_SESSIONS_REACHED |
| Named (resumable) sessions | 5 | 429 CDP_MAX_PERSISTENT_SESSIONS_REACHED |
Stored profiles (o_profile) | 5 | 403 profile limit reached (5 profiles maximum) |
| Recordings | 10 | 403 recording limit reached (10 recordings maximum) |
| Concurrent inspection viewers | 10 | CDP_VNC_MAX_CONCURRENT_SESSIONS_REACHED |
session_name (^[A-Za-z0-9-]{3,36}$) makes a session resumable for 10 minutes after disconnect.
keep_alive is implied by it; never send keep_alive=true alone (400 keep_alive requires session_name).429 CDP_SESSION_IN_USE: close it first.429 CDP_MAX_CONCURRENT_SESSIONS_REACHED. Closing the Playwright/Puppeteer object is enough.browser.close() wipes open pages and cookies even though a named session stays resumable. To hand a session
over use Puppeteer browser.disconnect() (see examples.md, "Resume a named session"). State that must
outlive a session (logins, clearance cookies) belongs in o_profile, not keep-alive.503 queue timeout after about a minute: back off and retry.
Higher limits via support.Three channels. Handshake: HTTP status plus a short body (Playwright: WebSocket error: <URL with password> <status> then the body; Puppeteer: Unexpected server response: <status>). Post-connect: the WebSocket closes
with code 3000 and a CDP_* reason that only raw clients see; Playwright/Puppeteer just report Target closed,
so treat any disconnect in the first seconds of a session as retryable. In-page: CDP error 1337 for one
refused command. On page traffic, a response with X-Error-Description is an Oxylabs network error (retry);
a block page without it is the target's decision (change approach, do not retry).
connect failed?
├─ 401 ............ fix credentials/scheme, do not retry
├─ 400/403/409 .... fix the named parameter, do not retry unchanged (409: wait 30 s+ for the other session)
├─ 429 ............ backoff; if MAX_CONCURRENT: hunt for unclosed sessions
└─ 5xx/503 ........ backoff, up to ~2 min total
session dropped (close 3000)?
└─ new session with backoff; rotate sticky id on CDP_BAD_PROXY
navigate failed with 1337 Invalid target?
└─ stop; restricted target (section 7)
page shows block / 403 wall?
├─ X-Error-Description present .... Oxylabs network issue: backoff + retry
└─ absent ......................... target decision: change identity, geo, device, pacing (section 5)Every message text with cause and fix: errors.md.
Default parameter set for most jobs: p_cc, nothing else. Every session already gets a fresh fingerprint
and a fresh residential IP, which is what one-shot fetches and fan-outs of independent pages need. Sticky IPs
and stored profiles are opt-in tools for a specific need, never a baseline.
Work order for a protected target. First write a plain script and make it pass: one fresh session per page, the right geo and device, human pacing, then the escalation ladder below. Only when that script still fails after the ladder do you recommend persistent profiles to the user (the setup/consumer pattern below, with why it should help and what it costs: a setup step, the profile cap of 5) and implement them only on their go-ahead. Never add a profile or sticky id on your own initiative.
| Need | Add | Not for |
|---|---|---|
| Several connections must look like one visitor (login, cart, a flow that outlives one session) | proxy_resi_ses_id + proxy_resi_ses_time | one page per session |
| Cookies or a login must survive between jobs (DataDome clearance, authenticated scraping) | o_profile, prepared once by a setup run, after the user agreed | a first attempt; targets that serve without a block |
| Resume the same browser within 10 minutes | session_name | everything else |
When you do use them, the combination is one identity. Keep it consistent:
setup, exactly once : ?o_profile=acme-us-01&o_profile_save=true&p_cc=US&proxy_resi_ses_id=acmeus01&proxy_resi_ses_time=30
consumers, any number: ?o_profile=acme-us-01&p_cc=US&proxy_resi_ses_id=acmeus01&proxy_resi_ses_time=30o_profile_save=true: it earns the cookies (clears the entry page, logs in), verifies the page, closes. Consumer
runs send o_profile=<name> alone: read-only, no write lock, no 409. Never "top up" a profile from a consumer;
when it stops working, run setup again under a new name. In production this is a setup service that prepares and
validates profiles and a consumer service that only uses them (examples.md, "Profile setup and consumer runs").proxy_resi_ses_id + proxy_resi_ses_time pin the exit IP (max 1440 min). A pinned id disables automatic
proxy retry: on CDP_BAD_PROXY rotate to a new id.p_cc/p_city/p_state for an identity that has cookies. Start a new profile and sticky id.p_device: mobile = taps, small scrolls, no hover; desktop (default) = the opposite.
Never set viewport or device metrics yourself; the service owns the fingerprint.p_city) →
p_device=mobile → slow down → inspect (section 6) → recommend persistent profiles to the user → stop and
report. Repeating an identical request is never a rung.Block signatures per vendor, do/don't table and starting values for a new protected target: targets.md.
__session_id, open
https://hb.oxylabs.io/novnc/?id=<id> and watch the session as it runs) and recordings (record=true& record_name=<job> saves a video of the session to replay later in https://hb.oxylabs.io/dashboard; cap 10,
delete old ones there). Both are off by default. Use them yourself after 3 consecutive failures on one
target to confirm what the page actually shows. Snippet in examples.md, "Session id, live inspection and
recording".browser.contexts()[0]. A newContext() is isolated from profile storage and fingerprint tuning.Blocked by default; access requires a short KYC via your account manager: entertainment and streaming,
banking and finance, government sites, gaming platforms, ticketing, webmail, ad networks, third-party IP
checkers. Use https://ip.oxylabs.io/location to verify your exit IP and geo. A blocked target fails
Page.navigate with CDP error 1337 Invalid target.
See also: scripts/ (full Playwright templates, JS and Python), parameters.md (every parameter and its
validation), errors.md (every message), examples.md (Puppeteer, Python async, raw CDP, reconnection,
profiles, recording, fan-out), targets.md (block detection, DataDome playbook).
© oxylabs, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 6 other files (scripts) in skills/agent-browser of oxylabs/agent-skills.
Open the folder on GitHubat commit a410198
Agent Browser next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Agent Browser this skilloxylabs/agent-skills | 875 | — | ~3k | Automated safety check: Pass | MIT | |
| Cloudflare Browser Renderingeinverne/dotfiles | 121 | — | ~4.9k | Automated safety check: Pass | GPL-3.0 | |
| Chrome Devtoolseinverne/dotfiles | 121 | 2 repos | ~1.6k | Automated safety check: Notes | Apache-2.0 | |
| Cloudflare Browser Renderingsecondsky/claude-skills | 227 | — | ~4k | Automated safety check: Pass | MIT | |
| Browserjulianromli/opencode-template | 144 | — | ~475 | Automated safety check: Pass | None | |
| Browser Automationdavila7/claude-code-templates | 32k | 3 repos | ~569 | Automated safety check: Pass | MIT |
einverne/dotfiles
Guide for implementing Cloudflare Browser Rendering - a headless browser automation API for screenshots, PDFs, web scraping, and testing.
einverne/dotfiles
Browser automation, debugging, and performance analysis using Puppeteer CLI scripts.
secondsky/claude-skills
Cloudflare Browser Rendering with Puppeteer/Playwright. An agent skill from secondsky/claude-skills.
julianromli/opencode-template
Minimal Chrome DevTools Protocol tools for browser automation and scraping.
davila7/claude-code-templates
Browser automation powers web testing, scraping, and AI agent interactions.
ynulihao/AgentSkillOS
Non-testing browser automation - web scraping, form filling, screenshot capture, PDF generation, workflow automation.
oxylabs/agent-skills
Oxylabs proxy networks: Residential, Mobile, shared Datacenter/ISP, and Dedicated Datacenter/ISP proxies with geo-targeting, IP rotation, session persistence, and port-based sticky IPs.
oxylabs/agent-skills
YouTube data extraction API and high-bandwidth proxy downloads.
oxylabs/agent-skills
Production-grade web scraping with automatic anti-bot bypass, structured JSON parsing for 40+ targets, and geo-targeting.
oxylabs/agent-skills
Bypasses anti-bot protections using Oxylabs Web Unblocker, an AI-powered proxy that handles fingerprinting, JavaScript rendering, and retries automatically.
Categories
Connects to Oxylabs remote agent browsers over the Chrome DevTools Protocol (CDP) with Playwright or Puppeteer. Agent Browser is an agent skill from oxylabs/agent-skills. Connects to Oxylabs remote agent browsers over the Chrome DevTools Protocol (CDP) with Playwright or Puppeteer.
Agent Browser fits situations like: tasks that involve Browser automation; tasks that involve Browser testing; tasks that involve Web scraping.
Run `npx skills add oxylabs/agent-skills --skill agent-browser -a claude-code`. Or copy the skill folder (skills/agent-browser in oxylabs/agent-skills) into .claude/skills/agent-browser in your project. Claude Code loads it when a task matches its description.
Run `npx skills add oxylabs/agent-skills --skill agent-browser -a codex`. Or copy the skill folder (skills/agent-browser in oxylabs/agent-skills) into .agents/skills/agent-browser in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add oxylabs/agent-skills --skill agent-browser -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/agent-browser, .gemini/skills/agent-browser, .github/skills/agent-browser and .opencode/skills/agent-browser in your project.
Going by SKILL.md and its folder, Agent Browser needs JavaScript and Python for the scripts in its folder and credentials named OXY_UNBLOCKER_PASSWORD and OXY_HB_PASSWORD. Our summary lists: Python 3; Node.js.
SKILL.md names 2 domains. In commands or code: hb.oxylabs.io and ip.oxylabs.io; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Agent Browser is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Agent Browser: Cloudflare Browser Rendering (einverne/dotfiles, 121 stars), Chrome Devtools (einverne/dotfiles, 121 stars), Cloudflare Browser Rendering (secondsky/claude-skills, 227 stars) and Browser (julianromli/opencode-template, 144 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
oxylabs (a GitHub organization) maintains it in oxylabs/agent-skills, which has 875 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on September 30, 2026.
Source: oxylabs/agent-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.