Economical Visual Tests
igrlk/storybook-addon-test-codegen
Author economical visual tests — full visual coverage in the fewest billable snapshots.
Implement visual regression testing with Playwright screenshots, Chromatic, Percy, and Argos CI.
$ npx skills add petrkindlmann/qa-skills --skill visual-testing -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install petrkindlmann/qa-skills visual-testing --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/petrkindlmann/qa-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/visual-testing .claude/skills/visual-testing && 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 "visual-testing" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/visual-testing into .claude/skills/visual-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "visual-testing", 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/petrkindlmann/qa-skills/tree/main/skills/visual-testingType 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 petrkindlmann/qa-skills --skill visual-testing -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install petrkindlmann/qa-skills visual-testing --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/petrkindlmann/qa-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/visual-testing .agents/skills/visual-testing && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "visual-testing" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/visual-testing into .agents/skills/visual-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "visual-testing", 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 petrkindlmann/qa-skills --skill visual-testing -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install petrkindlmann/qa-skills visual-testing --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/petrkindlmann/qa-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/visual-testing .cursor/skills/visual-testing && 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 "visual-testing" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/visual-testing into .cursor/skills/visual-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "visual-testing", 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/petrkindlmann/qa-skills.git --path skills/visual-testing--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 petrkindlmann/qa-skills --skill visual-testing -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install petrkindlmann/qa-skills visual-testing --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/petrkindlmann/qa-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/visual-testing .gemini/skills/visual-testing && 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 "visual-testing" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/visual-testing into .gemini/skills/visual-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "visual-testing", 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 petrkindlmann/qa-skills visual-testingInstalls 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 petrkindlmann/qa-skills --skill visual-testing -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/petrkindlmann/qa-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/visual-testing .github/skills/visual-testing && 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 "visual-testing" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/visual-testing into .github/skills/visual-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "visual-testing", 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 petrkindlmann/qa-skills --skill visual-testing -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install petrkindlmann/qa-skills visual-testing --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/petrkindlmann/qa-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/visual-testing .opencode/skills/visual-testing && 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 "visual-testing" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/visual-testing into .opencode/skills/visual-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "visual-testing", 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.
visual-testingImplement visual regression testing with Playwright screenshots, Chromatic, Percy, and Argos CI.
Visual Testing is an agent skill from petrkindlmann/qa-skills. Implement visual regression testing with Playwright screenshots, Chromatic, Percy, and Argos CI. Covers baseline management, diff threshold tuning, dynamic content masking, responsive viewport testing, and review/approval workflows. Use when: "visual test," "screenshot," "visual regression," "pixel diff," "snapshot diff," "update baselines," "Chromatic," "percy snapshot," "argos screenshot." Not for: bulk baseline regeneration after a redesign broke many tests — use selector-drift-recovery; cross-browser…
Its SKILL.md is about 4.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/recipes.md`).
It sits in Testing & QA, covering Visual regression testing and Browser testing. It works with Playwright, Storybook and Git. The repository describes itself as: 50 QA and test-automation skills for Claude Code, Codex, Cursor, and any Agent Skills Standard runtime. The licence is MIT.
12 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit b3bb61b. 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.
Shell commands in SKILL.md call:
npxgitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npx and git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Visual Testing loads about 4.5k tokens when it runs, and up to ~6.1k if it reads all its reference files. Until then it costs about 177 tokens; SKILL.md has 1,718 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); files beside SKILL.md are not scanned.
The full file from petrkindlmann/qa-skills at commit b3bb61b, republished under its MIT licence (© petrkindlmann). 1,718 words, ~4,469 tokens.
.claude/skills/visual-testing/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.<objective>
Catch visual regressions that functional tests miss. A button that works perfectly but renders at 2px height passes `toBeVisible()` and `click()` — visual testing compares screenshots against approved baselines and flags pixel-level differences. This skill covers Playwright's built-in `toHaveScreenshot`, dedicated tools (Chromatic, Percy, Argos CI), and the baseline-management workflows around them.
</objective>
| Situation | Go to |
|---|---|
| Just need pixel diffs in CI, no review SaaS | Playwright Visual Comparisons (below) |
| Storybook in the repo | Dedicated Tools → Chromatic, or recipes.md "Storybook without Chromatic" |
| Need a hosted review/approval UI + AI diff triage | Dedicated Visual Testing Tools |
| Screenshots flake on timestamps/avatars/ads | Masking & Freezing Dynamic Content |
| Baselines bloating git history | Baseline Management → Git LFS |
Check .agents/qa-project-context.md first — if it exists, use it and skip anything answered there.
toHaveScreenshot is free, stores baselines in-repo (git/LFS cost is on you). Dedicated tools (Chromatic, Percy, Argos) store artifacts off-repo, add review workflows, browser farms, historical tracking, and — since late 2025 — AI diff triage. Choose on team size, review needs, and whether you want artifacts in your repo or theirs.Functional tests assert behavior ("clicking Submit shows a success message"). Visual tests assert appearance ("the success message is green, correctly positioned, and does not overlap the form"). Both are needed. Visual tests complement functional tests; they do not replace them.
Taking screenshots is easy. Managing baselines — updating them when design changes intentionally, reviewing diffs, coordinating approvals across a team — is the real challenge. Invest in the review workflow early.
Any content that changes between runs (timestamps, avatars, ads, random IDs) produces pixel differences that are not real regressions. Aggressively mask or freeze it. A suite with a 10% false-positive rate gets ignored within a month. Hosted tools (Percy's Visual Review Agent, Chromatic AI triage) now auto-filter a large share of these — but masking and freezing remain your first line of defense regardless of tool.
The right diff threshold depends on the component, rendering engine, and what counts as "visually different." Start strict (zero tolerance), observe false positives, loosen per-component. Document why each threshold was chosen.
The screenshot file is the evidence. Store it, version it, make it accessible for review. A test that says "visual diff detected" without showing the diff is useless — always upload expected/actual/diff images as CI artifacts.
Playwright's built-in toHaveScreenshot and toMatchSnapshot provide visual regression testing without an external service.
import { test, expect } from '@playwright/test';
test('dashboard matches baseline', async ({ page }) => {
await page.goto('/dashboard');
// Wait for data to load before capturing — never waitForTimeout
await expect(page.getByRole('heading', { name: 'Dashboard' })).toBeVisible();
await expect(page.getByTestId('chart-container')).toBeVisible();
await expect(page).toHaveScreenshot('dashboard.png', { animations: 'disabled' });
});First run creates the baseline. Subsequent runs compare and fail if pixels differ beyond the threshold.
await expect(page).toHaveScreenshot('dashboard.png', {
maxDiffPixels: 100, // Allow up to 100 pixels to differ
// OR
maxDiffPixelRatio: 0.01, // Allow up to 1% of pixels to differ
threshold: 0.2, // Per-pixel color difference tolerance (0-1, YIQ space)
animations: 'disabled', // Freeze CSS animations and transitions
caret: 'hide', // Hide blinking cursor
stylePath: './screenshot.css', // Inject a stylesheet at capture to hide dynamic chrome
timeout: 15000, // Wait up to 15s for a stable screenshot
});The default comparator is pixelmatch (YIQ color space). The relevant knobs are comparator: 'pixelmatch' plus threshold/maxDiffPixel* — there is no stable perceptual-color mode key, so do not set mode: (perceptual SSIM is an internal/experimental underscore API, not stable config).
When to use which threshold:
| Option | Use when |
|---|---|
maxDiffPixels: 0 | Pixel-perfect components (icons, logos, design-system atoms) |
maxDiffPixels: 50-100 | Full-page layouts where antialiasing varies slightly |
maxDiffPixelRatio: 0.01 | Full-page screenshots where absolute pixel count varies with viewport |
threshold: 0.2 | Cross-browser testing where color rendering differs slightly |
import { defineConfig } from '@playwright/test';
export default defineConfig({
expect: {
toHaveScreenshot: {
comparator: 'pixelmatch', // Default comparator (YIQ color space)
maxDiffPixelRatio: 0.005, // Global default: 0.5% tolerance
animations: 'disabled',
caret: 'hide',
},
toMatchSnapshot: {
maxDiffPixelRatio: 0.005,
},
},
projects: [
{
name: 'visual-desktop',
use: { viewport: { width: 1280, height: 720 }, colorScheme: 'light' },
testMatch: /.*visual.*\.spec\.ts/,
},
{
name: 'visual-mobile',
use: { viewport: { width: 375, height: 667 }, colorScheme: 'light', isMobile: true },
testMatch: /.*visual.*\.spec\.ts/,
},
],
});Two complementary tactics. Mask blanks specific elements; stylePath / freezing kills time- and animation-driven noise.
test('profile page visual test', async ({ page }) => {
await page.goto('/profile');
await expect(page.getByRole('heading', { name: 'Profile' })).toBeVisible();
await expect(page).toHaveScreenshot('profile.png', {
mask: [
page.getByTestId('user-avatar'), // User-specific image
page.getByTestId('last-login-time'), // Timestamp
page.getByTestId('activity-feed'), // Dynamic content
],
maskColor: '#FF00FF', // Visible mask color for debugging
});
});For cursors, animations, and dynamic chrome, prefer stylePath (a stylesheet injected at capture time) over per-element masks — it is declarative and survives DOM changes. To eliminate timestamps and live data, pin the clock with page.clock.setFixedTime (holds the clock dead-still — best for screenshot determinism; page.clock.install lets it tick from a seed) and stub the API with page.route + route.fulfill.
See references/recipes.md for the full frozen-data recipe (clock + route + font-abort + getAnimations().finish()), the stylePath example, and component-state screenshots.
# Update all baselines (when design intentionally changes)
npx playwright test --update-snapshots
# Update baselines for specific tests only
npx playwright test visual-dashboard --update-snapshots
# Review what changed before committing
git diff --stat # See which baseline files changed
npx playwright show-report # Visually review expected/actual/diff for eachBaseline update workflow:
show-report: is the change intentional?npx playwright test --update-snapshots.Screenshot the component (e.g. getByRole('table')), not the full page — more stable, more focused. Drive empty/error/normal states by stubbing the API per test. For responsive coverage, loop a VISUAL_VIEWPORTS array (mobile/tablet/desktop with isMobile flags) or define one Playwright project per viewport. See references/recipes.md for the component-state and responsive-loop recipes.
Reach for these when you want a hosted review/approval UI, a cross-browser rendering farm, historical tracking, or AI-assisted diff triage — and you are fine with artifacts living off-repo on a subscription.
| Tool | Best when | Integration | Key feature |
|---|---|---|---|
| Chromatic | Project uses Storybook | Every story = a visual test | Review/approval UI, cross-browser, TurboSnap + AI triage |
| Percy | No Storybook, need multi-browser | Any framework via SDK | Multi-width captures, CSS overrides, AI Visual Review Agent (auto-filters ~40% of false positives), BrowserStack Test Observability |
| Argos CI | Open-source preference, budget-conscious | Playwright reporter | Self-hosted tier; generous cloud free tier |
AI diff triage (the material 2026 shift): Percy's Visual Review Agent and Chromatic's AI triage auto-classify a large share of diffs as noise vs. real change, cutting review fatigue. This is the strongest reason to pay for a hosted tool over built-in baselines — but it reduces, not removes, the need to mask/freeze dynamic content.
Avoid: Lost Pixel — repo archived 22 April 2026 (read-only). Use Argos, Chromatic, or Playwright's built-in
toHaveScreenshotinstead.
See references/recipes.md for the Chromatic GitHub Action, Percy percySnapshot, Argos argosScreenshot, and the Storybook-without-Chromatic snippets.
Playwright stores baselines alongside test files, tagged per platform because rendering differs across operating systems:
e2e/tests/visual/
dashboard.visual.spec.ts
dashboard.visual.spec.ts-snapshots/
dashboard-chromium-linux.png # Platform-specific baselines
dashboard-chromium-darwin.png
dashboard-firefox-linux.pngPros: versioned with the code, reviewed in PRs, available offline. Cons: repo size grows; large PNGs bloat git history.
Use Git LFS to prevent bloat, and customize layout with snapshotPathTemplate:
# .gitattributes
*.png filter=lfs diff=lfs merge=lfs -text// playwright.config.ts
export default defineConfig({
snapshotPathTemplate: '{testDir}/__snapshots__/{testFilePath}/{arg}-{projectName}{ext}',
});Because baselines are platform-tagged, generate them in the same Docker image CI uses so they always match the CI rendering environment — never commit baselines captured on a developer laptop. See references/recipes.md for the Docker CI job (mcr.microsoft.com/playwright:v1.60.0-noble, matched to your @playwright/test version).
show-report (or the hosted tool's UI).--update-snapshots), re-commit.Capturing entire pages without masking dynamic content (timestamps, avatars, live data) produces diffs every run. The team stops trusting visual tests. Always mask dynamic regions and freeze time-dependent content.
Running visual tests without uploading screenshot artifacts means a failure has no expected/actual/diff to inspect, forcing local repro that may render differently. Always upload screenshots, diffs, and the report as CI artifacts.
Running --update-snapshots and committing without reviewing the change bakes regressions into baselines, making them invisible. Every update goes through review of the before/after images, not just the file diff.
Visual tests for components that change by design (A/B tests, personalized content, frequently rotated banners) fail constantly with intentional changes. Exclude them or stub their content.
maxDiffPixels: 0 on full-page screenshots flags sub-pixel rendering differences from browser/OS/font updates as failures. Use maxDiffPixelRatio: 0.005 for full pages; reserve zero tolerance for small critical components (logos, icons).
Running visual tests on assorted developer machines and expecting baselines to match — font rendering, antialiasing, and scaling differ across platforms. Run in a consistent CI Docker environment and generate baselines there.
Not disabling animations captures transitions mid-frame, producing random diffs. Use animations: 'disabled', stylePath to zero out durations, or getAnimations().finish() before capture.
Prove baselines generate and the comparator runs before calling it done, smallest first:
npx playwright test --grep @visual # baselines generate (first run) / compare (later)
npx playwright test --grep @visual --update-snapshots # regenerate intentionally
npx playwright show-report # diff artifacts (expected/actual/diff) render
git check-attr filter -- "e2e/**/*.png" # prints "filter: lfs" if LFS is wiredA clean first run that writes *-snapshots/*.png files, plus a second run that passes against them, confirms the pipeline works end to end.
playwright.config.ts sets a global maxDiffPixelRatio AND at least one icon/logo test overrides to maxDiffPixels: 0.mask, stylePath, or clock/route stubbing..gitattributes has *.png filter=lfs) OR an off-repo hosted tool, so the repo does not bloat.references/)stylePath masking, component-state screenshots, the responsive-viewport loop, Chromatic/Percy/Argos snippets, Storybook-without-Chromatic, and the Docker CI job.© petrkindlmann, 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 1 other file (references) in skills/visual-testing of petrkindlmann/qa-skills.
Open the folder on GitHubat commit b3bb61b
Visual Testing 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 |
|---|---|---|---|---|---|---|
| Visual Testing this skillpetrkindlmann/qa-skills | 165 | — | ~4.5k | Automated safety check: Pass | MIT | |
| Economical Visual Testsigrlk/storybook-addon-test-codegen | 154 | 1 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Computed Stylesbitovi/ai-enablement-prompts | 121 | — | ~2.4k | Automated safety check: Pass | MIT | |
| Sanity Visual Regressionsanity-io/sanity | 6.4k | — | ~3.4k | Automated safety check: Pass | MIT | |
| Smartui Skillsickn33/agentic-awesome-skills | 47k | 1 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Triaging Visual Review RunsPostHog/posthog | 40k | — | ~9.1k | Automated safety check: Pass | Custom licence |
igrlk/storybook-addon-test-codegen
Author economical visual tests — full visual coverage in the fewest billable snapshots.
bitovi/ai-enablement-prompts
Extract and compare computed CSS styles between a baseline URL and a dev/Storybook URL using Playwright MCP evaluate calls.
sanity-io/sanity
Add, review, and maintain Chromatic visual regression coverage in the Sanity monorepo via dev/storybook stories, the vitest browser-mode suite, and Playwright e2e snapshots.
sickn33/agentic-awesome-skills
Generates SmartUI visual regression test configurations for screenshot comparison on TestMu AI cloud.
PostHog/posthog
Inspects PostHog Visual Review (VR) runs that gate PR merges with screenshot regression checks.
bitovi/ai-enablement-prompts
Compare a baseline URL against a dev or Storybook URL by taking Playwright screenshots at multiple breakpoints, running a pixel-level image diff, and reporting results to guide style and HTML…
petrkindlmann/qa-skills
Test for WCAG 2.2 AA compliance with axe-core + Playwright, keyboard navigation audits, screen reader testing, ARIA pattern validation, and legal compliance mapping (ADA, EAA, Section 508).
petrkindlmann/qa-skills
Goal-driven E2E testing where a browser agent (Playwright MCP / computer-use) reads a natural-language goal and explores the app via the accessibility tree to assert outcomes — no pre-written script.
petrkindlmann/qa-skills
Use AI to write NEW test code from specs, PRDs, user stories, code diffs, bug reports, or OpenAPI specs.
petrkindlmann/qa-skills
Test REST and GraphQL APIs with Playwright APIRequestContext, Supertest, or standalone HTTP clients.
petrkindlmann/qa-skills
Design CI/CD pipelines that run test suites. An agent skill from petrkindlmann/qa-skills.
petrkindlmann/qa-skills
Test for regulatory compliance: GDPR/CMP consent verification, Google Consent Mode v2, Global Privacy Control (GPC), CCPA/US state opt-out, EU AI Act Article 50 transparency, Better Ads Standards…
Works with
Categories
Implement visual regression testing with Playwright screenshots, Chromatic, Percy, and Argos CI. Visual Testing is an agent skill from petrkindlmann/qa-skills. Implement visual regression testing with Playwright screenshots, Chromatic, Percy, and Argos CI.
Visual Testing fits situations like: visual regression; update baselines; argos screenshot. Not for: bulk baseline regeneration after a redesign broke many tests — use selector-drift-recovery; cross-browser rendering matrices — use cross-browser-testing.
Run `npx skills add petrkindlmann/qa-skills --skill visual-testing -a claude-code`. Or copy the skill folder (skills/visual-testing in petrkindlmann/qa-skills) into .claude/skills/visual-testing in your project. Claude Code loads it when a task matches its description.
Run `npx skills add petrkindlmann/qa-skills --skill visual-testing -a codex`. Or copy the skill folder (skills/visual-testing in petrkindlmann/qa-skills) into .agents/skills/visual-testing 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 petrkindlmann/qa-skills --skill visual-testing -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/visual-testing, .gemini/skills/visual-testing, .github/skills/visual-testing and .opencode/skills/visual-testing in your project.
Going by SKILL.md and its folder, Visual Testing needs the command-line tools its instructions call (npx and git). Our summary lists: Node.js.
SKILL.md contains no URLs. Its commands use npx and git, which can reach the network depending on how they are called. 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. Review the folder before installing.
Visual Testing is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.5k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.6k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Visual Testing: Economical Visual Tests (igrlk/storybook-addon-test-codegen, 154 stars), Computed Styles (bitovi/ai-enablement-prompts, 121 stars), Sanity Visual Regression (sanity-io/sanity, 6.4k stars) and Smartui Skill (sickn33/agentic-awesome-skills, 47k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
petrkindlmann (a GitHub user) maintains it in petrkindlmann/qa-skills, which has 165 GitHub stars. The repository holds 45 skills in this directory. The repository was last updated on June 10, 2026.
Source: petrkindlmann/qa-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.