screenshot-annotator
Skill20 starsChanged 10 months agoMITView on GitHub
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. 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: Create a container…
1 other project uses a version of this.
Adopted by
Most recently taken up by
- ianalloway/openclaw-skillstheir own version, first seen Jun 26, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- ianalloway/openclaw-skills★ 4same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository13 other files it gives its agents.
- ab-testingSkill
- cookie-auditorSkill
- critical-pathsSkill
- form-fuzzerSkill
- github-prSkill
- link-checkerSkill
- network-throttlingSkill
- persona-generatorSkill
- session-recorderSkill
- smoke-testingSkill
- stripe-checkoutSkill
- user-testingSkill
- wcag-auditorSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
17 rules. About 0 are common, 14 are distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈14
Distinctive · estimate
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 7
Add visual markers (boxes, highlights, callouts) to screenshots before capturing them.
- Very specific: line 46
Use browser_evaluate to inject annotation elements before taking a screenshot.
- Distinctive: line 67
Create a container div for annotations:
- Very specific: line 218
After adding annotations, use browser_take_screenshot to capture the annotated page.
- Distinctive: line 222
Remove the overlay after taking the screenshot:
- Very specific: line 238
Use browser_snapshot to find the element
- Distinctive: line 240
Create overlay and add annotation
- Distinctive: line 247
When the testing agent detects an annotation trigger:
- Distinctive: line 251
Add dashed red box with label "Confusing"
- Distinctive: line 255
Add solid red box with label "Error"
- Distinctive: line 259
Add orange highlight or warning box
- Distinctive: line 263
Add green box with label "Complete"
- Distinctive: line 267
Label Clarity: Use short, descriptive labels (2-4 words)
- Distinctive: line 268
Color Consistency: Use the standard color palette
- Distinctive: line 269
Positioning: Ensure labels don't overlap with important content
- Distinctive: line 270
Multiple Annotations: Use callouts with numbers when annotating multiple elements
- Distinctive: line 271
Clean Up: Always remove the overlay after screenshots
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
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 | 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 |
Highlight
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 |
Callout
A numbered circle positioned near an element, used for referencing multiple issues.
Color Palette
error/confusion: #dc2626 (red-600)
warning: #f59e0b (amber-500)
success: #16a34a (green-600)
info: #2563eb (blue-600)
highlight: #fbbf24 (amber-400)How to Add Annotations
Use browser_evaluate to inject annotation elements before taking a screenshot. All DOM manipulation must use safe methods (createElement, appendChild, setAttribute).
Step 1: Get Element Position
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;Step 2: Create Annotation Overlay
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;
})();Step 3: Add Box Annotation
// 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);Step 4: Add Highlight Annotation
// 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);Step 5: Add Callout Annotation
// 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);Step 6: Take Screenshot
After adding annotations, use browser_take_screenshot to capture the annotated page.
Step 7: Clean Up
Remove the overlay after taking the screenshot:
// Via browser_evaluate
(function() {
const overlay = document.getElementById('uta-overlay');
if (overlay) overlay.remove();
return true;
})();Annotation Workflow
For Manual Annotations (/annotate command)
- Parse user's element description
- Use
browser_snapshotto find the element - Get element position via
browser_evaluate - Create overlay and add annotation
- Take screenshot with
browser_take_screenshot - Clean up overlay
- Return screenshot path and description
For Automatic Annotations (during testing)
When the testing agent detects an annotation trigger:
- Confusion detected:
- Note the element being examined
- Add dashed red box with label "Confusing"
- Error encountered:
- Find the error message or invalid field
- Add solid red box with label "Error"
- Frustration trigger matched:
- Identify the triggering element
- Add orange highlight or warning box
- Task completed:
- Mark the final action element
- Add green box with label "Complete"
Best Practices
- Label Clarity: Use short, descriptive labels (2-4 words)
- Color Consistency: Use the standard color palette
- Positioning: Ensure labels don't overlap with important content
- Multiple Annotations: Use callouts with numbers when annotating multiple elements
- Clean Up: Always remove the overlay after screenshots
Example: Annotating a Confusing Form Field
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"Integration with User Testing Reports
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.Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

