From playwright-profiles
This skill should be used when the user asks to "sign into Cloudflare", "browse Sentry authenticated", "open Supabase dashboard", "log into Vercel", "check auth status", "authenticate to AWS", or any request to browse an external service that requires authentication using playwright-cli. Also triggers on "sign in to <site>", "authenticate to <site>", "open <site> logged in", "browse <service> for me". Complements use-profiles (per-project roles) by providing global persistent auth for external services. Defaults to Chromium; uses real Chrome (`--tier chrome`) only for bot-protected sites.
npx claudepluginhub neonwatty/playwright-profiles --plugin playwright-profilesThis skill uses the workspace's default tool permissions.
Browse external services (Cloudflare, Sentry, PostHog, Supabase, Vercel, GitHub, AWS, etc.) using `playwright-cli` with persistent authentication. Defaults to Playwright's bundled Chromium (works while Chrome is open); use `--tier chrome` for sites with bot detection.
Mandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
Browse external services (Cloudflare, Sentry, PostHog, Supabase, Vercel, GitHub, AWS, etc.) using playwright-cli with persistent authentication. Defaults to Playwright's bundled Chromium (works while Chrome is open); use --tier chrome for sites with bot detection.
playwright-cli with persistent authentication. Defaults to Chromium; uses real Chrome for bot-protected sitesBoth skills can coexist. Use use-profiles for testing your app with different roles. Use auth-browse for browsing third-party services.
All auth state lives in ~/.playwright-cli/:
~/.playwright-cli/
├── sign-in.mjs ← Sign-in script (bundled with this skill)
├── chrome-profile/ ← Default Chrome profile (shared across all sites)
├── chrome-profile-<name>/ ← Isolated profiles (--profile flag, for multi-user)
├── sites.json ← User-added custom site shortcuts
├── auth-cloudflare.json ← Per-site cookie snapshots
├── auth-sentry.json
├── package.json ← Playwright dependency
└── node_modules/
The persistent Chrome profile accumulates sessions from all sign-ins. When browsing with --persistent --profile, all sites are already authenticated.
First-time setup requires installing the script and its dependency:
mkdir -p ~/.playwright-cli
cp <path-to-this-skill>/scripts/sign-in.mjs ~/.playwright-cli/sign-in.mjs
cp <path-to-this-skill>/scripts/cookie-analysis.mjs ~/.playwright-cli/cookie-analysis.mjs
cd ~/.playwright-cli && npm init -y && npm install playwright
The script path for this skill is relative to the plugin install location. Use Glob to find it:
skills/auth-browse/scripts/sign-in.mjs
Before browsing any external service, perform these checks:
The login command defaults to Playwright's bundled Chromium (--tier chromium), which works while the user's Chrome is open. If the login is blocked by bot detection (Cloudflare Turnstile, Google OAuth "This browser is not secure"), the user should retry with --tier chrome:
node ~/.playwright-cli/sign-in.mjs login <site> --tier chrome
The --tier chrome preference is saved per-site in sites.json — future logins for that site automatically use real Chrome. The user must close their personal Chrome before running --tier chrome.
Do not assume which sites need --tier chrome. Let the user discover it on first login. The script prints a hint when login appears to fail.
Before loading any auth state, check whether it is still valid:
node ~/.playwright-cli/sign-in.mjs check <site> via Bash.Status: EXPIRED or any ⚠ Auth ... EXPIRED lines, the auth is stale.node ~/.playwright-cli/sign-in.mjs login <site>) before attempting to browse. Do not load expired auth and navigate — it wastes time.node ~/.playwright-cli/sign-in.mjs check # all sites
node ~/.playwright-cli/sign-in.mjs check cloudflare # specific site
If auth is valid, skip to Step 3.
The sign-in command is interactive — it opens a browser for manual sign-in. This cannot be run via the Bash tool. Tell the user to run it in a separate terminal:
node ~/.playwright-cli/sign-in.mjs login <site>
The script auto-detects sign-in completion by watching the URL and saves automatically. It also accepts Enter as a manual fallback.
Do NOT use the Bash tool or ! prefix — the command requires interactive stdin.
Built-in sites: github, cloudflare, vercel, sentry, posthog, supabase, aws, netlify, railway, render. Users can add custom sites:
node ~/.playwright-cli/sign-in.mjs add myapp https://myapp.com/login myapp.com/dashboard
For arbitrary URLs without adding a shortcut: node ~/.playwright-cli/sign-in.mjs login https://example.com
Choose the right tier based on the target site:
Tier 1: state-load (default for most sites):
Injects cookies into the existing headless session. Non-interfering — respects cli.config.json and per-repo session isolation.
playwright-cli open <url>
playwright-cli state-load ~/.playwright-cli/auth-<site>.json
playwright-cli reload
Tier 2: --persistent --profile (when state-load fails due to bot detection):
Uses real Chrome with persistent profile. Overrides session isolation and requires headed mode, but bypasses bot detection.
⚠ Chrome singleton warning: On macOS, only one Chrome binary instance can run at a time. Using
--browser chromelaunches the real Chrome app — if the user's personal Chrome is already open, this will conflict. The Playwright CLI daemon may also leave orphaned Chrome processes that block normal Chrome usage. Always preferstate-load(Tier 1). Only use Tier 2 when Tier 1 fails, and close the session promptly afterward.
playwright-cli open <url> --headed --browser chrome --persistent --profile ~/.playwright-cli/chrome-profile
When unsure, try state-load first. If the site redirects to a login page or shows a bot challenge, fall back to the persistent profile approach.
Within a single playwright-cli session using the persistent profile, navigate freely between authenticated services:
playwright-cli goto https://sentry.io
playwright-cli goto https://dash.cloudflare.com
No re-authentication needed — the profile holds all sessions.
By default all sign-ins share ~/.playwright-cli/chrome-profile/. To maintain separate sessions (e.g., different accounts on the same service), use --profile:
node ~/.playwright-cli/sign-in.mjs login github --profile work
node ~/.playwright-cli/sign-in.mjs login github --profile personal
Browse with the isolated profile. Note: state-load uses the auth file keyed by site name, so multiple profiles on the same domain (e.g., github --profile work and github --profile personal) both write to auth-github.json — the second overwrites the first. For multi-user isolation on the same domain, use the persistent profile approach:
playwright-cli open https://github.com --headed --browser chrome \
--persistent --profile ~/.playwright-cli/chrome-profile-work
For different sites (no multi-user conflict), state-load works fine:
playwright-cli open https://github.com
playwright-cli state-load ~/.playwright-cli/auth-github.json
playwright-cli reload
See the capture-auth skill for a full multi-user/QA workflow.
Only one Chrome process can use a profile at a time. If the sign-in script fails with "Chrome is already running with profile":
kill $(pgrep -f "chrome-profile")
Then re-run the sign-in command.
The Playwright CLI runs browser sessions as background daemon processes. If a session using --browser chrome is not closed properly, the orphaned Chrome process can block normal Chrome usage on macOS (clicking Chrome opens a blank window or does nothing).
Symptoms:
ps aux | grep "Google Chrome" shows Chrome processes you didn't launchplaywright-cli list shows sessions with no active socketFix:
# Kill all playwright-cli daemons
playwright-cli kill-all
# If Chrome is still stuck, kill orphaned Chrome processes
pkill -f "Google Chrome.*remote-debugging-port"
# Verify cleanup
playwright-cli list
Prevention: Always close Tier 2 browsing sessions when done. Prefer state-load (Tier 1) to avoid this entirely.
references/bot-detection.md — Detailed explanation of Google OAuth and Cloudflare Turnstile detection mechanisms, why specific Chrome flags are needed, and per-site compatibility matrixscripts/sign-in.mjs — The sign-in script to install at ~/.playwright-cli/sign-in.mjs