Agent skill

Playwright

by EliasOulkadi in EliasOulkadi/shokunin

Browser automation, web scraping, E2E testing, and visual regression with Playwright.

MITAuto-check: notesTesting & QA

Install Playwright

skills CLI
$ npx skills add EliasOulkadi/shokunin --skill playwright -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install EliasOulkadi/shokunin playwright --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.pack/skills/playwright .claude/skills/playwright && rm -rf skills-src

Use ~/.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/

Facts

Skill name
playwright
GitHub stars
114
Token cost
~3.6k tokens
SKILL.md length
871 words
Files
1
Skills in repo
49
Repo updated
First seen
Licence
MIT

At a glance

Browser automation, web scraping, E2E testing, and visual regression with Playwright.

  • Works in 4 steps: Detect the environment → Select template + generate code → Execute → …
  • User asks to test a website
  • SKILL.md covers Setup, Trigger Decision Tree, Workflow and Smart Defaults, plus 8 more sections
  • Calls npx, npm and node

What it does

Playwright is an agent skill from EliasOulkadi/shokunin. Browser automation, web scraping, E2E testing, and visual regression with Playwright. Covers 30+ patterns: login flows, form testing, responsive design checks, broken link validation, API mocking, data extraction, PDF generation, accessibility audits (axe-core), performance budgets (Lighthouse), visual diffing, multi-browser testing (Chromium/Firefox/WebKit), mobile emulation, infinite scroll, shadow DOM, iframes, file downloads, auth state reuse, cookie consent handling, WebSocket monitoring, console error…

Its SKILL.md is about 3.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts. Compatibility notes: opencode

It sits in Testing & QA, covering Browser testing, Accessibility and Web performance. It works with Playwright, Docker, GitHub Actions and Node.js. The repository describes itself as: 職人 Shokunin 62 AI agent skills for OpenCode, Claude Code, Cursor, Windsurf. ChromaDB memory, MCP servers, declarative self-updates. Multi-model, open source, zero cost. The licence is MIT.

When your agent uses it

  • User asks to test a website
  • Take screenshots
  • Check responsive design
  • Automate a browser task

Example prompts

  • “/playwright”

Requirements

  • Node.js
  • Docker
  • Compatibility (from SKILL.md): opencode

Workflow steps

4 steps, taken from the step headings in SKILL.md.

  1. Detect the environment
  2. Select template + generate code
  3. Execute
  4. Report results

What it can do on your machine

Read from SKILL.md and the folder at commit 4c68e5b. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • npx
    • npm
    • node

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use npx and npm, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

  • Compatibility

    opencode

    From compatibility in the SKILL.md frontmatter.

Context cost

Playwright loads about 3.6k tokens when it runs. Until then it costs about 229 tokens; SKILL.md has 871 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~229
When it runs · the whole SKILL.md, loaded when a task matches
~3.6k

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.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NoteMentions a .env fileSKILL.md:99
    user mentioned login credentials or has `.env` files

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); files beside SKILL.md are not scanned.

SKILL.md

The full file from EliasOulkadi/shokunin at commit 4c68e5b, republished under its MIT licence (© EliasOulkadi). 871 words, ~3,581 tokens.

Download SKILL.mdSave it as .claude/skills/playwright/SKILL.md (or your agent's skills folder).
name
playwright
description
Browser automation, web scraping, E2E testing, and visual regression with Playwright. Covers 30+ patterns: login flows, form testing, responsive design checks, broken link validation, API mocking, data extraction, PDF generation, accessibility audits (axe-core), performance budgets (Lighthouse), visual diffing, multi-browser testing (Chromium/Firefox/WebKit), mobile emulation, infinite scroll, shadow DOM, iframes, file downloads, auth state reuse, cookie consent handling, WebSocket monitoring, console error detection, HAR export, trace viewer, Docker CI, GitHub Actions, and parallel sharding. Use when user asks to test a website, take screenshots, check responsive design, automate a browser task, scrape data, validate forms, check broken links, test login, audit accessibility, or measure page performance. Do NOT use for unit testing, API-only testing, or static analysis. Requires Node.js 18+.
compatibility
opencode
triggers
- "Playwright" - "browser test" - "E2E test" - "visual test" - "screenshot" - "PDF generation" - "web scraping" - "browser automation" - "test form" - "test…
negatives
- "unit testing" - "API testing" - "static analysis" - "load testing" - "quick scraping" -> use agent-browser
license
MIT
metadata
workflow: testing audience: developers version: 2.1.0

Playwright — Browser Automation Skill

Intelligent browser automation executor. Analyzes the user's request, selects the optimal pattern from 30+ built-in templates, generates production-grade Playwright code, and executes it with real-time reporting.

Setup

Playwright must be available in the environment. If not installed:

bash
npm init -y
npm install playwright @playwright/test
npx playwright install chromium

For all 3 browsers:

bash
npx playwright install

Check what's installed:

bash
npx playwright install --dry-run

Trigger Decision Tree

When user asks for browser automation, classify the task:

User request
├── "screenshot" / "capture" / "take a picture"
│   → screenshot template
├── "responsive" / "mobile" / "different sizes"
│   → responsive check + per-viewport screenshots
├── "login" / "sign in" / "authenticate"
│   → login flow with error detection
├── "form" / "fill" / "submit" / "input"
│   → form testing with validation check
├── "broken links" / "check links" / "link validation"
│   → broken link scanner
├── "scrape" / "extract" / "get data" / "crawl"
│   → data extraction (single page or crawl)
├── "mock" / "intercept" / "stub" / "fake api"
│   → API mocking with route interception
├── "accessibility" / "a11y" / "axe" / "wcag"
│   → accessibility audit (requires axe-core)
├── "performance" / "lighthouse" / "speed" / "load time"
│   → performance audit with budgets
├── "visual" / "visual regression" / "diff"
│   → visual comparison screenshots
├── "download" / "file download"
│   → file download handler
├── "console" / "errors" / "logs"
│   → console error detector
├── "pdf" / "generate pdf"
│   → page-to-PDF converter
└── else → generic browse + report

Workflow

Step 1: Detect the environment

Before writing any code, determine what's available:

  • Dev servers: Check common ports (3000, 3001, 5173, 8080, 8000, 4200, 5000, 9000) for running processes
  • Installed browsers: Run npx playwright install --dry-run to see which browsers are available
  • Framework indicators: Look for package.json dependencies (react, vue, svelte, next, nuxt) to understand the app under test
  • Available credentials: Check if the user mentioned login credentials or has .env files
Step 2: Select template + generate code

Based on task classification and environment info, select the appropriate template and customize it with:

  • Detected URL (dev server or user-supplied)
  • Any user-specific parameters (credentials, selectors, viewports)
  • Best-practice patterns auto-inserted (waitForSelector instead of fixed waits, graceful error handling, cleanup in finally)

Rules for code generation:

  • Use getByRole / getByText / getByLabel over CSS selectors (stable, accessible)
  • Parameterize URL in TARGET_URL constant at top
  • Never use waitForTimeout for conditions — use waitForSelector, waitForURL, waitForResponse
  • Always wrap in try/catch/finally with browser.close() in finally
  • Include console.error logging at each step
  • Comment each logical block
  • Write generated file to OS temp dir as playwright-task-{timestamp}.js
Step 3: Execute

Run the generated script directly with Node:

bash
node <path-to-generated-file>

For inline one-off tasks (quick screenshot, check title):

bash
node -e "
const { chromium } = require('playwright');
(async () => {
  const browser = await chromium.launch({ headless: false });
  const page = await browser.newPage();
  await page.goto('$URL');
  console.log('Title:', await page.title());
  await browser.close();
})();
"
Step 4: Report results

Present results based on task type:

TaskOutput format
ScreenshotDisplay path + preview description
ResponsiveTable: viewport × status × screenshot path
LoginPass/fail + redirect URL + session file
Broken linksSummary: working/broken + detailed table
ScrapeNumber of records + sample rows
A11yViolation count + top 3 issues
PerformanceScore table + largest offenders
Visual diffPass/fail + mismatch pixels

Smart Defaults

These are applied automatically to every generated script:

SettingDefaultWhy
headlessfalseUser sees what's happening
slowMo100Visible transitions for debugging
viewport1280x720Standard desktop
Timeout15000 (15s)Balance patience vs feedback
args--no-sandboxLinux/WSL compatibility
TraceOn first failureDiagnostic data
VideoOn failureVisual debug
ScreenshotOn failureVisual assert
Console listenerActiveCapture browser errors
Page error listenerActiveCatch JS exceptions

Important Rules

  • No hardcoded URLs: Always parameterize as TARGET_URL
  • No fixed waits: Use waitForSelector, waitForURL, waitForResponse, waitForLoadState
  • Auth state reuse: Save to .auth/ directory for multi-step flows
  • Temp files only: Write scripts to OS temp dir, never to project or skill dir
  • Failure screenshots: Always capture on error for debugging
  • Close browser: Always browser.close() in finally block

Error Recovery

ErrorDiagnosisResponse
ECONNREFUSEDServer not runningSuggest dev server or check URL
Timeout 30sElement/page not loadingRetry with waitForSelector, suggest specific selector
NoSuchElementWrong selectorAuto-capture page HTML snippet, suggest better selector
Auth failureLogin credentials wrongCapture error message, suggest alternative flow
404/500Bad URL or server errorLog status + body, offer to check URL

Common Fast Patterns

Quick screenshot
javascript
const { chromium } = require('playwright');
(async () => {
  const browser = await chromium.launch({ headless: false });
  const page = await browser.newPage();
  await page.setViewportSize({ width: 1920, height: 1080 });
  await page.goto(TARGET_URL, { waitUntil: 'networkidle' });
  await page.screenshot({ path: `${require('os').tmpdir()}/screenshot.png`, fullPage: true });
  console.log('Screenshot saved to temp/screenshot.png');
  await browser.close();
})();
Quick page info
javascript
const { chromium } = require('playwright');
(async () => {
  const browser = await chromium.launch();
  const page = await browser.newPage();
  await page.goto(TARGET_URL);
  console.log('Title:', await page.title());
  console.log('URL:', page.url());
  const meta = await page.$('meta[name="description"]');
  console.log('Meta description:', meta ? await meta.getAttribute('content') : 'N/A');
  await browser.close();
})();
Quick form test
javascript
const { chromium } = require('playwright');
(async () => {
  const browser = await chromium.launch();
  const page = await browser.newPage();
  await page.goto(TARGET_URL);
  const inputs = await page.locator('input, textarea, select').count();
  const buttons = await page.locator('button, input[type="submit"]').count();
  console.log(`Form has ${inputs} inputs and ${buttons} buttons`);
  await browser.close();
})();

Advanced Patterns

Login flow with auth state reuse
javascript
const { chromium } = require('playwright');
const path = require('path');
const AUTH_FILE = path.join(__dirname, '.auth', 'state.json');

(async () => {
  const browser = await chromium.launch({ headless: false });
  const context = await browser.newContext();

  // Try to reuse saved auth state
  try {
    const state = require(AUTH_FILE);
    await context.addCookies(state.cookies);
  } catch {}

  const page = await context.newPage();
  await page.goto(TARGET_URL);

  // Check if logged in
  const isLoggedIn = await page.$('[data-logged-in]');
  if (!isLoggedIn) {
    await page.fill('[name="username"]', USERNAME);
    await page.fill('[name="password"]', PASSWORD);
    await page.click('button[type="submit"]');
    await page.waitForURL('**/dashboard');
    // Save auth state
    const cookies = await context.cookies();
    require('fs').writeFileSync(AUTH_FILE, JSON.stringify({ cookies }, null, 2));
  }

  // Continue with authenticated actions...
  await browser.close();
})();
API mocking with route interception
javascript
const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch({ headless: false });
  const context = await browser.newContext();
  const page = await context.newPage();

  // Mock API responses
  await page.route('**/api/users', route => {
    route.fulfill({
      status: 200,
      contentType: 'application/json',
      body: JSON.stringify([{ id: 1, name: 'Test User' }])
    });
  });

  // Block analytics/tracking requests
  await page.route(/google-analytics|facebook|gtag/, route => route.abort());

  await page.goto(TARGET_URL);
  // Test with mocked data...
  await browser.close();
})();
Show full SKILL.md (350 more words)Show less
Accessibility audit (requires axe-core)
bash
npm install @axe-core/playwright
javascript
const { chromium } = require('playwright');
const { injectAxe, checkA11y } = require('@axe-core/playwright');

(async () => {
  const browser = await chromium.launch();
  const page = await browser.newPage();
  await page.goto(TARGET_URL);
  await injectAxe(page);
  const results = await checkA11y(page, null, {
    detailedReport: true,
    detailedReportOptions: { html: true }
  });
  console.log(`Violations: ${results.violations.length}`);
  results.violations.forEach(v => console.log(`- ${v.help}: ${v.nodes.length} instances`));
  await browser.close();
})();

Anti-Patterns

Anti-PatternWhy It's BadDo This Instead
page.waitForTimeout(5000)Flaky, slows tests, false passespage.waitForSelector('.loaded')
page.$eval('.css-selector', ...)Brittle, breaks on DOM changespage.getByRole('button', { name: 'Submit' })
Hardcoded localhost:3000Fails when port changesParameterize as TARGET_URL env var
No browser.close()Hangs, leaks resourcesAlways in finally block
page.click() without waitRace condition, element not readypage.click() already waits for actionability
Sequential tests in one scriptOne failure kills everythingSeparate scripts or use test runner
networkidle on SPAsNever resolves on polling appsUse load + explicit element wait
Capturing fullPage on infinite scrollHuge images, timeoutsClip viewport only
Reusing selectors between environmentsDev vs prod DOM differsUse data-testid or role-based locators

Error Handling

Playwright-specific errors and remedies
ErrorLikely CauseResolution
browserType.launch: Executable doesn't existChromium not installedRun npx playwright install chromium
page.goto: net::ERR_CONNECTION_REFUSEDDev server not runningStart dev server or verify URL
page.click: Target closedNavigation happened during clickUse page.waitForNavigation() before click or Promise.all([page.waitForNavigation(), page.click()])
locator.click: Timeout 30000ms exceededElement never becomes actionableCheck selector; maybe element is hidden/disabled/covered
page.fill: Element is not an <input>Wrong element type targetedUse getByRole('textbox') for proper targeting
route.fulfill: Request already servedMultiple routes matched same requestOrder routes most-specific first; use route.fallback() for pass-through
browser.newContext: Cookie domain mismatchAuth state reuse on wrong domainEnsure cookies match the target URL's domain
page.pdf: Protocol errorHeadless mode disabledPDF generation requires headless: true
page.waitForSelector: Target closedNavigation destroyed the pageWrap navigation + post-navigation actions in a single await chain
require('playwright'): Cannot find moduleInstall incompletenpm install playwright then verify node_modules/playwright exists

Checklist

  • Locator uses getByRole, getByText, or getByTestId — never XPath or CSS selectors with fragile class names
  • Auto-waiting relied on (no manual waitForTimeout or sleep)
  • Test isolates state (clean DB or API mock per test)
  • Cross-browser tested (Chromium + Firefox + WebKit) for critical flows
  • Trace viewer enabled on failure for debugging CI flakes

Sources

  • Playwright official documentation (playwright.dev) — locator strategies, auto-waiting, fixtures
  • Testing Trophy methodology — 80% integration / 20% unit testing ratio
  • @axe-core/playwright for accessibility audits
  • Lighthouse CI for performance budgets
  • Production E2E patterns from 30+ project codebases

© EliasOulkadi, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .pack/skills/playwright of EliasOulkadi/shokunin.

Open the folder on GitHubat commit 4c68e5b

Compare with similar skills

Playwright 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.

Playwright compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Playwright this skillEliasOulkadi/shokunin114—~3.6kAutomated safety check: NotesMIT
Playwright Best Practicessanity-io/sanity6.4k7 repos~6.4kAutomated safety check: PassMIT
Playwright Testingchongdashu/vibejam-starter-pack149—~2.2kAutomated safety check: PassNone
Web Testing with Playwright and Vitestwithkynam/vibecode-pro-max-kit1.1k—~892Automated safety check: PassApache-2.0
Cloudflare Browser Renderingsecondsky/claude-skills227—~4kAutomated safety check: PassMIT
Playwright Visual Testingmanagedcode/dotnet-skills486—~1.9kAutomated safety check: PassMIT

Similar skills

  • Official

    A skill your agent uses when writing Playwright tests, fixing flaky tests, debugging failures, implementing Page Object Model, configuring CI/CD, optimizing performance, mocking APIs, handling…

    6.4k GitHub starsUsed in 7 repos~6.4k tokens
    Testing & QAAuto-check passed
  • Playwright Testing

    chongdashu/vibejam-starter-pack

    Plan, implement, and debug frontend tests: unit/integration/E2E/visual/a11y.

    149 GitHub stars~2.2k tokensUpdated 5 mo ago
    Testing & QAAuto-check passed
  • Web Testing with Playwright and Vitest

    withkynam/vibecode-pro-max-kit

    Covers web testing from unit to E2E, load, visual, accessibility and security checks, with Playwright, Vitest and k6 guides plus a Playwright setup script.

    1.1k GitHub stars~892 tokensUpdated 3 mo ago
    Testing & QAAuto-check passed
  • Cloudflare Browser Rendering

    secondsky/claude-skills

    Cloudflare Browser Rendering with Puppeteer/Playwright. An agent skill from secondsky/claude-skills.

    227 GitHub stars~4k tokensUpdated 13 days ago
    Testing & QAAuto-check passed
  • Playwright Visual Testing

    managedcode/dotnet-skills

    Add, repair, or review Playwright visual regression tests for browser-facing .NET apps, including screenshot baselines, Pixelmatch thresholds, deterministic rendering, and GitHub Actions artifacts.

    486 GitHub stars~1.9k tokensUpdated yesterday
    Testing & QAAuto-check passed
  • React Testing

    affaan-m/ECC

    React component testing with React Testing Library, Vitest/Jest, MSW for network mocking, accessibility assertions with axe, and the decision boundary between component tests and Playwright/Cypress…

    277k GitHub starsUsed in 1 repo~3.3k tokens
    Testing & QAAuto-check passed

More from EliasOulkadi/shokunin

All 49 skills in this repo
  • CI CD

    EliasOulkadi/shokunin

    Design CI/CD pipelines for GitHub Actions, GitLab CI, and CircleCI with matrix builds, test sharding, caching, Docker layer caching, OIDC auth, deployment strategies (rolling, blue-green, canary)…

    114 GitHub stars~3.4k tokensUpdated 6 days ago
    Auto-check: notes
  • Component Forge

    EliasOulkadi/shokunin

    Build production-grade components for React, Vue 3, and Svelte 5 with all states (loading, empty, error, success, idle), TypeScript strict, WCAG 2.2 accessibility, server components (RSC), and…

    114 GitHub stars~3.6k tokensUpdated 6 days ago
    Auto-check: notes
  • DB Admin

    EliasOulkadi/shokunin

    PostgreSQL database administration — backup/restore (pgdump, PITR, WAL archiving), health monitoring (connections, bloat, cache hit ratio, dead tuples), connection pooling (PgBouncer), replication…

    114 GitHub stars~2k tokensUpdated 6 days ago
    Auto-check: notes
  • DB Sculptor

    EliasOulkadi/shokunin

    Design database schemas with Prisma/Drizzle, PostgreSQL index strategy (B-tree, GIN, GiST, BRIN, Hash), query optimization (EXPLAIN ANALYZE), migration safety (expand/contract, zero-downtime), and…

    114 GitHub stars~3.1k tokensUpdated 6 days ago
    Auto-check: notes
  • Docker

    EliasOulkadi/shokunin

    Optimize Docker images with multi-stage builds, distroless bases, BuildKit cache mounts, multi-arch builds, compose watch, security hardening (non-root, seccomp, capabilities drop), and…

    114 GitHub stars~3.8k tokensUpdated 6 days ago
    Auto-check: notes
  • Error Handler

    EliasOulkadi/shokunin

    Design error handling, structured logging, and observability with OpenTelemetry (traces, metrics, logs), error classification, recovery patterns (retry with jitter, circuit breaker, bulkhead…

    114 GitHub stars~3.6k tokensUpdated 6 days ago
    Auto-check: notes

Questions about Playwright

What does Playwright do?

Browser automation, web scraping, E2E testing, and visual regression with Playwright. Playwright is an agent skill from EliasOulkadi/shokunin. Browser automation, web scraping, E2E testing, and visual regression with Playwright.

When should I use Playwright?

Playwright fits situations like: user asks to test a website; take screenshots; check responsive design; automate a browser task.

How do I install Playwright in Claude Code?

Run `npx skills add EliasOulkadi/shokunin --skill playwright -a claude-code`. Or copy the skill folder (.pack/skills/playwright in EliasOulkadi/shokunin) into .claude/skills/playwright in your project. Claude Code loads it when a task matches its description.

How do I install Playwright in Codex?

Run `npx skills add EliasOulkadi/shokunin --skill playwright -a codex`. Or copy the skill folder (.pack/skills/playwright in EliasOulkadi/shokunin) into .agents/skills/playwright in your project. Codex loads it when a task matches its description.

Can I use Playwright in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add EliasOulkadi/shokunin --skill playwright -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/playwright, .gemini/skills/playwright, .github/skills/playwright and .opencode/skills/playwright in your project.

What does Playwright need to run?

Going by SKILL.md and its folder, Playwright needs the command-line tools its instructions call (npx, npm and node). Our summary lists: Node.js; Docker. Compatibility (from SKILL.md): opencode.

Does Playwright access the network?

SKILL.md contains no URLs. Its commands use npx and npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Playwright safe to install?

Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Playwright use?

Playwright is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Playwright use?

About 3.6k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Playwright?

Skills that share tags, products or a category with Playwright: Playwright Best Practices (sanity-io/sanity, 6.4k stars), Playwright Testing (chongdashu/vibejam-starter-pack, 149 stars), Web Testing with Playwright and Vitest (withkynam/vibecode-pro-max-kit, 1.1k stars) and Cloudflare Browser Rendering (secondsky/claude-skills, 227 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Playwright?

EliasOulkadi (a GitHub user) maintains it in EliasOulkadi/shokunin, which has 114 GitHub stars. The repository holds 49 skills in this directory. The repository was last updated on October 5, 2026.

Source: EliasOulkadi/shokunin on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.