/browser-probe
Probe a URL with escalating headless browser configurations to detect CDN bot protection (Akamai, Cloudflare, DataDome, AWS WAF) and produce a browser-recipe.json that downstream playwright-cli consumers use to bypass blocking. Runs an automated escalation ladder: default
$ npx -y skills add adobe/skills --skill browser-probe --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/browser-probe
Context preview
The summary Claude sees to decide when to auto-load this skill.
Probe a URL with escalating headless browser configurations to detect CDN bot protection (Akamai, Cloudflare, DataDome, AWS WAF) and produce a browser-recipe.json that downstream playwright-cli consumers use to bypass blocking. Runs an automated escalation ladder: default
SKILL.md
browser-probe.SKILL.mdname: browser-probe
license: Apache-2.0
compatibility: Requires playwright-cli on PATH. Run `playwright-cli --help` for usage.
description: >-
Probe a URL with escalating headless browser configurations to detect CDN bot
protection (Akamai, Cloudflare, DataDome, AWS WAF) and produce a
browser-recipe.json that downstream playwright-cli consumers use to bypass
blocking. Runs an automated escalation ladder: default headless → stealth
script injection → system Chrome (TLS fingerprint fix) → persistent profile.
Use BEFORE any playwright-cli interaction with an untrusted domain. Triggers
on: browser probe, site blocked, headless blocked, CDN blocking, bot
detection, browser recipe, can't load page, 403 error page, access denied.
Browser Probe
Detect CDN bot protection blocking headless Chrome and produce a browser recipe for downstream `playwright-cli` consumers. Node 22+ required. No npm dependencies.
When to Use
Run **before** any `playwright-cli` interaction with an untested domain, or when a downstream script reports a blocked/empty page (403, "access denied", "captcha").
Script Location
if [[ -n "${CLAUDE_SKILL_DIR:-}" ]]; then
PROBE_DIR="${CLAUDE_SKILL_DIR}/scripts"
else
PROBE_DIR="$(dirname "$(command -v browser-probe.js 2>/dev/null || \
find ~/.claude -path "*/browser-probe/scripts/browser-probe.js" \
-type f 2>/dev/null | head -1)")"
fiWorkflow
Step 1 — Run the probe
node "$PROBE_DIR/browser-probe.js" "$URL" "$OUTPUT_DIR"
The script tries up to 5 browser configurations, stopping at the first success:
1. **default** — headless Chromium (baseline) 2. **stealth** — headless Chromium + JS stealth init script (patches `navigator.webdriver`, plugins, languages) 3. **stealth-ua** — headless Chromium + JS stealth + User-Agent override (removes `HeadlessChrome` from HTTP UA header via `--user-agent` launch arg) 4. **chrome** — system Chrome (`--browser=chrome`) + JS stealth + UA override (fixes TLS fingerprint detection) 5. **persistent** — system Chrome + JS stealth + UA override + persistent profile (cookie/session challenges)
Output: `$OUTPUT_DIR/probe-report.json`
Step 2 — Read the report
Load `probe-report.json`. Check `firstSuccess`:
- If non-null: a configuration worked. Proceed to Step 3.
- If null: all configurations failed. Skip to Step 5.
Step 3 — Interpret results
Match `detectedSignals` against the Provider Signature Table in `references/stealth-config.md` to confirm why blocking occurred and validate that `firstSuccess` is the minimum sufficient config.
Step 4 — Generate recipe
Write `browser-recipe.json` to `$OUTPUT_DIR`:
{
"url": "<probed URL>",
"generated": "<ISO timestamp>",
"cliConfig": {
"browser": {
"browserName": "chromium",
"launchOptions": { "channel": "<from firstSuccess step>" }
}
},
"stealthInitScript": "<full script from stealth-config.md if stealth was needed>",
"notes": "<1-2 sentence explanation of what was detected and why this config>"
}**Config mapping from `firstSuccess`:**
| firstSuccess | channel | args | stealthInitScript | |---|---|---|---| | `default` | — | — | null | | `stealth` | — | — | from reference | | `stealth-ua` | — | `--user-agent=<realistic UA>` | from reference | | `chrome` | `chrome` | `--user-agent=<realistic UA>` | from reference | | `persistent` | `chrome` | `--user-agent=<realistic UA>` | from reference |
If `firstSuccess` is `persistent`, add `"persistent": true` to the recipe.
Step 5 — Report results
**If a configuration worked:**
Browser probe complete for <url>.
Working config: <firstSuccess>
Detected: <detectedSignals or "no bot protection detected">
Recipe: <path to browser-recipe.json>
**If all configurations failed:**
Browser probe failed for <url>. No headless configuration could load the page.
Tried: default, stealth, stealth-ua, chrome, persistent
Detected signals: <detectedSignals>
Options:
1. Use --headed flag for manual browser interaction
2. Provide pre-captured data (DOM snapshot, screenshots) manually
3. Check if the URL requires authentication or VPN access
Do NOT produce a recipe when all steps fail. Do NOT silently continue with a broken configuration.
How Consumers Use the Recipe
Pass `--config=<path-to-cliConfig>` to `playwright-cli open`. If the recipe has `stealthInitScript`, add it to `browser.initScript` in the config (not via `eval` — eval is expression-only). If `"persistent": true`, also pass `--persistent`. Run `playwright-cli --help` for the full command reference.
Read more
name: browser-probe license: Apache-2.0 compatibility: Requires playwright-cli on PATH. Run `playwright-cli --help` for usage. description: >- Probe a URL with escalating headless browser configurations to detect CDN bot protection (Akamai, Cloudflare, DataDome, AWS WAF) and produce a browser-recipe.json that downstream playwright-cli consumers use to bypass blocking. Runs an automated escalation ladder: default headless → stealth script injection → system Chrome (TLS fingerprint fix) → persistent profile. Use BEFORE any playwright-cli interaction with an untrusted domain. Triggers on: browser probe, site blocked, headless blocked, CDN blocking, bot detection, browser recipe, can't load page, 403 error page, access denied.
Browser Probe
Detect CDN bot protection blocking headless Chrome and produce a browser recipe for downstream `playwright-cli` consumers. Node 22+ required. No npm dependencies.
When to Use
Run **before** any `playwright-cli` interaction with an untested domain, or when a downstream script reports a blocked/empty page (403, "access denied", "captcha").
Script Location
if [[ -n "${CLAUDE_SKILL_DIR:-}" ]]; then
PROBE_DIR="${CLAUDE_SKILL_DIR}/scripts"
else
PROBE_DIR="$(dirname "$(command -v browser-probe.js 2>/dev/null || \
find ~/.claude -path "*/browser-probe/scripts/browser-probe.js" \
-type f 2>/dev/null | head -1)")"
fiWorkflow
Step 1 — Run the probe
node "$PROBE_DIR/browser-probe.js" "$URL" "$OUTPUT_DIR"
The script tries up to 5 browser configurations, stopping at the first success:
1. **default** — headless Chromium (baseline) 2. **stealth** — headless Chromium + JS stealth init script (patches `navigator.webdriver`, plugins, languages) 3. **stealth-ua** — headless Chromium + JS stealth + User-Agent override (removes `HeadlessChrome` from HTTP UA header via `--user-agent` launch arg) 4. **chrome** — system Chrome (`--browser=chrome`) + JS stealth + UA override (fixes TLS fingerprint detection) 5. **persistent** — system Chrome + JS stealth + UA override + persistent profile (cookie/session challenges)
Output: `$OUTPUT_DIR/probe-report.json`
Step 2 — Read the report
Load `probe-report.json`. Check `firstSuccess`:
- If non-null: a configuration worked. Proceed to Step 3.
- If null: all configurations failed. Skip to Step 5.
Step 3 — Interpret results
Match `detectedSignals` against the Provider Signature Table in `references/stealth-config.md` to confirm why blocking occurred and validate that `firstSuccess` is the minimum sufficient config.
Step 4 — Generate recipe
Write `browser-recipe.json` to `$OUTPUT_DIR`:
{
"url": "<probed URL>",
"generated": "<ISO timestamp>",
"cliConfig": {
"browser": {
"browserName": "chromium",
"launchOptions": { "channel": "<from firstSuccess step>" }
}
},
"stealthInitScript": "<full script from stealth-config.md if stealth was needed>",
"notes": "<1-2 sentence explanation of what was detected and why this config>"
}**Config mapping from `firstSuccess`:**
| firstSuccess | channel | args | stealthInitScript | |---|---|---|---| | `default` | — | — | null | | `stealth` | — | — | from reference | | `stealth-ua` | — | `--user-agent=<realistic UA>` | from reference | | `chrome` | `chrome` | `--user-agent=<realistic UA>` | from reference | | `persistent` | `chrome` | `--user-agent=<realistic UA>` | from reference |
If `firstSuccess` is `persistent`, add `"persistent": true` to the recipe.
Step 5 — Report results
**If a configuration worked:**
Browser probe complete for <url>. Working config: <firstSuccess> Detected: <detectedSignals or "no bot protection detected"> Recipe: <path to browser-recipe.json>
**If all configurations failed:**
Browser probe failed for <url>. No headless configuration could load the page. Tried: default, stealth, stealth-ua, chrome, persistent Detected signals: <detectedSignals> Options: 1. Use --headed flag for manual browser interaction 2. Provide pre-captured data (DOM snapshot, screenshots) manually 3. Check if the URL requires authentication or VPN access
Do NOT produce a recipe when all steps fail. Do NOT silently continue with a broken configuration.
How Consumers Use the Recipe
Pass `--config=<path-to-cliConfig>` to `playwright-cli open`. If the recipe has `stealthInitScript`, add it to `browser.initScript` in the config (not via `eval` — eval is expression-only). If `"persistent": true`, also pass `--persistent`. Run `playwright-cli --help` for the full command reference.
Repo: adobe/skills
Other skills on adobe-skills.
- /aa-conversion-funnel-analysis
Analyzes a multi-step conversion funnel to find where visitors drop off and which steps have the worst leakage. Use this skill when someone describes a journey and asks about conversion rates, drop-off, fallout, or step completion. Trigger for "analyze our checkout funnel,"
Open skill - /aa-executive-briefing
Generates a concise, executive-ready performance summary covering key metrics, trends, and what's driving movement. Use this skill when someone needs to produce a briefing, executive summary, performance narrative, or stakeholder readout — for example, "write an exec summary of
Open skill - /aa-kpi-pulse
Produces a compact KPI digest showing how key metrics changed over a period and what's driving the movement. Use this skill when someone asks for a performance summary, a weekly recap, a morning briefing, a KPI update, or any variation of "how did we do this week/month." Also
Open skill - /aa-segment-performance-comparator
Compares the performance of two or more audience segments across key metrics side by side. Use this skill when someone wants to compare audiences or visitor groups — for example, "how do mobile visitors compare to desktop on conversion," "compare new vs. returning visitors,"
Open skill - /aa-top-movers-watchlist
Identifies which items (pages, campaigns, products, channels, regions) had the biggest increases or decreases for a key metric between two time periods. Use this skill when someone asks "what's up and what's down," "which campaigns moved the most," "top gainers and losers,"
Open skill - /cja-dimension-analysis
Comprehensive dimension analysis and reporting for CJA. Use this skill whenever the user wants to analyze one or more dimensions — including cardinality, distribution/skew, trends, anomalies, data quality errors, comparisons, and forecasting. Also trigger when someone asks "what
Open skill

