image-auditor

Non-destructive image validation for accessibility and health.

290 stars

Best use case

image-auditor is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Non-destructive image validation for accessibility and health.

Teams using image-auditor should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/image-auditor/SKILL.md --create-dirs "https://raw.githubusercontent.com/notque/claude-code-toolkit/main/skills/image-auditor/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/image-auditor/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How image-auditor Compares

Feature / Agentimage-auditorStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Non-destructive image validation for accessibility and health.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# Image Auditor Skill

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.

---

## Instructions

### Phase 1: DISCOVER

**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:
- Pattern: `static/**/*.{png,jpg,jpeg,gif,webp,svg}`
- Record each file's absolute path and size (use `ls -la` or `stat`) -- measure actual bytes, never estimate

**Step 2: Find all image references in content**

Use Grep to search content files for these patterns:
- Markdown images: `![alt](path)` -- regex: `!\[.*?\]\(.*?\)`
- Hugo figure shortcode: `{{< figure src="..." >}}` -- regex: `figure.*src=`
- HTML img tags: `<img src="..." alt="...">` -- regex: `<img.*src=`
- Raw path references: `.png)`, `.jpg)`, `.webp)`, `.svg)`

**Step 3: Build reference map**

For each image reference, record:
- Source file path (absolute)
- Line number
- Image path (as written in source)
- Resolved path (in static/)
- Alt text (if present)

**Path Resolution Rules:**
- `/images/foo.png` resolves to `static/images/foo.png`
- `images/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/)
- Hugo shortcode `src=` values follow the same resolution rules

**Gate**: Reference map is complete with all images and all references catalogued. Proceed only when gate passes.

### Phase 2: VALIDATE

**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.

### Phase 3: ANALYZE

**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:
- WebP conversion: ~30% for photos, ~25% for screenshots
- Resize to max 1200px width: varies by original dimensions
- Compression optimization: ~10-20% additional savings
- Total estimated savings across all recommendations

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:
1. Broken references (FAIL) -- content is visibly broken
2. Missing alt text (FAIL) -- accessibility violation
3. Oversized images on heavy pages -- worst page weight first
4. Format mismatches with largest savings potential

**Gate**: Metrics computed for all posts. Optimization estimates are concrete numbers. Priority ranking established. Proceed only when gate passes.

### Phase 4: REPORT

**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:

1. **Summary**: Total images, total size, posts with images, averages
2. **Alt Text Issues**: Every FAIL and WARN with file path, line number, current alt text
3. **File Size Issues**: Every oversized image with size and recommendation
4. **Missing Files**: Every broken reference with source file and line number
5. **Unused Images**: Every orphaned file with size
6. **Format Suggestions**: Aggregated conversion recommendations with estimated savings
7. **Page Weight**: Per-post breakdown, heaviest posts first
8. **Recommendations**: Numbered, prioritized action items
9. **Status Line**: PASS, WARN, or FAIL with counts

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.

---

## Examples

### Example 1: Clean Site
User says: "Run an image audit"
Actions:
1. Glob for all images in static/, Grep for all references in content/ (DISCOVER)
2. Validate alt text, existence, sizes, formats for each reference (VALIDATE)
3. Compute page weights and optimization potential (ANALYZE)
4. Generate report showing no critical issues, minor format suggestions (REPORT)
Result: STATUS: PASS with optional WebP conversion suggestions

### Example 2: Site with Multiple Issues
User says: "Check all images before we publish"
Actions:
1. Build reference map of 24 images across 8 posts (DISCOVER)
2. Find 2 missing alt texts, 1 broken reference, 1 oversized image (VALIDATE)
3. Calculate 4.2 MB total weight, 2.1 MB on heaviest post (ANALYZE)
4. Generate report with 4 critical issues and 5 format suggestions (REPORT)
Result: STATUS: FAIL with prioritized fix list

### Example 3: Single Post Audit
User says: "Audit images in content/posts/2024-12-theme.md"
Actions:
1. Grep that specific file for image references (DISCOVER)
2. Validate the 4 images found: 3 pass, 1 missing alt text (VALIDATE)
3. Sum 890 KB total weight for this post (ANALYZE)
4. Generate focused report for single post (REPORT)
Result: 1 issue to fix (missing alt text on line 45)

---

## Error Handling

### Error: "No Images Found"
Cause: Wrong directory, no content files, or non-standard image paths
Solution:
1. Verify static/images/ directory exists
2. Confirm content files use standard image reference patterns
3. Check for custom Hugo shortcodes that reference images differently

### Error: "Cannot Determine Image Dimensions"
Cause: imagemagick not installed or file permissions issue
Solution:
1. Skip dimension checks and audit only file size
2. Report that dimension analysis was skipped
3. Note that `identify` command requires imagemagick package

### Error: "Path Resolution Ambiguous"
Cause: Relative paths in content that could resolve to multiple locations
Solution:
1. Try resolving relative to the content file's directory first
2. Fall back to resolving relative to static/
3. Report both possible resolutions if ambiguous

### Error: "Permission Denied Reading Files"
Cause: File permissions prevent reading image files or content directories
Solution:
1. Check file permissions with `ls -la` on the failing path
2. Report which files are inaccessible and skip them
3. Note skipped files in the report summary so the user knows the audit is incomplete

---

## References

### Integration Notes

**With 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.

### Reference Files
- `${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 templates

Related Skills

link-auditor

290
from notque/claude-code-toolkit

Hugo site link health: scan markdown, build link graph, validate paths.

image-to-video

290
from notque/claude-code-toolkit

FFmpeg-based video creation from image and audio.

gemini-image-generator

290
from notque/claude-code-toolkit

Generate images from text prompts via Google Gemini.

cron-job-auditor

290
from notque/claude-code-toolkit

Audit cron scripts for reliability and safety.

x-api

290
from notque/claude-code-toolkit

Post tweets, build threads, upload media via the X API.

worktree-agent

290
from notque/claude-code-toolkit

Mandatory rules for agents in git worktree isolation.

workflow

290
from notque/claude-code-toolkit

Structured multi-phase workflows: review, debug, refactor, deploy, create, research, and more.

workflow-help

290
from notque/claude-code-toolkit

Interactive guide to workflow system: agents, skills, routing, execution patterns.

wordpress-uploader

290
from notque/claude-code-toolkit

WordPress REST API integration for posts and media uploads.

wordpress-live-validation

290
from notque/claude-code-toolkit

Validate published WordPress posts in browser via Playwright.

with-anti-rationalization

290
from notque/claude-code-toolkit

Anti-rationalization enforcement for maximum-rigor task execution.

voice-writer

290
from notque/claude-code-toolkit

Unified voice content generation pipeline with mandatory validation and joy-check. 8-phase pipeline: LOAD, GROUND, GENERATE, VALIDATE, REFINE, JOY-CHECK, 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".