Image Optimization Analysis

Image optimization analysis for SEO and performance.

How to use it

  1. Hit Copy SKILL.md — or use the Claude Code line below to get every file.
  2. Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
    ChatGPT: make a Project and paste it into Instructions.
    Neither? Paste it at the top of a new chat — it works for that chat.
  3. Describe your job in plain words. The AI follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit AgriciDaniel/claude-seo/skills/seo-images#main ~/.claude/skills/seo-images

For one project only, change the path to .claude/skills/seo-images. This skill also uses parse_html.py, iptc_ai_label.py — copying SKILL.md alone won't be enough. See the folder on GitHub.

Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Show the full text435 lines
seo-images/SKILL.md435 lines16.3 KBpushed 11d agoRawView on GitHub

Image Optimization Analysis

Checks

Alt Text

  • Present on all `` elements (except decorative: role="presentation")
  • Descriptive: describes the image content, not "image.jpg" or "photo"
  • Includes relevant keywords where natural, not keyword-stuffed
  • Length: 10-125 characters

Good examples:

  • "Professional plumber repairing kitchen sink faucet"
  • "Red 2024 Toyota Camry sedan front view"
  • "Team meeting in modern office conference room"

Bad examples:

  • "image.jpg" (filename, not description)
  • "plumber plumbing plumber services" (keyword stuffing)
  • "Click here" (not descriptive)

File Size

Tiered thresholds by image category:

Image Category Target Warning Critical
Thumbnails < 50KB > 100KB > 200KB
Content images < 100KB > 200KB > 500KB
Hero/banner images < 200KB > 300KB > 700KB

Recommend compression to target thresholds where possible without quality loss.

Format

Format Browser Support Use Case
WebP 97%+ Default recommendation
AVIF 92%+ Best compression, newer
JPEG 100% Fallback for photos
PNG 100% Graphics with transparency
SVG 100% Icons, logos, illustrations

Recommend WebP/AVIF over JPEG/PNG. Check for `` element with format fallbacks.

Recommended `` Element Pattern

Use progressive enhancement with the most efficient format first:

<picture>
  <source srcset="image.avif" type="image/avif">
  <source srcset="image.webp" type="image/webp">
  <img src="image.jpg" alt="Descriptive alt text" width="800" height="600" loading="lazy" decoding="async">
</picture>

The browser will use the first supported format. Current browser support: AVIF 93.8%, WebP 95.3%.

JPEG XL: Emerging Format

Third-party reporting and Wikipedia describe a Rust-based JPEG XL decoder as shipped in Chrome 145 stable (2026-02-10) behind the chrome://flags/#enable-jxl-image-format flag, not enabled by default; no Google-owned confirmation was retrieved in the fact pack. Because default support is not confirmed, it is not yet practical for production web delivery. Keep serving AVIF/WebP with JPEG fallback and monitor.

Responsive Images

  • srcset attribute for multiple sizes
  • sizes attribute matching layout breakpoints
  • Appropriate resolution for device pixel ratios
<img
  src="image-800.jpg"
  srcset="image-400.jpg 400w, image-800.jpg 800w, image-1200.jpg 1200w"
  sizes="(max-width: 600px) 400px, (max-width: 1200px) 800px, 1200px"
  alt="Description"
>

Lazy Loading

  • loading="lazy" on below-fold images
  • Do NOT lazy-load above-fold/hero images (hurts LCP)
  • Check for native vs JavaScript-based lazy loading
<!-- Below fold - lazy load -->
<img src="photo.jpg" loading="lazy" alt="Description">

<!-- Above fold - eager load (default) -->
<img src="hero.jpg" alt="Hero image">

Detected lazy-loader methods (lazy_method field)

"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run parse_html.py classifies each image's lazy-loading mechanism via the lazy_method field on every image entry. Five values:

lazy_method Signal detected Common stack
native loading="lazy" HTML attribute Modern browsers, plain HTML
perfmatters data-perfmatters-src/-srcset OR class perfmatters-lazy WordPress + Perfmatters plugin
ewww data-ewww-src / data-eio OR class lazyload-eio WordPress + EWWW Image Optimizer
js-generic data-src / data-lazy-src / data-original / data-srcset OR class lazyload/lazyloaded/lazy Lazysizes, vanilla-lazyload, jQuery plugins
none Neither attribute nor class signal Page is not lazy-loading this image

When auditing image SEO, report lazy_method alongside loading so users know whether their site is using a JS-driven lazy-loader (in which case the native loading="lazy" attribute is intentionally absent, that is not a regression).

fetchpriority="high" for LCP Images

Add fetchpriority="high" to your hero/LCP image to prioritize its download in the browser's network queue:

<img src="hero.webp" fetchpriority="high" alt="Hero image description" width="1200" height="630">

Critical: Do NOT lazy-load above-the-fold/LCP images. Using loading="lazy" on LCP images directly harms LCP scores. Reserve loading="lazy" for below-the-fold images only.

decoding="async" for Non-LCP Images

Add decoding="async" to non-LCP images to prevent image decoding from blocking the main thread:

<img src="photo.webp" alt="Description" width="600" height="400" loading="lazy" decoding="async">

CLS Prevention

  • width and height attributes set on all `` elements
  • aspect-ratio CSS as alternative
  • Flag images without dimensions
<!-- Good - dimensions set -->
<img src="photo.jpg" width="800" height="600" alt="Description">

<!-- Good - CSS aspect ratio -->
<img src="photo.jpg" style="aspect-ratio: 4/3" alt="Description">

<!-- Bad - no dimensions -->
<img src="photo.jpg" alt="Description">

File Names

  • Descriptive: blue-running-shoes.webp not IMG_1234.jpg
  • Hyphenated, lowercase, no special characters
  • Include relevant keywords

CDN Usage

  • Check if images served from CDN (different domain, CDN headers)
  • Recommend CDN for image-heavy sites
  • Check for edge caching headers

Output

Image Audit Summary

Metric Status Count
Total Images - XX
Missing Alt Text XX
Oversized (>200KB) ⚠️ XX
Wrong Format ⚠️ XX
No Dimensions ⚠️ XX
Not Lazy Loaded ⚠️ XX

Prioritized Optimization List

Sorted by file size impact (largest savings first):

Image Current Size Format Issues Est. Savings
... ... ... ... ...

Recommendations

  1. Convert X images to WebP format (est. XX KB savings)
  2. Add alt text to X images
  3. Add dimensions to X images
  4. Enable lazy loading on X below-fold images
  5. Compress X oversized images

Image SERP Analysis

When DataForSEO MCP is available, enhance the image audit with competitive data.

/seo images serp <keyword>

Cross-reference on-page images with Google Images SERP rankings.

Workflow:

  1. Fetch Google Images results via serp_google_images_live_advanced (depth=100)
  2. Extract: top domains, image types, alt text patterns
  3. Output competitor image SERP landscape

Output:

Rank Domain Title/Alt Image URL Page URL
1 example.com "Blue running shoes..." .../shoes.webp /products/...

Analysis includes:

  • Domain dominance: which sites own the most image positions (top 10 by count)
  • Alt text patterns: common title/alt patterns in top-ranking images
  • Format distribution: WebP vs JPEG vs PNG in top results
  • Opportunity score: keywords where you have page rankings but no image presence

If DataForSEO MCP is not available, inform user and suggest installing the extension.


Image File Optimization

Optimize image files for SEO: format conversion, metadata injection, compression.

/seo images optimize <path>

Optimize image file(s) for web and SEO. Converts to WebP/AVIF, injects IPTC metadata, compresses, and generates responsive variants.

Tools used (in order of preference):

  • exiftool -- EXIF/IPTC/XMP read/write (install: sudo apt install libimage-exiftool-perl)
  • cwebp -- WebP conversion (install: sudo apt install webp)
  • ImageMagick convert -- Format conversion, resizing (pre-installed on most systems)
  • FFmpeg -- Fallback for format conversion (pre-installed)

Before running: Check which tools are available with which exiftool cwebp convert ffmpeg.

Format Conversion

Convert images to modern formats with metadata preservation:

# WebP (recommended default) - with metadata preserved
cwebp -q 82 -metadata all input.jpg -o output.webp

# WebP via ImageMagick (fallback if cwebp not installed)
convert input.jpg -quality 82 output.webp

# AVIF via FFmpeg (slower encode, best compression)
ffmpeg -i input.jpg -c:v libaom-av1 -crf 30 -still-picture 1 output.avif

# Responsive variants (400w, 800w, 1200w)
convert input.jpg -resize 400x -quality 82 image-400.webp
convert input.jpg -resize 800x -quality 82 image-800.webp
convert input.jpg -resize 1200x -quality 82 image-1200.webp

Metadata Injection (IPTC for Google Images Display)

Google Images displays IPTC Creator, Credit Line, and Copyright in search results. This is NOT a ranking factor but can improve Google Images display and brand attribution.

With exiftool (preferred):

# Read all metadata
exiftool image.jpg

# Inject IPTC + XMP metadata for Google Images rich results
exiftool \
  -IPTC:ObjectName="Product Photo Description" \
  -IPTC:Caption-Abstract="Detailed image description" \
  -IPTC:By-line="Brand Name Photography" \
  -IPTC:Credit="Brand Name" \
  -IPTC:CopyrightNotice="Copyright 2026 Brand Name" \
  -IPTC:Source="brandname.com" \
  -XMP:Title="Product Photo Description" \
  -XMP:Description="Detailed image description" \
  -XMP:Creator="Brand Name Photography" \
  -XMP:Rights="Copyright 2026 Brand Name" \
  image.jpg

# Batch inject to all images in directory
exiftool -overwrite_original \
  -IPTC:By-line="Brand Name" \
  -IPTC:CopyrightNotice="Copyright 2026 Brand Name" \
  *.jpg *.webp *.png

With ImageMagick (fallback):

identify -verbose image.jpg | head -50

convert input.jpg \
  -set comment "Product Photo Description" \
  -set IPTC:2:80 "Brand Name Photography" \
  -set IPTC:2:116 "Copyright 2026 Brand Name" \
  output.jpg

Note: WebP supports EXIF and XMP but not IPTC natively. For WebP files, use XMP fields instead of IPTC. exiftool handles this conversion automatically.

AI-Generated Images: DigitalSourceType (Merchant Center requirement)

For product images produced by generative AI, Google Merchant Center requires IPTC DigitalSourceType: TrainedAlgorithmicMedia metadata. This is an operational policy requirement, not a ranking factor: feeds missing this label on AI-generated imagery can be disapproved.

Primary source (Merchant Center AI-generated content policy): https://support.google.com/merchants/answer/14743464 (the ai-optimization-guide does not document DigitalSourceType/IPTC/Merchant labeling.)

Audit command:

# Audit a directory for the IPTC label (counts: missing, ai, captured, etc.)
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run iptc_ai_label.py audit ./images/ --json

# Audit a single image
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run iptc_ai_label.py audit ./hero.webp --json

# Inject the AI label into an image
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run iptc_ai_label.py inject ./ai-hero.webp \
    --source-type trainedAlgorithmicMedia

# Other vocabulary values:
#   compositeSynthetic               (mix of captured + AI elements)
#   algorithmicMedia                 (created purely by algorithm, NOT from sampled training data)
#   compositeWithTrainedAlgorithmicMedia (e.g. AI inpainting/outpainting over real media)
#   digitalCapture                   (fully captured photograph)

Raw exiftool equivalents (for ad-hoc usage):

# Inject manually
exiftool \
  -XMP-iptcExt:DigitalSourceType="https://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia" \
  ai-generated-product.jpg

# Audit: find images missing the label across a directory
exiftool -if 'not $XMP-iptcExt:DigitalSourceType' \
  -filename -DigitalSourceType *.jpg *.webp *.png

Google extracts these IPTC DigitalSourceType values:

  • trainedAlgorithmicMedia: fully AI-generated (use this for diffusion-model product imagery)
  • compositeSynthetic: mixes captured + AI-generated elements
  • algorithmicMedia: created purely by an algorithm, not from sampled training data
  • compositeWithTrainedAlgorithmicMedia: composite of trained algorithmic media + other media (e.g. AI inpainting/outpainting over a real photo)
  • digitalCapture: fully captured photograph (note: digitalCapture is not on Google's extracted-values list, but is a valid IPTC value)

Provenance signals (consumer-facing): SynthID watermarks and C2PA Content Credentials are emerging signals for AI media identification. Treat product-surface coverage as subject to change unless verified from a current Google-owned source. This is detection/transparency, not an extra required Merchant feed field beyond IPTC DigitalSourceType.

Licensable images: to earn the Licensable badge, supply EITHER structured data (ImageObject with the license property + acquireLicensePage for the "Get this image" link) OR embedded IPTC photo metadata (Licensor URL / Web Statement of Rights). Cross-link seo-schema for the ImageObject markup.

Discovery note: image discovery now includes visual search fan-out across Lens / AI Mode / Circle to Search (Gemini multimodal scene/object understanding), so images surface via scene, objects, and materials, not alt text alone. No new published image-SEO lever yet; keep descriptive alt text + clean structured data.

When /seo images optimize is run on AI-generated assets, prompt the user to confirm the source type and inject the matching IPTC value automatically.

For AI-generated product titles and descriptions, Google Merchant Center also requires the AI-generated text to be separately specified and labeled in the feed. This is enforced at the feed layer, not the page layer, flag this in cross-reference with seo-ecommerce.

Metadata Audit

# Quick audit with exiftool
exiftool -IPTC:all -XMP:all -EXIF:ImageDescription image.jpg

# Batch audit - find images missing IPTC Creator
exiftool -if 'not $IPTC:By-line' -filename *.jpg *.webp *.png

Full Optimization Pipeline

For maximum image SEO, run this pipeline on each image:

  1. Audit existing metadata: exiftool -IPTC:all -XMP:all image.jpg
  2. Inject IPTC/XMP metadata: Creator, Copyright, Description
  3. Convert to WebP: cwebp -q 82 -metadata all image.jpg -o image.webp
  4. Generate responsive variants: 400w, 800w, 1200w
  5. Verify metadata preserved: exiftool image.webp
  6. Generate `` HTML: AVIF > WebP > JPEG fallback chain

What Matters vs What Doesn't for Google Images

Factor Impact Where to Set
Alt text CRITICAL (ranking) HTML ``
Filename HIGH (ranking) File system (descriptive, hyphenated)
Page context HIGH (ranking) Surrounding HTML content
File size/speed MEDIUM (indirect via CWV) Compression + format conversion
IPTC Creator/Copyright LOW (display only) Image file metadata
EXIF camera data NONE Irrelevant for SEO
IPTC Keywords NONE Google ignores these

Error Handling

Scenario Action
URL unreachable Report connection error with status code. Suggest verifying URL and checking if site requires authentication.
No images found on page Report that no `` elements were detected. Suggest checking if images are loaded via JavaScript or CSS background-image.
Images behind CDN or authentication Note that image files could not be directly accessed for size analysis. Report available metadata (alt text, dimensions, format from markup) and flag inaccessible resources.
exiftool not installed Fall back to ImageMagick for metadata. Recommend: sudo apt install libimage-exiftool-perl
cwebp not installed Fall back to ImageMagick or FFmpeg for WebP conversion. Recommend: sudo apt install webp
DataForSEO MCP not available Skip Image SERP Analysis section. Note extension is not installed.
1---
2name: seo-images
3description: >
4 Image optimization analysis for SEO and performance. Checks alt text, file
5 sizes, formats, responsive images, lazy loading, CLS prevention, image SERP
6 rankings (via DataForSEO), and image file optimization (WebP/AVIF conversion,
7 IPTC/XMP metadata injection). Use when user says "image optimization",
8 "alt text", "image SEO", "image size", "image audit", "optimize images",
9 "image metadata", "image SERP", "convert to webp", or "image file optimize".
10user-invocable: true
11argument-hint: "[url]"
12license: MIT
13metadata:
14 author: AgriciDaniel
15 version: "2.3.1"
16 category: seo
17---
18 
19# Image Optimization Analysis
20 
21## Checks
22 
23### Alt Text
24- Present on all `<img>` elements (except decorative: `role="presentation"`)
25- Descriptive: describes the image content, not "image.jpg" or "photo"
26- Includes relevant keywords where natural, not keyword-stuffed
27- Length: 10-125 characters
28 
29**Good examples:**
30- "Professional plumber repairing kitchen sink faucet"
31- "Red 2024 Toyota Camry sedan front view"
32- "Team meeting in modern office conference room"
33 
34**Bad examples:**
35- "image.jpg" (filename, not description)
36- "plumber plumbing plumber services" (keyword stuffing)
37- "Click here" (not descriptive)
38 
39### File Size
40 
41**Tiered thresholds by image category:**
42 
43| Image Category | Target | Warning | Critical |
44|----------------|--------|---------|----------|
45| Thumbnails | < 50KB | > 100KB | > 200KB |
46| Content images | < 100KB | > 200KB | > 500KB |
47| Hero/banner images | < 200KB | > 300KB | > 700KB |
48 
49Recommend compression to target thresholds where possible without quality loss.
50 
51### Format
52| Format | Browser Support | Use Case |
53|--------|-----------------|----------|
54| WebP | 97%+ | Default recommendation |
55| AVIF | 92%+ | Best compression, newer |
56| JPEG | 100% | Fallback for photos |
57| PNG | 100% | Graphics with transparency |
58| SVG | 100% | Icons, logos, illustrations |
59 
60Recommend WebP/AVIF over JPEG/PNG. Check for `<picture>` element with format fallbacks.
61 
62#### Recommended `<picture>` Element Pattern
63 
64Use progressive enhancement with the most efficient format first:
65 
66```html
67<picture>
68 <source srcset="image.avif" type="image/avif">
69 <source srcset="image.webp" type="image/webp">
70 <img src="image.jpg" alt="Descriptive alt text" width="800" height="600" loading="lazy" decoding="async">
71</picture>
72```
73 
74The browser will use the first supported format. Current browser support: AVIF 93.8%, WebP 95.3%.
75 
76#### JPEG XL: Emerging Format
77 
78Third-party reporting and Wikipedia describe a Rust-based JPEG XL decoder as shipped in Chrome 145 stable (2026-02-10) behind the `chrome://flags/#enable-jxl-image-format` flag, not enabled by default; no Google-owned confirmation was retrieved in the fact pack. Because default support is not confirmed, it is not yet practical for production web delivery. Keep serving AVIF/WebP with JPEG fallback and monitor.
79 
80### Responsive Images
81- `srcset` attribute for multiple sizes
82- `sizes` attribute matching layout breakpoints
83- Appropriate resolution for device pixel ratios
84 
85```html
86<img
87 src="image-800.jpg"
88 srcset="image-400.jpg 400w, image-800.jpg 800w, image-1200.jpg 1200w"
89 sizes="(max-width: 600px) 400px, (max-width: 1200px) 800px, 1200px"
90 alt="Description"
91>
92```
93 
94### Lazy Loading
95- `loading="lazy"` on below-fold images
96- Do NOT lazy-load above-fold/hero images (hurts LCP)
97- Check for native vs JavaScript-based lazy loading
98 
99```html
100<!-- Below fold - lazy load -->
101<img src="photo.jpg" loading="lazy" alt="Description">
102 
103<!-- Above fold - eager load (default) -->
104<img src="hero.jpg" alt="Hero image">
105```
106 
107#### Detected lazy-loader methods (`lazy_method` field)
108 
109`"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run parse_html.py` classifies each image's lazy-loading mechanism via the
110`lazy_method` field on every image entry. Five values:
111 
112| `lazy_method` | Signal detected | Common stack |
113|---|---|---|
114| `native` | `loading="lazy"` HTML attribute | Modern browsers, plain HTML |
115| `perfmatters` | `data-perfmatters-src`/`-srcset` OR class `perfmatters-lazy` | WordPress + Perfmatters plugin |
116| `ewww` | `data-ewww-src` / `data-eio` OR class `lazyload-eio` | WordPress + EWWW Image Optimizer |
117| `js-generic` | `data-src` / `data-lazy-src` / `data-original` / `data-srcset` OR class `lazyload`/`lazyloaded`/`lazy` | Lazysizes, vanilla-lazyload, jQuery plugins |
118| `none` | Neither attribute nor class signal | Page is not lazy-loading this image |
119 
120When auditing image SEO, report `lazy_method` alongside `loading` so users know
121whether their site is using a JS-driven lazy-loader (in which case the native
122`loading="lazy"` attribute is intentionally absent, that is not a regression).
123 
124### `fetchpriority="high"` for LCP Images
125 
126Add `fetchpriority="high"` to your hero/LCP image to prioritize its download in the browser's network queue:
127 
128```html
129<img src="hero.webp" fetchpriority="high" alt="Hero image description" width="1200" height="630">
130```
131 
132**Critical:** Do NOT lazy-load above-the-fold/LCP images. Using `loading="lazy"` on LCP images directly harms LCP scores. Reserve `loading="lazy"` for below-the-fold images only.
133 
134### `decoding="async"` for Non-LCP Images
135 
136Add `decoding="async"` to non-LCP images to prevent image decoding from blocking the main thread:
137 
138```html
139<img src="photo.webp" alt="Description" width="600" height="400" loading="lazy" decoding="async">
140```
141 
142### CLS Prevention
143- `width` and `height` attributes set on all `<img>` elements
144- `aspect-ratio` CSS as alternative
145- Flag images without dimensions
146 
147```html
148<!-- Good - dimensions set -->
149<img src="photo.jpg" width="800" height="600" alt="Description">
150 
151<!-- Good - CSS aspect ratio -->
152<img src="photo.jpg" style="aspect-ratio: 4/3" alt="Description">
153 
154<!-- Bad - no dimensions -->
155<img src="photo.jpg" alt="Description">
156```
157 
158### File Names
159- Descriptive: `blue-running-shoes.webp` not `IMG_1234.jpg`
160- Hyphenated, lowercase, no special characters
161- Include relevant keywords
162 
163### CDN Usage
164- Check if images served from CDN (different domain, CDN headers)
165- Recommend CDN for image-heavy sites
166- Check for edge caching headers
167 
168## Output
169 
170### Image Audit Summary
171 
172| Metric | Status | Count |
173|--------|--------|-------|
174| Total Images | - | XX |
175| Missing Alt Text | ❌ | XX |
176| Oversized (>200KB) | ⚠️ | XX |
177| Wrong Format | ⚠️ | XX |
178| No Dimensions | ⚠️ | XX |
179| Not Lazy Loaded | ⚠️ | XX |
180 
181### Prioritized Optimization List
182 
183Sorted by file size impact (largest savings first):
184 
185| Image | Current Size | Format | Issues | Est. Savings |
186|-------|--------------|--------|--------|--------------|
187| ... | ... | ... | ... | ... |
188 
189### Recommendations
1901. Convert X images to WebP format (est. XX KB savings)
1912. Add alt text to X images
1923. Add dimensions to X images
1934. Enable lazy loading on X below-fold images
1945. Compress X oversized images
195 
196---
197 
198## Image SERP Analysis
199 
200When DataForSEO MCP is available, enhance the image audit with competitive data.
201 
202### `/seo images serp <keyword>`
203 
204Cross-reference on-page images with Google Images SERP rankings.
205 
206**Workflow:**
2071. Fetch Google Images results via `serp_google_images_live_advanced` (depth=100)
2082. Extract: top domains, image types, alt text patterns
2093. Output competitor image SERP landscape
210 
211**Output:**
212 
213| Rank | Domain | Title/Alt | Image URL | Page URL |
214|------|--------|-----------|-----------|----------|
215| 1 | example.com | "Blue running shoes..." | .../shoes.webp | /products/... |
216 
217**Analysis includes:**
218- **Domain dominance**: which sites own the most image positions (top 10 by count)
219- **Alt text patterns**: common title/alt patterns in top-ranking images
220- **Format distribution**: WebP vs JPEG vs PNG in top results
221- **Opportunity score**: keywords where you have page rankings but no image presence
222 
223If DataForSEO MCP is not available, inform user and suggest installing the extension.
224 
225---
226 
227## Image File Optimization
228 
229Optimize image files for SEO: format conversion, metadata injection, compression.
230 
231### `/seo images optimize <path>`
232 
233Optimize image file(s) for web and SEO. Converts to WebP/AVIF, injects IPTC
234metadata, compresses, and generates responsive variants.
235 
236**Tools used (in order of preference):**
237- `exiftool` -- EXIF/IPTC/XMP read/write (install: `sudo apt install libimage-exiftool-perl`)
238- `cwebp` -- WebP conversion (install: `sudo apt install webp`)
239- ImageMagick `convert` -- Format conversion, resizing (pre-installed on most systems)
240- FFmpeg -- Fallback for format conversion (pre-installed)
241 
242**Before running:** Check which tools are available with `which exiftool cwebp convert ffmpeg`.
243 
244### Format Conversion
245 
246Convert images to modern formats with metadata preservation:
247 
248```bash
249# WebP (recommended default) - with metadata preserved
250cwebp -q 82 -metadata all input.jpg -o output.webp
251 
252# WebP via ImageMagick (fallback if cwebp not installed)
253convert input.jpg -quality 82 output.webp
254 
255# AVIF via FFmpeg (slower encode, best compression)
256ffmpeg -i input.jpg -c:v libaom-av1 -crf 30 -still-picture 1 output.avif
257 
258# Responsive variants (400w, 800w, 1200w)
259convert input.jpg -resize 400x -quality 82 image-400.webp
260convert input.jpg -resize 800x -quality 82 image-800.webp
261convert input.jpg -resize 1200x -quality 82 image-1200.webp
262```
263 
264### Metadata Injection (IPTC for Google Images Display)
265 
266Google Images displays IPTC Creator, Credit Line, and Copyright in search results.
267This is **NOT a ranking factor** but can improve Google Images display and brand attribution.
268 
269**With exiftool (preferred):**
270```bash
271# Read all metadata
272exiftool image.jpg
273 
274# Inject IPTC + XMP metadata for Google Images rich results
275exiftool \
276 -IPTC:ObjectName="Product Photo Description" \
277 -IPTC:Caption-Abstract="Detailed image description" \
278 -IPTC:By-line="Brand Name Photography" \
279 -IPTC:Credit="Brand Name" \
280 -IPTC:CopyrightNotice="Copyright 2026 Brand Name" \
281 -IPTC:Source="brandname.com" \
282 -XMP:Title="Product Photo Description" \
283 -XMP:Description="Detailed image description" \
284 -XMP:Creator="Brand Name Photography" \
285 -XMP:Rights="Copyright 2026 Brand Name" \
286 image.jpg
287 
288# Batch inject to all images in directory
289exiftool -overwrite_original \
290 -IPTC:By-line="Brand Name" \
291 -IPTC:CopyrightNotice="Copyright 2026 Brand Name" \
292 *.jpg *.webp *.png
293```
294 
295**With ImageMagick (fallback):**
296```bash
297identify -verbose image.jpg | head -50
298 
299convert input.jpg \
300 -set comment "Product Photo Description" \
301 -set IPTC:2:80 "Brand Name Photography" \
302 -set IPTC:2:116 "Copyright 2026 Brand Name" \
303 output.jpg
304```
305 
306Note: WebP supports EXIF and XMP but not IPTC natively. For WebP files,
307use XMP fields instead of IPTC. exiftool handles this conversion automatically.
308 
309### AI-Generated Images: `DigitalSourceType` (Merchant Center requirement)
310 
311For product images produced by generative AI, **Google Merchant Center requires**
312IPTC `DigitalSourceType: TrainedAlgorithmicMedia` metadata. This is an
313operational policy requirement, not a ranking factor: feeds missing this label
314on AI-generated imagery can be disapproved.
315 
316Primary source (Merchant Center AI-generated content policy):
317https://support.google.com/merchants/answer/14743464
318(the ai-optimization-guide does not document DigitalSourceType/IPTC/Merchant labeling.)
319 
320**Audit command:**
321 
322```bash
323# Audit a directory for the IPTC label (counts: missing, ai, captured, etc.)
324"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run iptc_ai_label.py audit ./images/ --json
325 
326# Audit a single image
327"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run iptc_ai_label.py audit ./hero.webp --json
328 
329# Inject the AI label into an image
330"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run iptc_ai_label.py inject ./ai-hero.webp \
331 --source-type trainedAlgorithmicMedia
332 
333# Other vocabulary values:
334# compositeSynthetic (mix of captured + AI elements)
335# algorithmicMedia (created purely by algorithm, NOT from sampled training data)
336# compositeWithTrainedAlgorithmicMedia (e.g. AI inpainting/outpainting over real media)
337# digitalCapture (fully captured photograph)
338```
339 
340**Raw exiftool equivalents** (for ad-hoc usage):
341 
342```bash
343# Inject manually
344exiftool \
345 -XMP-iptcExt:DigitalSourceType="https://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia" \
346 ai-generated-product.jpg
347 
348# Audit: find images missing the label across a directory
349exiftool -if 'not $XMP-iptcExt:DigitalSourceType' \
350 -filename -DigitalSourceType *.jpg *.webp *.png
351```
352 
353Google extracts these IPTC `DigitalSourceType` values:
354- `trainedAlgorithmicMedia`: fully AI-generated (use this for diffusion-model
355 product imagery)
356- `compositeSynthetic`: mixes captured + AI-generated elements
357- `algorithmicMedia`: created purely by an algorithm, **not** from sampled
358 training data
359- `compositeWithTrainedAlgorithmicMedia`: composite of trained algorithmic
360 media + other media (e.g. AI inpainting/outpainting over a real photo)
361- `digitalCapture`: fully captured photograph (note: `digitalCapture` is **not**
362 on Google's extracted-values list, but is a valid IPTC value)
363 
364> **Provenance signals (consumer-facing):** **SynthID** watermarks and **C2PA**
365> Content Credentials are emerging signals for AI media identification. Treat
366> product-surface coverage as subject to change unless verified from a current
367> Google-owned source.
368> This is detection/transparency, **not** an extra required Merchant feed field
369> beyond IPTC DigitalSourceType.
370 
371> **Licensable images:** to earn the Licensable badge, supply EITHER structured
372> data (`ImageObject` with the `license` property + `acquireLicensePage` for the
373> "Get this image" link) OR embedded IPTC photo metadata (Licensor URL / Web
374> Statement of Rights). Cross-link `seo-schema` for the ImageObject markup.
375 
376> **Discovery note:** image discovery now includes **visual search fan-out**
377> across Lens / AI Mode / Circle to Search (Gemini multimodal scene/object
378> understanding), so images surface via scene, objects, and materials, not alt
379> text alone. No new published image-SEO lever yet; keep descriptive alt text +
380> clean structured data.
381 
382When `/seo images optimize` is run on AI-generated assets, prompt the user to
383confirm the source type and inject the matching IPTC value automatically.
384 
385For **AI-generated product titles and descriptions**, Google Merchant Center
386also requires the AI-generated text to be separately specified and labeled in
387the feed. This is enforced at the feed layer, not the page layer, flag this
388in cross-reference with `seo-ecommerce`.
389 
390### Metadata Audit
391 
392```bash
393# Quick audit with exiftool
394exiftool -IPTC:all -XMP:all -EXIF:ImageDescription image.jpg
395 
396# Batch audit - find images missing IPTC Creator
397exiftool -if 'not $IPTC:By-line' -filename *.jpg *.webp *.png
398```
399 
400### Full Optimization Pipeline
401 
402For maximum image SEO, run this pipeline on each image:
403 
4041. **Audit existing metadata**: `exiftool -IPTC:all -XMP:all image.jpg`
4052. **Inject IPTC/XMP metadata**: Creator, Copyright, Description
4063. **Convert to WebP**: `cwebp -q 82 -metadata all image.jpg -o image.webp`
4074. **Generate responsive variants**: 400w, 800w, 1200w
4085. **Verify metadata preserved**: `exiftool image.webp`
4096. **Generate `<picture>` HTML**: AVIF > WebP > JPEG fallback chain
410 
411### What Matters vs What Doesn't for Google Images
412 
413| Factor | Impact | Where to Set |
414|--------|--------|--------------|
415| Alt text | **CRITICAL** (ranking) | HTML `<img alt="">` |
416| Filename | **HIGH** (ranking) | File system (descriptive, hyphenated) |
417| Page context | **HIGH** (ranking) | Surrounding HTML content |
418| File size/speed | **MEDIUM** (indirect via CWV) | Compression + format conversion |
419| IPTC Creator/Copyright | **LOW** (display only) | Image file metadata |
420| EXIF camera data | NONE | Irrelevant for SEO |
421| IPTC Keywords | NONE | Google ignores these |
422 
423---
424 
425## Error Handling
426 
427| Scenario | Action |
428|----------|--------|
429| URL unreachable | Report connection error with status code. Suggest verifying URL and checking if site requires authentication. |
430| No images found on page | Report that no `<img>` elements were detected. Suggest checking if images are loaded via JavaScript or CSS background-image. |
431| Images behind CDN or authentication | Note that image files could not be directly accessed for size analysis. Report available metadata (alt text, dimensions, format from markup) and flag inaccessible resources. |
432| exiftool not installed | Fall back to ImageMagick for metadata. Recommend: `sudo apt install libimage-exiftool-perl` |
433| cwebp not installed | Fall back to ImageMagick or FFmpeg for WebP conversion. Recommend: `sudo apt install webp` |
434| DataForSEO MCP not available | Skip Image SERP Analysis section. Note extension is not installed. |
435 

Discussion

Alternatives

Also in SEO & keywords