skills/use-profiles/SKILL.md
Load saved Playwright storageState authentication profiles before browser automation. Activates when `.playwright/profiles.json` exists and browser work begins on authenticated pages. Trigger phrases include "use profile", "load profile", "browser as [role]", "authenticated browser", "logged in browser session".
npx skillsauth add neonwatty/claude-skills use-profilesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Load saved Playwright storageState authentication profiles before browser automation work. This eliminates the need to log in manually at the start of every browser session.
This skill applies when ALL of the following are true:
.playwright/profiles.json fileCheck for .playwright/profiles.json at the project root. Read it to discover available profiles. The file contains entries like:
{
"profiles": {
"admin": {
"loginUrl": "https://example.com/login",
"description": "Full permissions",
"createdAt": "2026-03-31T12:00:00Z"
}
}
}
Each profile has a corresponding storageState file at .playwright/profiles/<role-name>.json.
Determine which profile to use based on conversation context:
Before navigating to any authenticated page, load the profile using playwright-cli via the Bash tool. The {session} placeholder below refers to the current named session (e.g., runner-desktop, qa-ux — set by the invoking skill or command).
Verify the storageState file exists at .playwright/profiles/<role-name>.json. If it does not exist, inform the user and suggest running /setup-profiles to create it.
Load the profile's cookies and localStorage into the browser session:
playwright-cli -s={session} state-load ".playwright/profiles/<role-name>.json"
This restores all cookies and per-origin localStorage from the storageState JSON — the same format used by Playwright's storageState().
If the profile JSON contains a sessionStorage field (not part of standard storageState — added by /setup-profiles), restore it separately after navigating to the target origin:
playwright-cli -s={session} goto "<origin>"
Then for each sessionStorage entry:
playwright-cli -s={session} sessionstorage-set "<name>" "<value>"
Navigate to the target authenticated page. Cookies are sent with the request, localStorage is already populated, and sessionStorage is restored — so server-side, client-side, and SPA auth libraries (Supabase, Firebase, Auth0) will recognize the session.
After loading a profile, check whether it has a files array and/or acceptance object in profiles.json. These are optional fields — many profiles will not have them.
If the profile has files, inform the caller with a summary:
This profile has N test data file(s) available:
- valid-deck.pptx — Clean deck, passes all checks
- profanity-deck.pptx — Profanity in notes, should flag
- (cloud) oversized-deck.pptx — 200MB deck, tests size limit
Profile acceptance criteria: upload accepted, processing completes
Mark cloud-hosted files (those with url instead of path) with (cloud) for clarity.
This information is surfaced but not acted on by this skill — the consumer (workflow generator, runner, agent) decides whether and how to use it.
For each file entry with a path field, verify the file exists at the given path relative to the project root. If a file is missing, warn:
Profile "speaker" references test file "test-fixtures/valid-deck.pptx" which does not exist. The file may have been moved or deleted.
Do not fail or block on missing files — just warn. Files with url are not validated (they may require authentication or be on private networks).
If the profile has acceptance, include a human-readable summary of the configured criteria. Map the fields as follows:
| Field | Summary text |
|-------|-------------|
| uploadAccepted: true | upload accepted |
| processingCompletes: true | processing completes |
| resultDownloadable: true | result downloadable |
| errorExpected: true | error expected |
| expectedStatus: "clear" | expected status: "clear" |
If individual files have acceptance overrides, note which files override the profile defaults:
File "corrupted.pptx" overrides profile acceptance: upload rejected, error expected
After loading a profile and navigating to the target page, check whether the session is still valid using these heuristics in order:
loginUrl from the profile config, the session has likely expired. Check the URL in the snapshot output's Page URL line.accounts.google.com, auth0.com), the app redirected to an OAuth provider — the session has expired.playwright-cli -s={session} snapshot via Bash and look for login-related elements: sign-in forms, "Log in" / "Sign in" buttons, or "session expired" text. If the target page was expected to show authenticated content but instead shows a login UI, the session has expired.If expiry is detected:
/setup-profiles to refresh itThese heuristics are best-effort. The user can always run /setup-profiles manually to refresh any profile.
If .playwright/profiles.json exists but references profiles whose storageState files are missing (e.g., after a fresh clone), inform the user:
"This project has Playwright profiles configured but the authentication state files are missing (they are gitignored and need to be created locally). Run
/setup-profilesto authenticate."
If .playwright/profiles.json does not exist, this skill does not apply. Do not suggest creating profiles unless the user is explicitly asking about authenticated browser automation.
tools
Analyzes web apps for free-value trust-building opportunities — features, tools, and offerings that demonstrate genuine utility before asking for commitment. Use this when the user says "trust builder", "trust audit", "find free offerings", "free value analysis", "trust building opportunities", or "how can I build trust with users". Explores the codebase and live app, interviews the user about audience and goals, then generates a prioritized report with full mini-specs for the top trust-building features.
tools
Filters and submits accumulated QA learnings as a GitHub issue (with optional PR) on the plugin repo. Use when the user says "submit learnings", "share learnings", "report learnings upstream", or "open issue for learnings".
tools
Synthesizes accumulated QA learnings from .qa-learnings/ledger.md into prioritized, actionable plugin improvements. Use when the user says "review learnings", "what have we learned", "improve the plugin", "learnings report", or "synthesize QA feedback".
development
Audits web apps for resilience against unexpected user behavior — accidental, edge-case, and chaotic. Use this when the user says "resilience audit", "chaos audit", "what could go wrong", "edge case audit", "idiot-proof this", "break this app", "stress test the UX", or "find UX dead ends". Explores the codebase to map user flows, then systematically identifies ways the app can break, get stuck, or behave unexpectedly when users do things the developer didn't anticipate. Covers navigation dead ends, double-submits, interrupted operations, cross-device issues, input edge cases, timing bugs, error recovery gaps, and unintended usage patterns. Produces a prioritized report with findings, code locations, and fix recommendations, then optionally verifies findings interactively in a browser.