skills/image-auditor/SKILL.md
Non-destructive image validation for accessibility and health.
npx skillsauth add notque/claude-code-toolkit image-auditorInstall 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.
Non-destructive 4-phase image validation pipeline: Discover, Validate, Analyze, Report. Read and follow the repository CLAUDE.md before starting any audit.
/image-audit # Audit entire site
/image-audit content/posts/ # Audit specific directory
/image-audit --post my-post.md # Audit single post
By default, every audit runs all check categories (alt text, existence, size, format, unused images) and calculates per-post page weight. Optional modes: Deep Scan includes theme images and assets/ directory. Auto-Optimize generates optimized versions (requires imagemagick and explicit user consent). Strict Mode treats all suggestions as blockers.
Goal: Build a complete map of all images and all image references in the codebase.
Step 1: Find all image files
Use Glob to locate image files:
static/**/*.{png,jpg,jpeg,gif,webp,svg}ls -la or stat) -- measure actual bytes, never estimateStep 2: Find all image references in content
Use Grep to search content files for these patterns:
 -- regex: !\[.*?\]\(.*?\){{< figure src="..." >}} -- regex: figure.*src=<img src="..." alt="..."> -- regex: <img.*src=.png), .jpg), .webp), .svg)Step 3: Build reference map
For each image reference, record:
Path Resolution Rules:
/images/foo.png resolves to static/images/foo.pngimages/foo.png resolves to static/images/foo.png../images/foo.png resolves relative to the content file's location (always resolve from the content file's directory, never check the literal string against static/)src= values follow the same resolution rulesGate: Reference map is complete with all images and all references catalogued. Proceed only when gate passes.
Goal: Check every reference and every image against quality criteria. Verify every reported issue by reading the actual file or reference before recording it -- never report an issue based on assumption alone.
Step 1: Alt text validation
| Status | Condition | |--------|-----------| | PASS | Alt text present, descriptive, 10-125 characters | | WARN | Alt text too generic (single words: "image", "screenshot", "picture", "photo", "diagram", "figure", "img") -- always check against this generic term list rather than subjectively judging quality | | FAIL | Alt text missing or empty |
15% of users rely on assistive technology, so validate all alt text regardless of perceived importance.
See references/alt-text-examples.md for detailed quality guidelines.
Step 2: File existence validation
| Status | Condition | |--------|-----------| | PASS | Image file exists at resolved path | | FAIL | Image file not found at resolved path |
Step 3: File size validation
| Status | Threshold | |--------|-----------| | PASS | <200KB | | WARN | 200KB-500KB | | FAIL | >500KB |
See references/size-guidelines.md for type-specific thresholds.
Step 4: Format appropriateness
| Image Type | Preferred Format | Detection Heuristic | |------------|------------------|---------------------| | Photos | WebP, JPEG | Filename: "photo", "hero", "banner" | | Screenshots | WebP, PNG | Filename: "screenshot", "screen-", "capture" | | Diagrams | SVG, WebP | Filename: "diagram", "chart", "graph", "flow" | | Icons/Logos | SVG | Filename: "icon", "logo", "favicon" |
Report format savings estimates and let the user decide whether to convert -- do not skip format recommendations on the assumption they are unnecessary.
See references/format-selection.md for the complete decision flowchart.
Step 5: Unused image detection
Compare all files in static/images/ against the reference map. Any file with zero references is reported as unused. Always perform this step -- unused images bloat the repository and deployment size.
Gate: All references validated against all criteria. Every issue has a severity level, file path, and line number. Proceed only when gate passes.
Goal: Compute aggregate metrics and optimization potential.
Step 1: Page weight per post
For each post containing images, sum total image bytes and count images.
| Status | Total Images | |--------|--------------| | Good | <1 MB | | Warn | 1-3 MB | | Critical | >3 MB |
Step 2: Optimization estimates
Calculate potential savings for each actionable item:
Present estimates as concrete byte counts (e.g., "save ~340 KB"), never as vague percentages alone.
Step 3: Identify highest-impact fixes
Rank issues by potential impact:
Gate: Metrics computed for all posts. Optimization estimates are concrete numbers. Priority ranking established. Proceed only when gate passes.
Goal: Generate a structured, actionable audit report. This phase is read-only -- never modify, resize, convert, or delete images. Report findings and recommendations only; changes require explicit user request.
Follow the report format in references/report-templates.md. The report must include:
Every issue in the report must include an absolute file path and line number so the user can locate and fix it. Clearly distinguish severity levels: FAIL (broken, must fix), WARN (should fix), INFO (suggestion). Do not conflate severity -- a format suggestion is not a blocker.
Gate: Report is complete with all sections populated. Every issue is actionable (file path + line number + recommendation). Report ends with a status line.
User says: "Run an image audit" Actions:
User says: "Check all images before we publish" Actions:
User says: "Audit images in content/posts/2024-12-theme.md" Actions:
Cause: Wrong directory, no content files, or non-standard image paths Solution:
Cause: imagemagick not installed or file permissions issue Solution:
identify command requires imagemagick packageCause: Relative paths in content that could resolve to multiple locations Solution:
Cause: File permissions prevent reading image files or content directories Solution:
ls -la on the failing pathWith pre-publish-checker: The pre-publish-checker skill performs basic image validation (existence, alt text presence). This skill provides deeper analysis including format optimization, page weight, and unused image detection. Use pre-publish for quick pass/fail; use image-auditor for comprehensive audits.
With Hugo build: Run image audit before hugo --minify to catch broken references and optimize assets before deployment.
Recommended cadence: Run full audit periodically (weekly or before releases). Address FAIL issues immediately. Schedule WARN issues for optimization sprints.
${CLAUDE_SKILL_DIR}/references/alt-text-examples.md: Good and bad alt text examples by image type${CLAUDE_SKILL_DIR}/references/size-guidelines.md: Maximum file sizes, dimension limits, page weight budgets${CLAUDE_SKILL_DIR}/references/format-selection.md: Format decision flowchart and detection heuristics${CLAUDE_SKILL_DIR}/references/report-templates.md: Full audit and single-post report templatesdocumentation
Document translation: quick/normal/refined modes with chunked parallel subagents and glossary support.
development
AI image generation: Gemini and Nano Banana backends; single/series/batch workflows with prompt-to-disk.
testing
Unified voice content generation pipeline with mandatory validation and joy-check. 13-phase pipeline: LOAD, GROUND, STATS-CHECKPOINT, GENERATE, HOOK-GATE, VALIDATE, REFINE, VARIETY-GATE, JOY-CHECK, ANTI-AI, CLOSE-GATE, OUTPUT, CLEANUP. Use when writing articles, blog posts, or any content that uses a voice profile. Use for "write article", "blog post", "write in voice", "generate content", "draft article", "write about".
documentation
Critique-and-rewrite loop for voice fidelity validation.