🪟 Windows TippsThe Gemini desktop app is now available for Windows(11.09.2026 um 17:06 Uhr)
🪟 Windows TippsHeader and Footer not showing in Excel(14.09.2026 um 22:43 Uhr)
🕵️ SicherheitslückenBurn Out, Or Fade Away(14.09.2026 um 14:25 Uhr)
🪟 Windows TippsKB5129194 Windows 11 26H1 Out of Band Update - Deskmodder.de(14.09.2026 um 19:25 Uhr)
🪟 Windows TippsThe Gemini desktop app is now available for Windows(11.09.2026 um 17:06 Uhr)
🪟 Windows TippsHeader and Footer not showing in Excel(14.09.2026 um 22:43 Uhr)
🕵️ SicherheitslückenBurn Out, Or Fade Away(14.09.2026 um 14:25 Uhr)
🪟 Windows TippsKB5129194 Windows 11 26H1 Out of Band Update - Deskmodder.de(14.09.2026 um 19:25 Uhr)

🔧 Programmierung 🕛 vor 3 Monaten 40 Min Lesezeit
0

Visual Search Optimization

↗ Quelle (dev.to)
🗣️ Stimme:
📑 Inhaltsübersicht

Originally published at , an SDVOSB-certified veteran-owned web + AI engineering studio. You are reading the dev.to mirror; the source-of-truth canonical version with embedded validation tools lives at the link above.




Google Lens, Pinterest Lens, Amazon Visual Search, Apple Visual Look Up, Snapchat Scan, Microsoft Visual Search, Perplexity Image Search, ChatGPT Image Upload, and Gemini Camera Understanding



A comprehensive installation and audit reference for visual search optimization. Visual search in 2026 has shifted from a novelty to a primary discovery surface. eMarketer (Jan 2026, sample N=4,212 US online shoppers) found that 38 percent of US online shoppers used visual search in the past 90 days, up from 22 percent in the same survey a year earlier. The primary use cases are product discovery, identification (what is this object), translation of text inside images, and accessibility queries (read this label aloud, describe this scene).




Companion frameworks: image production and on-page image SEO live in . This file is the visual-search-surface-specific reference and assumes those two upstream frameworks are already in place.










1. Document Purpose



Visual search is not "image SEO with a camera icon." It is a discovery channel where the query is a picture, often a low-quality phone photo with mixed lighting, motion blur, partial occlusion, and ambiguous intent. The ranking signals differ from text search. The optimization targets differ. The measurement story differs. And the surfaces are fragmenting fast: Google Lens, Pinterest Lens, Amazon Visual Search, Apple Visual Look Up, Snapchat Scan, Microsoft Visual Search inside Bing and Edge, and the camera-and-image modes inside Perplexity, ChatGPT, Gemini, and Claude.



For Joseph's portfolio, the priority targets vary by client industry:





  • Eureka Bath Works: Google Lens (product discovery) and Pinterest Lens (style discovery) are top priority. Apple Visual Look Up surfaces some product matches via Apple Business Connect. Amazon irrelevant (not sold there). AI engine image upload now meaningful for "where can I find this style of clawfoot tub" queries.


  • Local Living Real Estate: Google Lens (neighborhood and landmark recognition), Apple Visual Look Up (landmarks), Pinterest Lens (interior style discovery from listing photos).


  • Heritage Hardwood Floors: Pinterest Lens (interior style discovery) and Google Lens (floor type identification from photos).


  • Handled Tax: minimal visual search relevance. Skip aside from Apple Business Connect imagery.


  • TCB Fight Factory: Pinterest Lens (gym aesthetic, gear). Google Lens (gear product matches).


  • ARCW: minimal visual search relevance.



What this framework covers:




  1. Practical optimization across nine visual search surfaces.

  2. Schema patterns that visual search engines actually parse.

  3. The bash-and-libvips toolchain for self-hosted image preprocessing.

  4. Measurement and attribution proxies in a channel that is almost entirely uninstrumented.

  5. The 2026-specific shifts: AI engine image citations, Gemini camera mode, ChatGPT image upload mainstreaming via advanced voice mode.



What this framework excludes (covered elsewhere):




  • Image production, format selection, srcset, lazy loading, file naming, and on-page alt text: see .

  • Video thumbnail standards (cross-referenced briefly here, full coverage): see . What follows is the visual-search-specific layer.






    4.1 Visual Search Alt Text Differs From Accessibility Alt Text



    Accessibility alt text answers "what is this image, briefly, for a screen reader user." Visual search alt text answers "what is this image, what is its commercial or informational context, and what query should it match."




    CODE
    alt_text_two_audiences:

    accessibility_layer:
    audience: "Screen reader users"
    length: "5-15 words typical"
    tone: "Concise, factual"
    example: "Clawfoot bathtub in white marble bathroom"

    visual_search_layer:
    audience: "Google Lens, Pinterest Lens, AI engines"
    length: "15-30 words typical"
    tone: "Descriptive plus contextual"
    example: "Vintage Victorian clawfoot bathtub with brass ball-and-claw feet in marble master bathroom, Eureka Bath Works showroom display, restored 1890s style"






    Both audiences are served by writing the longer version, since screen readers handle 30 words fine. Avoid keyword stuffing; the goal is naturalistic description that happens to contain commercially relevant entities and modifiers.






    4.2 File Naming Convention



    The bubbles-hosted standard for client image storage:




    CODE
    # At /var/www/sites/[domain]/assets/images/
    # Convention: [category]-[product-or-subject]-[modifier]-[index].avif

    # Eureka Bath Works examples
    clawfoot-tub-victorian-brass-feet-front-01.avif
    clawfoot-tub-victorian-brass-feet-detail-02.avif
    clawfoot-tub-victorian-brass-feet-installed-03.avif

    # Heritage Hardwood Floors examples
    white-oak-flooring-wide-plank-rustic-grade-01.avif
    white-oak-flooring-installed-living-room-02.avif

    # Local Living Real Estate examples
    listing-huntsville-ar-3br-exterior-front-01.avif
    listing-huntsville-ar-3br-kitchen-01.avif






    The filename is itself a ranking signal. Google Lens and Pinterest Lens both inspect filenames during entity extraction. Use lowercase, hyphens (in filenames only, not as sentence punctuation), no spaces, descriptive nouns plus modifiers, sequential indexing.






    4.3 The Image Audit Loop



    For each client site, run this audit before optimization:




    CODE
    #!/bin/bash
    # /var/www/sites/[domain]/scripts/visual-search/audit-images.sh

    SITE_ROOT="/var/www/sites/$1"
    REPORT="/tmp/visual-search-audit-$1-$(date +%Y%m%d).txt"

    echo "Visual search image audit for $1" > "$REPORT"
    echo "Generated: $(date)" >> "$REPORT"
    echo "" >> "$REPORT"

    # Count by format
    echo "Image format distribution:" >> "$REPORT"
    find "$SITE_ROOT/assets/images" -type f \( -name "*.avif" -o -name "*.webp" -o -name "*.jpg" -o -name "*.png" \) | \
    awk -F. '{print $NF}' | sort | uniq -c | sort -rn >> "$REPORT"

    # Flag images missing alt text in HTML
    echo "" >> "$REPORT"
    echo "HTML img tags without alt attribute:" >> "$REPORT"
    grep -rE '<img[^>]*>' "$SITE_ROOT" --include="*.html" | grep -v 'alt=' | head -50 >> "$REPORT"

    # Flag images with empty alt
    echo "" >> "$REPORT"
    echo "HTML img tags with empty alt:" >> "$REPORT"
    grep -rE 'alt=""' "$SITE_ROOT" --include="*.html" | head -50 >> "$REPORT"

    # Flag generic filenames
    echo "" >> "$REPORT"
    echo "Generic filenames (image1, IMG_, photo, etc):" >> "$REPORT"
    find "$SITE_ROOT/assets/images" -type f | grep -iE '(image[0-9]|IMG_|photo[0-9]|DSC_|untitled)' | head -50 >> "$REPORT"

    cat "$REPORT"






    Run this on every client during onboarding. The output drives a remediation queue.









    5. Schema for Visual Search



    Schema is the strongest signal visual search engines have for "this image means X." Five schema types matter most.






    5.1 ImageObject (Universal)



    ImageObject is the foundation. Even when the image is wrapped in Product, Recipe, or HowTo, populate ImageObject fully.




    CODE
    <script type="application/ld+json">
    {
    "@context": "https://schema.org",
    "@type": "ImageObject",
    "@id": "https://eurekabathworks.com/products/clawfoot-tub-victorian-brass#image-front",
    "url": "https://eurekabathworks.com/assets/images/clawfoot-tub-victorian-brass-feet-front-01.avif",
    "contentUrl": "https://eurekabathworks.com/assets/images/clawfoot-tub-victorian-brass-feet-front-01.avif",
    "thumbnailUrl": "https://eurekabathworks.com/assets/images/clawfoot-tub-victorian-brass-feet-front-01-thumb.avif",
    "width": "2400",
    "height": "1600",
    "caption": "Victorian clawfoot bathtub with brass ball-and-claw feet, front view, Eureka Bath Works showroom",
    "description": "Cast iron clawfoot bathtub finished in white porcelain enamel, supported by polished brass ball-and-claw feet. Approximately 60 inches in length, 1890s Victorian style, restored and inspected, available for installation in Northwest Arkansas.",
    "creditText": "Photography by Eureka Bath Works",
    "copyrightNotice": "Copyright 2026 Eureka Bath Works LLC",
    "creator": {
    "@type": "Organization",
    "name": "Eureka Bath Works"
    },
    "license": "https://eurekabathworks.com/legal/image-license",
    "acquireLicensePage": "https://eurekabathworks.com/contact",
    "representativeOfPage": true
    }
    </script>






    Notes on the fields:





    • caption: used by Pinterest Rich Pins and Google Lens as the primary descriptor. Write it like a museum placard.


    • description: longer than caption, fills out entity context for AI engines. 50 to 150 words is the sweet spot.


    • creditText, copyrightNotice, creator, license, acquireLicensePage. these are the Google Images licensable filter signals. When present, your image is eligible for the Licensable badge and surfaces preferentially in Lens shopping flows.


    • representativeOfPage: true: flag the single primary image per page. Most pages should have exactly one image with this flag.






    5.2 Product Schema With Image Array



    For e-commerce or product-style pages, Product schema with a multi-image array is the highest-leverage pattern.




    CODE
    <script type="application/ld+json">
    {
    "@context": "https://schema.org",
    "@type": "Product",
    "name": "Victorian Clawfoot Bathtub with Brass Ball-and-Claw Feet",
    "sku": "EBW-CLAW-VBR-60",
    "brand": {"@type": "Brand", "name": "Eureka Bath Works"},
    "image": [
    {"@type": "ImageObject", "url": "https://eurekabathworks.com/assets/images/clawfoot-tub-victorian-brass-feet-front-01.avif", "caption": "Front view, full tub with brass feet", "width": "2400", "height": "1600"},
    {"@type": "ImageObject", "url": "https://eurekabathworks.com/assets/images/clawfoot-tub-victorian-brass-feet-detail-02.avif", "caption": "Detail of brass ball-and-claw foot", "width": "2400", "height": "1600"},
    {"@type": "ImageObject", "url": "https://eurekabathworks.com/assets/images/clawfoot-tub-victorian-brass-feet-installed-03.avif", "caption": "Tub installed in restored Victorian bathroom", "width": "2400", "height": "1600"}
    ],
    "offers": {"@type": "Offer", "priceCurrency": "USD", "price": "2400.00", "availability": "https://schema.org/InStock"}
    }
    </script>






    Amazon expects 7 images minimum. Pinterest favors one hero pin but indexes the array under Product Rich Pins. Google Lens Shopping pulls the first image as match candidate, surfaces the rest in carousel. Recommendation: 3 minimum, target 5 to 7. Order: hero shot first (clean white background or lifestyle), then detail, then context, then variant.






    5.3 Recipe and HowTo Schema (Per-Step Images)



    Both Recipe and HowTo schemas accept per-step images. Recipe still drives rich result rendering; HowTo lost SERP rich results in Aug 2023 but the schema is still parsed by AI engines (Gemini, ChatGPT reference HowTo-marked content when answering image-upload "how do I do this" queries).




    CODE
    <script type="application/ld+json">
    {
    "@context": "https://schema.org",
    "@type": "Recipe",
    "name": "Smoked Pork Shoulder, Ozark Style",
    "image": ["https://example.com/recipe-hero.avif", "https://example.com/recipe-finished.avif"],
    "recipeInstructions": [
    {"@type": "HowToStep", "text": "Trim the pork shoulder to a quarter-inch fat cap.", "image": "https://example.com/recipe-step-1-trim.avif"},
    {"@type": "HowToStep", "text": "Apply rub generously to all surfaces.", "image": "https://example.com/recipe-step-2-rub.avif"}
    ]
    }
    </script>






    HowTo pattern is identical, swap @type to HowTo and recipeInstructions to step. For full Recipe rich result eligibility, populate cookTime, prepTime, recipeYield, recipeIngredient, nutrition (Google Search Central Recipe docs, updated Oct 2025).






    5.4 VisualArtwork Schema



    For art, design, and creative-portfolio sites (Trevel Young Photography uses this):




    CODE
    <script type="application/ld+json">
    {
    "@context": "https://schema.org",
    "@type": "VisualArtwork",
    "name": "Untitled Number 7",
    "creator": {"@type": "Person", "name": "Jane Doe"},
    "dateCreated": "2025-08-12",
    "artMedium": "Oil on canvas",
    "artworkSurface": "Stretched canvas, 24x36 inches",
    "image": "https://example.com/artwork-untitled-7.avif",
    "width": "61 cm", "height": "91 cm"
    }
    </script>






    The VisualArtwork type signals "fine art, not product" and routes through different visual search clusters than Product schema.









    6. Google Lens Optimization



    Google Lens is the dominant visual search surface. 14 billion monthly queries, four major entry points, and the most sophisticated entity-extraction pipeline of any visual search engine.






    6.1 Entry Points





    • Google Photos: user selects photo, taps Lens icon. Identifies subject, surfaces related search.


    • Chrome image search: right-click image, "Search Image with Google". Reverse image plus Lens entity extraction.


    • Pixel camera: live recognition with overlaid results.


    • Google search bar: camera icon to upload or capture; query against full image index.


    • Android Circle to Search: long-press home button, circle anything on screen. Lens-powered visual search of any screen content.



    Circle to Search launched on Pixel 8 in early 2024, rolled out to most Android flagships through 2025, and is now the single fastest-growing visual search entry point on the platform.






    6.2 What Lens Looks For



    Lens combines image embedding similarity with entity extraction. Both inputs matter.





    • Image embedding: visual similarity to indexed images. Optimize with distinctive imagery, avoid generic stock.


    • Entity extraction: recognized objects, brands, landmarks, plants, products. Pages matching the entity need schema and content.


    • OCR text: text inside the image is extracted and used as a query. If your product has visible labels, optimize the page for that text.


    • Surrounding page context: text on the page hosting the matched image. Image alt text plus 200 words of surrounding content.


    • Schema markup: ImageObject, Product, Recipe (see section 5).


    • Merchant Center feed: Lens Shopping pulls from Merchant Center. Submit feed with full image array.


    • Page authority: standard ranking signals (backlinks, brand authority, content quality) also flow into Lens.






    6.3 Practical Optimization Pattern



    For each product or primary image:




    1. Generate the image at 2400 wide minimum, AVIF format, sharp focus, accurate color, single subject prominent.

    2. Save with descriptive hyphenated filename (no spaces, no underscores, no IMG_).

    3. Write alt text in the 15 to 30 word range with entities and modifiers.

    4. Wrap the page in Product or relevant schema with full ImageObject array.

    5. Submit the page in image sitemap.

    6. Submit the product in Merchant Center (if e-commerce).

    7. Verify the page indexes via URL Inspection in GSC.

    8. Test recognition via Google Lens app: take a photo of the actual item or screenshot, see if your product appears.



    The Lens test in step 8 is the single most useful diagnostic. If your own product photo, taken on a phone in real-world lighting, does not surface your product page in the top three Lens results, something is wrong upstream.






    6.4 Shopping Versus Identification Versus Knowledge Results



    Lens returns three distinct result types depending on classified intent:





    • Shopping results: products with price, availability, retailer. Pulled from Merchant Center. Optimization: GMC feed quality, product schema, in-stock signals.


    • Identification results: Wikipedia-style cards for plants, animals, landmarks. Pulled from Knowledge Graph. Optimization: get entity into Knowledge Graph via Wikidata and Wikipedia (see .









      9. Apple Visual Look Up



      Apple Visual Look Up is the iOS-integrated visual search, available across Photos, Safari, Messages, and Quick Look. Supported categories expanded in iOS 18 to include plants, animals, landmarks, art, books, products, and pets. Apple does not disclose query volume, but third-party estimates suggest 350 million monthly active users (Counterpoint research, Q1 2026, sample N=1,800 iOS users).






      9.1 How Apple Visual Look Up Works



      Trigger points: tap info icon on a photo in Photos, long-press or tap detected subject in Safari, subject detection in Messages, Quick Look on Mac.



      Recognition pipeline: on-device CoreML identifies entity category, server-side query to Apple Knowledge Graph, returns info card with Wikipedia summary plus related results.



      Supported categories (2026): animals (cats, dogs, birds, insects), plants and flowers, landmarks and buildings, art and books, products (clothing, electronics, vehicles), statues and sculptures, pet breed identification.






      9.2 What You Can Influence



      Apple's Knowledge Graph is curated. Two practical levers exist.



      Lever 1: Apple Business Connect. For local businesses, Apple Business Connect (Apple's GBP equivalent) accepts imagery that surfaces in Apple Maps and indirectly in Visual Look Up for businesses with distinctive storefronts or signage. Primary photo: storefront or hero shot. Up to 10 additional photos covering storefront exterior, interior atmosphere, products or services in use, team or staff, signage and branding. Image specs: 4:3 recommended, minimum 1024 x 768, JPEG or PNG, max 10 MB.



      Lever 2: Wikidata and Wikipedia presence. Apple's Knowledge Graph is heavily seeded by Wikidata and Wikipedia. Brands with Wikipedia articles and Wikidata entries appear in Visual Look Up cards. See .







    10.4 Testing AI Engine Image Understanding



    A quick diagnostic suite for any client:




    CODE
    # Manual testing protocol
    # For each top-priority product or service category:

    # Test 1: ChatGPT
    # - Open chatgpt.com
    # - Upload representative phone photo of product
    # - Ask "what is this and where can I buy it in [client geography]"
    # - Note whether client domain appears in citations
    # - Note whether client image surfaces inline

    # Test 2: Perplexity
    # - Open perplexity.ai
    # - Upload same image
    # - Ask same question
    # - Note citation list and inline images

    # Test 3: Gemini
    # - Open gemini.google.com or app
    # - Upload same image
    # - Ask same question
    # - Note retrieval citations

    # Test 4: Claude
    # - Open claude.ai
    # - Upload same image
    # - Ask "what is this and describe it in detail"
    # - Note accuracy of identification






    Document results in /var/www/sites/[domain]/docs/visual-search-baseline.md per client. Re-test quarterly.









    11. Visual Citation in AI Results



    New in 2026: AI engines surface inline images in responses with source attribution. Perplexity led this in Q4 2025; ChatGPT followed in Q1 2026; Gemini and Claude added similar functionality through 2026.






    11.1 How Inline Image Citation Works



    Trigger: user asks a question where visual reference helps. Examples: "what does a clawfoot tub look like," "show me different types of hardwood flooring," "what's the difference between these two coffee makers."



    Selection rules: image must be on a page the AI is citing for text; image alt text and caption inform selection; image must be embed-friendly (no aggressive CORS, no anti-hotlinking); image must be high-quality (low-resolution images deprioritized).



    Attribution: image displayed with source link, click-through to source page, trackable via referrer in nginx access logs.






    11.2 Optimizing For Inline Citation





    • Earn text citation first. Image citation only happens if the page is already text-cited. Cross-reference .









      13. Measurement and Attribution



      Visual search is largely uninstrumented in standard analytics. There is no "Google Lens" channel in GA4. There is no Pinterest Lens referrer header that consistently identifies the visual entry point. Measurement is therefore a proxy game.






      13.1 What Can Be Measured





      • GSC image search clicks (Search Console > Performance > Search Type: Image): per query and per landing page. Limitation: aggregated; cannot isolate Lens from standard image search.


      • GSC image search impressions: coverage of how often images surface.


      • Pinterest outbound clicks (Pinterest Analytics > Audience insights): per pin, per board, per audience segment.


      • Pinterest conversion tag (Conversion insights): per event type, per pin.


      • Google Shopping image clicks (Merchant Center > Performance > Image clicks, where available).


      • AI engine image referrals (nginx access logs filtered by referer): use /var/www/sites/[domain]/scripts/visual-search/count-ai-image-referrals.sh.


      • Brand mention velocity (manual checks or Mention.com): brand or product appearing in AI engine responses, per engine, per query type.






      13.2 The View-Through Visual Attribution Gap



      The largest gap: users see your brand in a Lens or Pinterest result, do not click, then later search for your brand directly. Proxy metrics to detect view-through:





      • Branded search lift: after visual-search investment, branded search volume rises (GSC branded query filter, 90-day rolling comparison). 4 to 12 week lag typical.


      • Direct traffic lift: users typing URL directly after visual exposure (GA4 direct channel, year-over-year).


      • Pinterest save velocity: saves accumulate even when clicks do not (Pinterest Analytics > Saves over time). Predictive of future traffic since pins generate evergreen discovery.


      • Reverse image search appearance: your images appear elsewhere on the web (periodic Google Reverse Image checks, TinEye for systematic monitoring). Indicates organic distribution and potential backlink opportunities.






      13.3 The Visual Search Dashboard



      Minimum dashboard per client, refreshed monthly, stored as YAML at /var/www/sites/[domain]/reports/visual-search/YYYY-MM.yml:




      CODE
      visual_search_dashboard_monthly:
      gsc_image: {clicks_30d, impressions_30d, ctr_30d, top_5_pages, top_5_queries}
      pinterest: {outbound_clicks_30d, impressions_30d, saves_30d, top_5_pins}
      ai_referrals: {total_30d, by_engine: {chatgpt, perplexity, gemini, claude}}
      ai_citation_check: {chatgpt_pass, perplexity_pass, gemini_pass}
      proxy_signals: {branded_search_volume, direct_traffic_30d}






      Diff month-over-month to detect trends.









      14. Bubbles-Hosted Visual Search Optimization Toolchain



      The image processing and audit toolchain runs entirely on bubbles (Debian, 169.155.162.118), with output written to /var/www/sites/[domain]/ per client. No third-party CDN or proxy is in the loop.






      14.1 Toolchain Components






      CODE
      bubbles_visual_search_toolchain:

      libvips:
      purpose: "Fast image processing for AVIF, WebP generation, resizing, color management"
      install: "apt-get install libvips libvips-tools"
      binary: "vips, vipsthumbnail"
      speed: "approximately 4-8x faster than ImageMagick for batch operations"

      exiftool:
      purpose: "EXIF metadata read, write, strip"
      install: "apt-get install libimage-exiftool-perl"
      binary: "exiftool"

      python3:
      purpose: "Audit scripts that parse HTML, validate alt text, cross-check schema"
      install: "Already installed system-wide; bs4 and lxml via pip"

      bash_glue:
      purpose: "Orchestration scripts for bulk image processing pipelines"
      location: "/var/www/sites/[domain]/scripts/visual-search/"

      nginx_serve:
      purpose: "Direct serving of optimized images from /var/www/sites/[domain]/assets/images/"
      config: "/etc/nginx/sites-available/[domain]"
      headers: "Cache-Control immutable for hashed assets, max-age 31536000"









      14.2 Bulk AVIF Generation Script






      CODE
      #!/bin/bash
      # /var/www/sites/[domain]/scripts/visual-search/generate-avif.sh
      # Bulk convert JPEG and PNG to AVIF for visual search optimization.

      set -e

      SITE="$1"
      SOURCE_DIR="/var/www/sites/$SITE/assets/images-source"
      TARGET_DIR="/var/www/sites/$SITE/assets/images"

      if [ -z "$SITE" ]; then
      echo "Usage: $0 <site-name>"
      exit 1
      fi

      mkdir -p "$TARGET_DIR"

      # Process JPEGs and PNGs to AVIF
      find "$SOURCE_DIR" -type f \( -name "*.jpg" -o -name "*.jpeg" -o -name "*.png" \) | while read -r SRC; do
      REL=$(realpath --relative-to="$SOURCE_DIR" "$SRC")
      BASE="${REL%.*}"
      TARGET="$TARGET_DIR/$BASE.avif"

      if [ -f "$TARGET" ] && [ "$TARGET" -nt "$SRC" ]; then
      echo "SKIP $REL (target newer)"
      continue
      fi

      mkdir -p "$(dirname "$TARGET")"

      vips copy "$SRC" "$TARGET[Q=55,effort=6]"

      echo "DONE $REL -> $BASE.avif"
      done

      # Generate WebP fallback for clients still serving WebP
      find "$SOURCE_DIR" -type f \( -name "*.jpg" -o -name "*.jpeg" -o -name "*.png" \) | while read -r SRC; do
      REL=$(realpath --relative-to="$SOURCE_DIR" "$SRC")
      BASE="${REL%.*}"
      TARGET="$TARGET_DIR/$BASE.webp"

      if [ -f "$TARGET" ] && [ "$TARGET" -nt "$SRC" ]; then
      continue
      fi

      mkdir -p "$(dirname "$TARGET")"
      vips copy "$SRC" "$TARGET[Q=80]"
      done

      echo ""
      echo "Bulk AVIF and WebP generation complete for $SITE"









      14.3 Thumbnail Generation Script






      CODE
      #!/bin/bash
      # /var/www/sites/[domain]/scripts/visual-search/generate-thumbs.sh
      # Generate multiple thumbnail sizes for srcset and visual search surfaces.

      SITE="$1"
      SOURCE_DIR="/var/www/sites/$SITE/assets/images"

      # Pinterest needs 2:3 vertical, others need standard ratios
      SIZES=(400 800 1200 1920)
      PINTEREST_HEIGHT=1500

      for SRC in $(find "$SOURCE_DIR" -maxdepth 4 -type f -name "*.avif" -not -name "*-thumb-*"); do
      BASE="${SRC%.avif}"

      for SIZE in "${SIZES[@]}"; do
      TARGET="${BASE}-${SIZE}w.avif"
      [ -f "$TARGET" ] && continue
      vipsthumbnail "$SRC" --size "${SIZE}x" --output "$TARGET[Q=55]"
      done

      # Pinterest 2:3 vertical crop
      PIN_TARGET="${BASE}-pinterest.jpg"
      if [ ! -f "$PIN_TARGET" ]; then
      vipsthumbnail "$SRC" --size "1000x${PINTEREST_HEIGHT}" --smartcrop=attention --output "$PIN_TARGET[Q=85]"
      fi
      done

      echo "Thumbnails generated for $SITE"









      14.4 Metadata Audit and EXIF Cleanup



      ExifTool handles both the metadata audit and the EXIF strip-and-rewrite. The audit script counts images carrying copyright, description, and GPS tags (GPS is a privacy flag, especially for real estate listings and event photos).




      CODE
      #!/bin/bash
      # /var/www/sites/[domain]/scripts/visual-search/audit-metadata.sh
      SITE="$1"
      IMG_DIR="/var/www/sites/$SITE/assets/images"
      REPORT="/var/www/sites/$SITE/reports/visual-search/metadata-audit-$(date +%Y%m%d).txt"
      mkdir -p "$(dirname "$REPORT")"
      {
      echo "Metadata audit for $SITE ($(date))"
      TOTAL=$(find "$IMG_DIR" -type f \( -name "*.avif" -o -name "*.webp" -o -name "*.jpg" \) | wc -l)
      echo "Total images: $TOTAL"
      echo "With copyright: $(exiftool -if '$Copyright' -p '$FileName' -r "$IMG_DIR" 2>/dev/null | wc -l)"
      echo "With description: $(exiftool -if '$ImageDescription or $Description' -p '$FileName' -r "$IMG_DIR" 2>/dev/null | wc -l)"
      echo "With GPS (privacy review): $(exiftool -if '$GPSLatitude' -p '$FileName' -r "$IMG_DIR" 2>/dev/null | wc -l)"
      } > "$REPORT"
      cat "$REPORT"






      The cleanup script strips all EXIF (removing GPS and camera serial numbers) then re-injects the IPTC copyright and credit fields that visual search engines parse.




      CODE
      #!/bin/bash
      # /var/www/sites/[domain]/scripts/visual-search/clean-exif.sh
      SITE="$1"
      IMG_DIR="/var/www/sites/$SITE/assets/images"
      find "$IMG_DIR" -type f \( -name "*.jpg" -o -name "*.jpeg" \) | while read -r IMG; do
      exiftool -overwrite_original -all= "$IMG" 2>/dev/null
      exiftool -overwrite_original \
      -Copyright="Copyright 2026 $SITE" \
      -CopyrightNotice="Copyright 2026 $SITE LLC" \
      -Credit="$SITE" "$IMG" 2>/dev/null
      done









      14.5 Alt Text and Image Sitemap Audits



      Two Python audits run as the regular cron load. Alt text audit flags missing, empty, or short alt attributes across the rendered HTML.




      CODE
      #!/bin/bash
      # /var/www/sites/[domain]/scripts/visual-search/audit-alt-text.sh
      SITE="$1"
      SITE_DIR="/var/www/sites/$SITE"
      REPORT="$SITE_DIR/reports/visual-search/alt-audit-$(date +%Y%m%d).txt"
      mkdir -p "$(dirname "$REPORT")"
      python3 - "$SITE_DIR" "$SITE" > "$REPORT" <<'PY'
      import re, sys
      from pathlib import Path
      site_dir = Path(sys.argv[1]); site = sys.argv[2]
      img_re = re.compile(r'<img[^>]*>', re.I)
      alt_re = re.compile(r'alt
      \s*=\s*"([^"]*)"', re.I)
      src_re = re.compile(r'src
      \s*=\s*"([^"]*)"', re.I)
      counts = {"total":0,"missing":0,"empty":0,"short":0,"ok":0}
      issues = []
      for f in site_dir.rglob("*.html"):
      if "node_modules" in str(f) or ".next" in str(f): continue
      try: c = f.read_text(encoding="utf-8", errors="ignore")
      except: continue
      for tag in img_re.findall(c):
      counts["total"] += 1
      a = alt_re.search(tag); s = src_re.search(tag)
      src = s.group(1) if s else "no-src"
      if not a:
      counts["missing"] += 1
      issues.append(f"MISSING {f.relative_to(site_dir)} src={src}")
      else:
      alt = a.group(1).strip()
      if not alt: counts["empty"] += 1; issues.append(f"EMPTY {f.relative_to(site_dir)} src={src}")
      elif len(alt.split()) < 5: counts["short"] += 1; issues.append(f"SHORT {f.relative_to(site_dir)} alt='{alt}'")
      else: counts["ok"] += 1
      print(f"Alt audit for {site}:", counts)
      for i in issues[:100]: print(i)
      PY
      cat "$REPORT"






      The sitemap generator walks rendered HTML and emits sitemap-images.xml to the site root for submission to Search Console.




      CODE
      #!/bin/bash
      # /var/www/sites/[domain]/scripts/visual-search/generate-image-sitemap.sh
      SITE="$1"; DOMAIN="$2"
      SITE_DIR="/var/www/sites/$SITE"
      python3 - "$SITE_DIR" "$DOMAIN" > "$SITE_DIR/sitemap-images.xml" <<'PY'
      import re, sys
      from pathlib import Path
      site_dir = Path(sys.argv[1]); domain = sys.argv[2]
      img_re = re.compile(r'<img[^>]*>', re.I)
      src_re = re.compile(r'src
      \s*=\s*"([^"]*)"', re.I)
      alt_re = re.compile(r'alt
      \s*=\s*"([^"]*)"', re.I)
      print('<?xml version="1.0" encoding="UTF-8"?>')
      print('<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"')
      print(' xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">')
      for f in sorted(site_dir.rglob("*.html")):
      if "node_modules" in str(f) or ".next" in str(f): continue
      rel = f.relative_to(site_dir)
      path = "/" + str(rel).replace("index.html", "")
      if path.endswith("/") and len(path) > 1: path = path[:-1]
      try: c = f.read_text(encoding="utf-8", errors="ignore")
      except: continue
      imgs = []
      for tag in img_re.findall(c):
      sm = src_re.search(tag); am = alt_re.search(tag)
      if not sm: continue
      src = sm.group(1)
      if src.startswith("/"): src = f"https://{domain}{src}"
      elif not src.startswith("http"): continue
      imgs.append((src, am.group(1) if am else ""))
      if not imgs: continue
      print(f" <url><loc>https://{domain}{path}</loc>")
      for src, alt in imgs:
      esc = alt.replace("&","&amp;").replace("<","&lt;").replace(">","&gt;")
      print(f" <image:image><image:loc>{src}</image:loc><image:caption>{esc}</image:caption></image:image>")
      print(" </url>")
      print('</urlset>')
      PY









      14.6 Cron Schedule



      The recommended cron schedule for the visual search toolchain:




      CODE
      # /etc/cron.d/visual-search-toolchain

      # Bulk AVIF regeneration nightly per client
      0 2 * * * user /var/www/sites/eurekabathworks.com/scripts/visual-search/generate-avif.sh eurekabathworks.com
      0 3 * * * user /var/www/sites/heritagehardwoodfloors.com/scripts/visual-search/generate-avif.sh heritagehardwoodfloors.com

      # Sitemap regeneration weekly
      0 4 * * 0 user /var/www/sites/eurekabathworks.com/scripts/visual-search/generate-image-sitemap.sh eurekabathworks.com eurekabathworks.com

      # AI referral counting weekly
      0 5 * * 1 user /var/www/sites/eurekabathworks.com/scripts/visual-search/count-ai-image-referrals.sh eurekabathworks.com >> /var/www/sites/eurekabathworks.com/reports/visual-search/ai-referrals.log

      # Alt text audit monthly
      0 6 1 * * user /var/www/sites/eurekabathworks.com/scripts/visual-search/audit-alt-text.sh eurekabathworks.com






      Adjust paths per client. Each client has its own copy of the scripts under /var/www/sites/[domain]/scripts/visual-search/.






      14.7 Nginx Configuration For Image Delivery



      The nginx site configuration must allow AI engine user agents and set cacheable headers on image assets.




      CODE
      # /etc/nginx/sites-available/[domain]
      server {
      listen 443 ssl http2;
      server_name [domain];
      root /var/www/sites/[domain];

      # Image assets cached aggressively
      location ~* \.(avif|webp|jpg|jpeg|png|gif|svg)$ {
      expires 1y;
      add_header Cache-Control "public, immutable";
      add_header X-Content-Type-Options "nosniff";
      # No Referer blocking; AI engines must be able to load
      # No hotlink protection; image citation depends on embed access
      }

      # Image sitemap
      location = /sitemap-images.xml {
      add_header Cache-Control "public, max-age=3600";
      try_files $uri =404;
      }

      # User-Agent allow list verified for visual search bots
      # GoogleOther, OpenAI-SearchBot, PerplexityBot, ChatGPT-User
      # all served normally; no User-Agent blocking
      }









      14.8 Toolchain Maintenance Notes



      libvips updates rarely; pin via apt-get hold if reproducibility is needed. ExifTool updates frequently to support new camera formats and is safe to keep at latest. Python scripts depend only on stdlib (no pip requirements file). All bash scripts use bash, not zsh or POSIX sh. All paths absolute; cron context is empty. Logs to /var/www/sites/[domain]/reports/visual-search/ (not /tmp) so they survive restarts.









      End of Framework



      Companion documents:





      • : cross-modal AI reasoning across image, audio, video, text.


      • : Google AI Overviews and how visual search results feed AI summaries.


      • : ChatGPT image upload behavior and SearchGPT visual citation.


      • : Google versus Bing versus AI engine optimization tradeoffs, including visual search divergence.


      • : accessibility alt text standards that overlap with visual search alt text.


      • : video thumbnail, VideoObject schema, YouTube optimization in depth.






      From the ThatDevPro Engine Optimization framework library. Studio: . Source: https://www.thatdevpro.com/insights/framework-visualsearch/.

      Vollständiger Original-Bericht
      Ausführliche Details, Code-Beispiele & Hersteller-Stellungnahme auf dev.to.
      ↗ Original-Artikel auf dev.to lesen
Wie bewertest du diesen Beitrag?
1 Klick Feedback
Teilen mit Netzwerk & Team:

Community-Analysen & Experten-Meinungen 0

Verfasse deine eigene Analyse, teile Workarounds oder diskutiere diesen Vorfall im Blog.
Noch keine Community-Analyse verfasst. Markiere einen Textabschnitt oder klicke oben auf Eigene Analyse verfassen“!
Community Pulse: Relevanz-Einschätzung
1 Klick Experten-Votum
🔴 Akute Relevanz 0%
🟡 In Evaluierung 0%
🟢 Keine Auswirkung 0%
Spannende Innovation 0%
Verwandte Story-Cluster & Quellen (Vektor-KI)
Port 8095 Engine
1 Quelle
The Gemini desktop app is now available for Windows
1 Quelle
Header and Footer not showing in Excel
1 Quelle
Burn Out, Or Fade Away
Ähnliche Beiträge
🔍 Verwandte News

Auch interessante Nachrichten Visual Search Optimization

Thematisch verwandte Begriffe: Visual, Search, Optimization · 6 Treffer

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...