From image-annotation
Apply annotations to an image — arrows, text callouts, boxes, highlights, numbered markers — driven by a JSON spec. Originals are never modified; output goes to <input_dir>/annotated/<stem>_annotated<ext> by default.
How this skill is triggered — by the user, by Claude, or both
Slash command
/image-annotation:annotateThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Apply visual annotations to an existing image file via the bundled Pillow-based annotator.
Apply visual annotations to an existing image file via the bundled Pillow-based annotator.
This skill never modifies the original image unless the user explicitly says so. Default output behaviour:
--output is given, write there.<input_dir>/annotated/<stem>_annotated<ext> (directory created if missing).--in-place overwrites the input. Only pass this when the user has explicitly confirmed they want the original replaced.This rule is enforced by scripts/annotate.py. Do not bypass it by calling ImageMagick directly to write back over the input.
/tmp/annot-spec-<random>.json).python3 "$CLAUDE_PLUGIN_ROOT/scripts/annotate.py" \
--input "$INPUT" \
--spec "$SPEC_JSON" \
[--output "$OUTPUT"] # optional; default = <dir>/annotated/<stem>_annotated.<ext>
[--in-place] # only with explicit user consent
{
"operations": [
{"type": "arrow", "from": [100, 200], "to": [300, 200], "color": "red", "width": 4},
{"type": "box", "xy": [50, 50, 200, 100], "color": "red", "width": 3},
{"type": "text", "xy": [60, 40], "content": "Look here", "color": "red", "size": 28, "background": true},
{"type": "callout", "target": [400, 300], "label": [500, 200], "content": "Step 1", "color": "red", "size": 22},
{"type": "highlight", "xy": [10, 10, 200, 50], "color": "yellow", "opacity": 96},
{"type": "marker", "xy": [120, 240], "number": 1, "color": "red", "radius": 18}
]
}
Coordinates are pixels from the top-left of the image.
color: red for arrows/boxes/markers; yellow for highlights."background": true (translucent white pad with red outline) unless the user says otherwise.install-deps).For a one-shot "draw an arrow at X→Y", still go through this script with a one-op spec. Don't reach for a separate ImageMagick invocation — keeping a single code path keeps the originals-clean rule airtight.
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 danielrosehill/claude-code-plugins --plugin image-annotation