plugins/seo/skills/image-seo/SKILL.md
Optimizes images for search engines, Core Web Vitals, and visual search. Covers format selection (AVIF/WebP/JPEG), LCP optimization with fetchpriority, lazy loading rules, alt text best practices, responsive images (srcset/sizes), compression thresholds, Google Lens optimization, and Open Graph images. Use when optimizing image performance, fixing LCP issues caused by images, writing alt text, setting up responsive images, or optimizing for visual search. Trigger phrases: 'image optimization', 'lazy loading', 'WebP', 'AVIF', 'alt text', 'image compression', 'OG image', 'Google Lens'. NOT for general page speed (use technical-seo) or on-page keyword optimization (use on-page-seo).
npx skillsauth add petrogurcak/skills image-seoInstall 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.
| Area | Action |
|------|--------|
| Format | AVIF > WebP > JPEG via <picture> |
| LCP image | fetchpriority="high" + <link rel="preload"> + NEVER lazy-load |
| Below-fold | loading="lazy" on all images outside viewport |
| Alt text | Under 125 chars, specific, contextual |
| Dimensions | Always set width and height (prevents CLS) |
| Responsive | 4-6 srcset breakpoints, use w descriptors |
| Compression | JPEG 75-85, WebP 70-80, AVIF 45-60 quality |
| Heroes | Target <200KB; product <150KB; OG 1200×630 <300KB |
| Image sitemap | Required for JS-heavy or large e-commerce sites |
| Visual search | Original photos, clear subjects, Product schema |
| Format | Global Support | Compression vs JPEG | Recommended Quality | Status | |--------|---------------|---------------------|---------------------|--------| | WebP | ~97% | ~30% smaller | 70–80 | Universal. Safe default. | | AVIF | ~95% | ~50% smaller | 45–60 | Production-ready. Best compression. | | JPEG | ~100% | baseline | 75–85 | Safety net fallback. | | JPEG XL | ~10% | ~60% smaller | — | Not viable. Skip until Chrome H2 2026. |
Key numbers:
Trade-off: AVIF compresses better but decodes slower (higher CPU). For LCP hero images on low-powered devices, WebP may be faster end-to-end. Test both.
<picture> Element PatternServe AVIF first, WebP as fallback, JPEG as safety net:
<picture>
<source srcset="image.avif" type="image/avif">
<source srcset="image.webp" type="image/webp">
<img src="image.jpg" alt="Freshly baked vegan chocolate cake topped with raspberries" width="800" height="600">
</picture>
Always include width and height on <img> — the browser uses these to reserve layout space and prevent Cumulative Layout Shift (CLS).
Data from real-world testing:
| Loading strategy | LCP p75 | Poor scores | |-----------------|---------|-------------| | Preloaded (fetchpriority="high") | 364ms | 0% | | Lazy-loaded | 720ms | 4.3% |
<!-- In <head>: preload hint for LCP image -->
<link rel="preload" href="hero.avif" as="image" fetchpriority="high">
<!-- Hero / LCP image: eager + priority -->
<img
src="hero.avif"
alt="..."
loading="eager"
fetchpriority="high"
width="1200"
height="600"
>
<!-- All below-fold images: lazy -->
<img
src="product.webp"
alt="..."
loading="lazy"
width="400"
height="300"
>
| Eager (loading="eager") | Lazy (loading="lazy") |
|--------------------------|------------------------|
| Hero / banner (LCP) | Product galleries below fold |
| Logo | Blog post body images |
| First visible product image | Comments section images |
| Background images in viewport | Footer images |
| Anything above the fold | Anything below the fold |
Native loading="lazy" is sufficient for most cases. JS libraries (IntersectionObserver-based) are only needed when you require: custom thresholds, blur-up/placeholder effects, or lazy loading of CSS background images.
Google combines three signals to understand images:
Alt text directly determines image search visibility and contributes to overall page relevance.
alt="" (empty, not missing) for purely decorative images| Bad | Good |
|-----|------|
| "cake" | "Freshly baked vegan chocolate cake topped with raspberries on a white ceramic plate" |
| "photo of suitcase" | "Black hard-shell carry-on suitcase with adjustable telescoping handle, 22 inches" |
| "SEO keywords best buy click here" | "Team reviewing marketing analytics dashboard on laptop in open office" |
Major tools (2025–2026): AltText.ai, ImgSEO (WordPress plugin), Contentful AI, Writer.com.
Reported accuracy ~99% for straightforward product/object images. Falls short on: contextual meaning (why the image matters on this page), brand-specific terminology, nuanced scenes requiring domain knowledge.
Recommendation: Use AI-generated alt text as a starting point, then manually review for context accuracy.
EAA became mandatory June 28, 2025. Proper alt text is now a legal requirement in the EU, not optional. Any EU-facing website or app must comply.
<img
srcset="image-400.webp 400w,
image-768.webp 768w,
image-1024.webp 1024w,
image-1920.webp 1920w"
sizes="(max-width: 600px) 100vw,
(max-width: 1024px) 50vw,
33vw"
src="image-768.webp"
alt="Description"
width="1920"
height="1280"
loading="lazy"
>
Use width descriptors (w) over pixel density descriptors (x) — they give browsers more flexibility to select the right image based on actual display size and DPR.
| Device | Width | |--------|-------| | Mobile | 400px | | Mobile large | 768px | | Tablet | 1024px | | Desktop | 1920px | | Retina ceiling | 2560px |
Sweet spot: 4–6 breakpoints. Too many srcset variants reduce CDN cache hit ratio, hurting performance more than serving a slightly larger image.
| CDN | Best For | Pricing | |-----|----------|---------| | Cloudflare Images | Simple sites, budget | Free under 1,500 images; $0.50/1K transforms | | Cloudinary | Complex transforms, video | Free tier: 25 credits/mo (~25GB bandwidth) | | Imgix | High-traffic media sites | Min $100/mo, best raw performance | | ImageKit | Mid-tier alternative | Competitive pricing, good feature set |
All major CDNs support: automatic format negotiation (serve AVIF/WebP based on Accept header), AI-aware smart cropping, and on-the-fly responsive resizing via URL parameters.
| Format | Optimal Quality Range | Notes | |--------|-----------------------|-------| | JPEG | 75–85 | Below 75: visible artifacts. Above 85: diminishing returns. | | WebP | 70–80 | Matches JPEG 90–95 visual quality. | | AVIF | 45–60 | Outperforms WebP at smaller file size. | | PNG | Lossless | Use only for graphics/text/transparency; always optimize. |
| Image Type | Target | |------------|--------| | Hero / LCP image | <200KB (ideally <100KB) | | Product images | <150KB | | Thumbnails | <30KB | | OG / social images | <300KB |
Use SSIM (Structural Similarity Index) or VMAF for automated quality thresholds — aim for SSIM > 0.95 as your floor. More reliable than eyeballing.
| Category | Tools | |----------|-------| | Build-time | webpack image-loader, gulp-imagemin, Next.js Image Optimization, sharp (Node.js) | | CDN/SaaS | Cloudinary, Imgix, Cloudflare (auto-optimize on delivery) | | Standalone | TinyPNG, Squoosh (Google), ImageOptim (Mac), sharp CLI |
Google Lens processes over 12 billion visual searches per month. 62% of Gen Z and Millennial consumers prefer visual search over text search.
Product and ImageObject schema.org markup. Structured data helps Lens match images to entity types.For Product and ImageObject JSON-LD implementation → see schema-markup skill.
<meta property="og:image" content="https://example.com/og-image.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="Description of the image">
<meta property="og:image:type" content="image/jpeg">
Including og:image:width and og:image:height prevents platforms from guessing dimensions — improves load speed and prevents layout shifts in link previews.
og:image:alt matters for AEO — LLMs and AI-powered search engines use this to interpret shared content context. Do not omit it.
| Platform | Dimensions | Notes |
|----------|-----------|-------|
| Facebook | 1200×630 | Standard OG |
| Twitter/X | 1200×628 | twitter:card="summary_large_image" required |
| LinkedIn | 1200×627 | Strict minimums; won't render below 200×200 |
| Slack/Discord | 1200×630 | Standard OG |
Image sitemaps help Google discover images that standard crawling misses:
| Scenario | Image sitemap needed? | |----------|----------------------| | JavaScript-rendered galleries (React/Vue/Angular) | Yes | | Lazy-loaded images Googlebot may not scroll to | Yes | | Images behind tabs, accordions, interactive elements | Yes | | CDN-hosted images on a different domain | Yes | | E-commerce with large product catalogs | Yes | | Static HTML site where Googlebot can crawl freely | No |
Most websites do NOT have image sitemaps, meaning visual content may never get indexed. For image-heavy sites, this is low-effort, high-impact.
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
<url>
<loc>https://example.com/product/blue-sneakers</loc>
<image:image>
<image:loc>https://cdn.example.com/images/blue-sneakers-main.jpg</image:loc>
<image:caption>Blue canvas sneakers with white rubber sole, size 42</image:caption>
</image:image>
<image:image>
<image:loc>https://cdn.example.com/images/blue-sneakers-side.jpg</image:loc>
<image:caption>Side view of blue canvas sneakers showing ankle support</image:caption>
</image:image>
</url>
</urlset>
Submit image sitemaps in Google Search Console under the same property as the pages that reference the images. Monitor the "Images" section under Coverage for indexing rates.
technical-seoon-page-seoschema-markupsitemap-managementdevelopment
Builds a pre-launch social proof strategy through structured beta programs using D'Souza Brain Audit interviews. Use when launching new products/services and need compelling testimonials, planning a beta cohort, designing interview questions to harvest objection-busting social proof, improving video testimonials for landing pages, or designing case studies with metrics. Trigger phrases include "beta tester program for testimonials", "pre-launch social proof", "Brain Audit testimonial framework", "case study harvest", "reverse testimonial", "video testimonial mechanics", "social proof landing page", "sběr referencí", "beta tester program", "testimonial pro landing page", "social proof před launchem", "rozhovor s klientem", "case study sběr", "reference před spuštěním". NOT for ongoing case study production (use growth-hacking case-study approach), offer design (use offer-creation), or conversion optimization (use ux-optimization).
development
Use when planning a product launch and the product type is unclear or could be either generic (SaaS/app/physical) or info-product. Routes between marketing:launch-strategy (generic launches) and marketing:info-product-launch (courses, memberships, ebooks, cohorts, communities). Trigger phrases - "launch", "spuštění", "go-to-market", "product launch", "release strategy", "uvedení na trh", "launch plan", "spuštění produktu", "launch sequence", "launch strategy". Do NOT trigger when product type is already clear (use specific skill directly).
testing
Specialized 8-week launch cadence for info-products — online courses, cohort programs, memberships, communities, ebooks, masterminds. Combines Jeff Walker's Product Launch Formula (Seed/Internal/JV variants, PLC sequence, open-cart day-by-day) with Stu McLaren's membership mechanics (closed cart, Success Path) and Hormozi Grand Slam Offer stacking. Use when planning "launch online kurzu", "info-product launch", "PLF launch", "course launch", "membership launch", "cohort launch", "ebook launch", "open cart close cart", "8-week launch of online course", "beta cohort to launch sequence", "spuštění kurzu", "launch členské sekce", "open cart strategie". Differentiates from marketing:launch-strategy (generic SaaS/app launches) — info-product-specific. NOT for SaaS launches, physical products, or services.
development
Use when releasing an Expo/React Native mobile app to App Store and Google Play - covers eas submit, ASC "Submit for Review", Play promote Internal→Production, OTA update, and decoding common silent failures (Apple agreement expiry, missing English locale, Background Location declaration, web bundle failure on react-native-maps).