skills/screenshot-annotator/SKILL.md
# Screenshot Annotator Skill This skill provides visual annotation capabilities for screenshots taken during user testing. Annotations help highlight issues, confusion points, and notable elements in test screenshots. ## Purpose Add visual markers (boxes, highlights, callouts) to screenshots before capturing them. This makes test reports more actionable by clearly showing where issues occurred. ## Annotation Types ### Box A rectangular border around an element. | Variant | Border Style | U
npx skillsauth add ncklrs/claude-chrome-user-testing skills/screenshot-annotatorInstall 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.
This skill provides visual annotation capabilities for screenshots taken during user testing. Annotations help highlight issues, confusion points, and notable elements in test screenshots.
Add visual markers (boxes, highlights, callouts) to screenshots before capturing them. This makes test reports more actionable by clearly showing where issues occurred.
A rectangular border around an element.
| Variant | Border Style | Use Case |
|---------|--------------|----------|
| error | 3px solid red | Form errors, broken functionality |
| confusion | 3px dashed red | User hesitation, unclear elements |
| warning | 3px solid orange | Frustration triggers, warnings |
| success | 3px solid green | Task completion, positive elements |
| info | 3px solid blue | General callouts |
A semi-transparent overlay on an element.
| Color | Opacity | Use Case | |-------|---------|----------| | Yellow | 40% | Draw attention to area | | Orange | 30% | Frustration trigger match | | Red | 25% | Critical issue area |
A numbered circle positioned near an element, used for referencing multiple issues.
error/confusion: #dc2626 (red-600)
warning: #f59e0b (amber-500)
success: #16a34a (green-600)
info: #2563eb (blue-600)
highlight: #fbbf24 (amber-400)
Use browser_evaluate to inject annotation elements before taking a screenshot. All DOM manipulation must use safe methods (createElement, appendChild, setAttribute).
First, find the target element and get its bounding box:
// Via browser_evaluate
const element = document.querySelector('[data-testid="submit-btn"]');
const rect = element.getBoundingClientRect();
const position = {
x: rect.left + window.scrollX,
y: rect.top + window.scrollY,
width: rect.width,
height: rect.height
};
return position;
Create a container div for annotations:
// Via browser_evaluate
(function() {
// Remove existing overlay if present
const existing = document.getElementById('uta-overlay');
if (existing) existing.remove();
// Create overlay container
const overlay = document.createElement('div');
overlay.id = 'uta-overlay';
overlay.style.cssText = 'position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:99999;';
document.body.appendChild(overlay);
return true;
})();
// Via browser_evaluate with parameters
(function(x, y, width, height, type, label) {
const overlay = document.getElementById('uta-overlay');
if (!overlay) return false;
const colors = {
error: '#dc2626',
confusion: '#dc2626',
warning: '#f59e0b',
success: '#16a34a',
info: '#2563eb'
};
const borderStyle = type === 'confusion' ? 'dashed' : 'solid';
const color = colors[type] || colors.info;
// Create box
const box = document.createElement('div');
box.className = 'uta-box';
box.style.cssText = [
'position:absolute',
'left:' + x + 'px',
'top:' + y + 'px',
'width:' + width + 'px',
'height:' + height + 'px',
'border:3px ' + borderStyle + ' ' + color,
'border-radius:4px',
'box-sizing:border-box'
].join(';');
// Create label if provided
if (label) {
const labelEl = document.createElement('div');
labelEl.className = 'uta-label';
labelEl.style.cssText = [
'position:absolute',
'top:-26px',
'left:-3px',
'background:' + color,
'color:white',
'padding:4px 8px',
'font-size:12px',
'font-family:system-ui,sans-serif',
'font-weight:500',
'border-radius:4px 4px 0 0',
'white-space:nowrap'
].join(';');
labelEl.textContent = label;
box.appendChild(labelEl);
}
overlay.appendChild(box);
return true;
})(x, y, width, height, type, label);
// Via browser_evaluate with parameters
(function(x, y, width, height, color) {
const overlay = document.getElementById('uta-overlay');
if (!overlay) return false;
const colors = {
yellow: 'rgba(251, 191, 36, 0.4)',
orange: 'rgba(245, 158, 11, 0.3)',
red: 'rgba(220, 38, 38, 0.25)'
};
const highlight = document.createElement('div');
highlight.className = 'uta-highlight';
highlight.style.cssText = [
'position:absolute',
'left:' + x + 'px',
'top:' + y + 'px',
'width:' + width + 'px',
'height:' + height + 'px',
'background:' + (colors[color] || colors.yellow),
'border-radius:2px'
].join(';');
overlay.appendChild(highlight);
return true;
})(x, y, width, height, color);
// Via browser_evaluate with parameters
(function(x, y, number, color) {
const overlay = document.getElementById('uta-overlay');
if (!overlay) return false;
const colors = {
red: '#dc2626',
orange: '#f59e0b',
green: '#16a34a',
blue: '#2563eb'
};
const callout = document.createElement('div');
callout.className = 'uta-callout';
callout.style.cssText = [
'position:absolute',
'left:' + (x - 12) + 'px',
'top:' + (y - 12) + 'px',
'width:24px',
'height:24px',
'background:' + (colors[color] || colors.red),
'color:white',
'border-radius:50%',
'display:flex',
'align-items:center',
'justify-content:center',
'font-size:14px',
'font-weight:bold',
'font-family:system-ui,sans-serif',
'box-shadow:0 2px 4px rgba(0,0,0,0.2)'
].join(';');
callout.textContent = String(number);
overlay.appendChild(callout);
return true;
})(x, y, number, color);
After adding annotations, use browser_take_screenshot to capture the annotated page.
Remove the overlay after taking the screenshot:
// Via browser_evaluate
(function() {
const overlay = document.getElementById('uta-overlay');
if (overlay) overlay.remove();
return true;
})();
browser_snapshot to find the elementbrowser_evaluatebrowser_take_screenshotWhen the testing agent detects an annotation trigger:
Confusion detected:
Error encountered:
Frustration trigger matched:
Task completed:
1. User: "I'm confused about this field"
2. Get position:
browser_evaluate: Get bounding box of the confusing element
3. Create overlay:
browser_evaluate: Create annotation container
4. Add annotation:
browser_evaluate: Add dashed red box at position with label "Confusing"
5. Capture:
browser_take_screenshot: Save as "confusion-form-field.png"
6. Clean up:
browser_evaluate: Remove overlay
7. Report:
"Screenshot saved: confusion-form-field.png - User found this field confusing"
Annotated screenshots should be referenced in the testing report:
## Usability Issues Found
### Critical: Form Submit Button Hard to Find

The submit button (annotated in red) was difficult to locate due to
its placement below the fold and low contrast with the background.
development
# WCAG Auditor Skill This skill provides WCAG 2.1 accessibility audit capabilities, including criteria definitions, check implementations, and scoring logic. ## Purpose Systematically evaluate web pages against WCAG 2.1 Level A and AA success criteria to identify accessibility barriers and provide remediation guidance. ## WCAG 2.1 Overview WCAG is organized around four principles (POUR): - **Perceivable**: Information must be presentable to users - **Operable**: Interface must be usable - *
development
Comprehensive persona-based user testing skill for web applications. Simulates how real users from different demographics interact with interfaces, including realistic timing, behavioral patterns, and frustration triggers. Use when: - Testing user interfaces before release - Validating UX flows from diverse perspectives - Conducting accessibility reviews - Optimizing onboarding or checkout experiences - Getting feedback on form design
development
# Stripe Checkout Testing Skill This skill provides guidance for testing Stripe checkout flows with any persona. It handles test card data, form detection, and payment-specific narration. ## Purpose Enable realistic user testing of Stripe payment flows using official test cards, with persona-appropriate reactions to checkout experiences. ## Test Card Reference Load card data from `test-cards.json`. Key scenarios: | Scenario | Card | When to Use | |----------|------|-------------| | `succes
testing
# Smoke Testing Skill Run pre-configured smoke tests for common user flows. Quick validation that critical functionality works. ## What is Smoke Testing? Smoke testing is a quick sanity check to ensure basic functionality works before deeper testing. The name comes from electronics - if you turn on a circuit and smoke comes out, you know something is wrong without further testing. ## When to Use - Before releases to catch obvious breaks - After deployments to verify functionality - In CI/CD