From pinpoint
Use when reviewing UI visually, getting design feedback, or when the user wants to annotate screenshots. Triggers on "review this page", "what's wrong with this UI", "annotate", "visual feedback", screenshot review workflows, or after making UI changes that need verification.
How this skill is triggered — by the user, by Claude, or both
Slash command
/pinpoint:using-pinpointThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Pinpoint lets the user annotate screenshots in their browser and returns structured feedback for you to act on.
Pinpoint lets the user annotate screenshots in their browser and returns structured feedback for you to act on.
Use whatever screenshot tool fits the platform:
# Chrome DevTools MCP
mcp__chrome-devtools__take_screenshot --filePath /tmp/screenshot.png
# Playwright MCP
mcp__playwright__browser_take_screenshot --path /tmp/screenshot.png
# macOS native
screencapture -x /tmp/screenshot.png
# iOS Simulator
xcrun simctl io booted screenshot /tmp/screenshot.png
/pinpoint:review as textPlain text like /pinpoint:review /tmp/foo.png is just text — it doesn't run anything. To actually open the annotation UI you must call the pinpoint CLI through the Bash tool:
Bash(command="pinpoint review /tmp/screenshot.png --context 'Login page after auth changes — suspect spacing bug under .form-row'")
Before/after comparison pairs (--pair before after, repeatable) mixed freely with standalone images:
Bash(command="pinpoint review --pair /tmp/before.png /tmp/after.png --context 'Button spacing fix'")
Bash(command="pinpoint review --pair /tmp/before.png /tmp/after.png --pair /tmp/old.png /tmp/new.png /tmp/extra.png --context 'Two comparisons + a standalone'")
Each --pair opens a side-by-side Before/After pane; standalone positional args use the normal single-image canvas. All slots share one thumbnail strip; arrow keys navigate between them.
Multiple standalone images without comparison:
Bash(command="pinpoint review /tmp/step1.png /tmp/step2.png /tmp/step3.png --context '...'")
The Bash call:
Always pass --context — it shows in the toolbar and orients the user.
Never detach the call. No trailing &, no nohup, no disown. The CLI's stdout JSON is the whole point — detaching throws it away, the user clicks Send, and you never see the annotations. A PreToolUse hook will hard-block detached invocations.
If you need to do other work while the user annotates, use the Bash tool's run_in_background: true parameter (not shell &). The harness notifies you when it completes and you read stdout via BashOutput.
The user can also invoke the slash command /pinpoint:review <image>... themselves; the slash command is just a thin wrapper around the same CLI.
The moment the JSON returns with annotations, your first action is to call TaskCreate with one task per annotation. Use the annotation number + comment as the task title (e.g. #3: tag gap sucks, let's fix). Then work them one at a time — mark in_progress when you start, completed when you finish.
Why this is mandatory:
A PostToolUse hook bundled with the plugin will inject a reminder when annotations come back. Don't wait for it — task-list as soon as you see the JSON.
All modes return the same shape. mode is "review" (all standalone), "compare" (all pairs), or "mixed" (both):
{
"mode": "mixed",
"context": "Two comparisons + a standalone",
"slots": [
{ "type": "compare", "before": { "path": "/tmp/before.png", "width": 1440, "height": 900 }, "after": { "path": "/tmp/after.png", "width": 1440, "height": 900 } },
{ "type": "single", "image": { "path": "/tmp/extra.png", "width": 1440, "height": 900 } }
],
"images": [ ... ],
"annotations": [
{
"number": 1,
"image": "/tmp/before.png",
"imageIndex": 0,
"slotIndex": 0,
"side": "before",
"pin": { "x": 45.0, "y": 32.1 },
"box": { "x": 45.0, "y": 32.1, "width": 6.0, "height": 6.0 },
"comment": "Button too small here"
}
]
}
Each annotation has:
"before" or "after" on compare slots; absent on single slotsClassify intent (bug, change request, question, approval) yourself from the comment text. There's no severity field — judge urgency from wording.
After every task on the list is completed, capture a fresh screenshot and call pinpoint review again. Repeat until the user closes the loop without new annotations.
Pinpoint sessions can be packaged into a .pinpoint.zip (a real zip with review.json + raw image bytes inside) for handoff to another person. The user does the human-side work (clicking, emailing the file); your job is to run the CLI on either end.
The user hands you a .pinpoint.zip (or asks you to open one):
Bash(command="pinpoint open path/to/bundle.pinpoint.zip")
Behaves like pinpoint review — opens the annotator, blocks until the user hits Send in the toolbar, prints JSON. Follow the same workflow as §3 above: the moment annotations come back, task-list them before fixing anything.
If the bundle's review id collides with one already on disk, pass --mode:
replace — incoming wins (use when the file is the new source of truth)append — keep local annotations, add the bundle's with renumbered ids (parallel annotation)new — generate a fresh local id, leave the old review untouchedWithout --mode, the CLI prompts in a TTY or exits 2 in non-interactive contexts. With no collision, replace is implied — safe default.
The user wants to export their current session to send to someone else:
Tell them about the ⬇ download button in the toolbar (it's the fastest path). If they prefer the command line:
Bash(command="pinpoint export <reviewId>") # writes <reviewId>.pinpoint.zip in cwd
The review id is the trailing path segment of the annotator URL (/review/<id>).
There's also an MCP server (registered as pinpoint) exposing create_review, add_image, get_annotations, list_reviews — useful for non-interactive scripting. The CLI is the recommended path; only reach for MCP if you need to programmatically build a review without user interaction.
--context — it shows in the toolbar and helps the user orient~/.pinpoint/preferences.json/pinpoint:review … as plain text expecting it to run — it won't. Call Bash(pinpoint review …) instead.&, nohup, or disown — stdout is the JSON you need; detaching throws it away. Use foreground or run_in_background: true.Provides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub maferland/pinpoint --plugin pinpoint