1<!doctype html> 2<html lang="en"> 3 <head> 4 <meta name="google-site-verification" content="it85Bqdwo_oCoraf49gUTrQHxMDFWW3EQeEvEAfct6U" /> 5 <meta name="p:domain_verify" content="dcb7589d44bac2e0ab99fd475efc996a" /> 6 <meta charset="UTF-8" /> 7 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 8 <link rel="icon" href="/favicon.ico" sizes="48x48"> 9 <link rel="icon" href="/favicon.svg" type="image/svg+xml"> 10 <link rel="icon" type="image/png" sizes="32x32" href="/favicon.png"> 11 <link rel="apple-touch-icon" href="/apple-touch-icon.png"> 12 <link rel="manifest" href="/site.webmanifest" /> 13 <link rel="preconnect" href="https://img.logo.dev" crossorigin /> 14 <link rel="dns-prefetch" href="https://img.logo.dev" /> 15 <!-- 16 No static <link rel="canonical"> here on purpose. 17 Each route sets its own canonical at runtime via SEOHead.tsx. 18 A hardcoded root canonical would override every per-page 19 canonical for any bot that doesn't execute JS. 20 --> 21 <title>AI Product Visuals & Videos for E-commerce Brands | VOVV.AI</title> 22 23 <meta name="author" content="VOVV.AI" /> 24 25 <!-- GTM is loaded from src/lib/consent.ts after Google Consent Mode v2 26 defaults are set. EU visitors need to accept analytics before it fires; 27 non-EU visitors auto-grant and load immediately for parity. --> 28 29 30 <link rel="preconnect" href="https://fonts.googleapis.com" /> 31 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> 32 <link rel="preconnect" href="https://azwiljtrbtaupofwmpzb.supabase.co" crossorigin /> 33 <link rel="preconnect" href="https://www.googletagmanager.com" crossorigin /> 34 <link rel="dns-prefetch" href="https://www.google-analytics.com" /> 35 36 <!-- Preload the actual font file to skip CSSâfont chain --> 37 <link rel="preload" as="font" type="font/woff2" crossorigin href="https://fonts.gstatic.com/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7W0Q5nw.woff2" /> 38 39 <!-- LCP hero image preload is injected at runtime via Helmet from 40 src/components/home/HomeHero.tsx so the hashed asset URL always matches. --> 41 42 43 <!-- gtag.js is loaded from src/lib/consent.ts, gated by Google Consent 44 Mode v2 so EU visitors must accept analytics first. --> 45 46 47 <!-- Meta Pixel removed: Meta tracking now fires exclusively via GTM --> 48 <link rel="preload" as="style" href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600&display=swap" onload="this.onload=null;this.rel='stylesheet'" /> 49 <noscript><link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet" /></noscript> 50 51 52 53 <meta property="og:type" content="website" /> 54 <!-- 55 No static og:image / twitter:image here on purpose. 56 Each route sets its own preview at runtime via SEOHead.tsx (ogImage prop), 57 falling back to DEFAULT_OG_IMAGE. Lovable hosting also injects a 58 serve-time social preview for non-JS crawlers when none is present. 59 --> 60 61 <meta name="twitter:card" content="summary_large_image" /> 62 <meta name="twitter:site" content="@VOVVAI" /> 63 64 65 66 67 68 69 70 71 72 73 74 75 76 <meta property="og:title" content="AI Product Images & Videos for E-commerce Brands | VOVV.AI"> 77 <meta name="twitter:title" content="AI Product Images & Videos for E-commerce Brands | VOVV.AI"> 78 79 <!-- Sitewide Organization + WebSite JSON-LD (Knowledge Graph + AI grounding) --> 80
80<script type="application/ld+json"> 81 { 82 "@context": "https://schema.org", 83 "@type": "Organization", 84 "name": "VOVV.AI", 85 "url": "https://vovv.ai", 86 "logo": "https://vovv.ai/favicon.svg", 87 "description": "AI product visuals for e-commerce brands. Turn one product photo into a full visual system.", 88 "sameAs": [ 89 "https://www.instagram.com/vovv.ai", 90 "https://www.facebook.com/vovvaistudio/", 91 "https://www.tiktok.com/@vovv.ai" 92 ] 93 } 94 </script>
94 95
95<script type="application/ld+json"> 96 { 97 "@context": "https://schema.org", 98 "@type": "WebSite", 99 "name": "VOVV.AI", 100 "url": "https://vovv.ai", 101 "potentialAction": { 102 "@type": "SearchAction", 103 "target": "https://vovv.ai/discover?q={search_term_string}", 104 "query-input": "required name=search_term_string" 105 } 106 } 107 </script>
107 108
108<script type="module" crossorigin src="/assets/index-BfEqxQPi.js"></script>
108 109 <link rel="modulepreload" crossorigin href="/assets/vendor-react-BfTl68nP.js"> 110 <link rel="modulepreload" crossorigin href="/assets/vendor-query-CtIF-MNZ.js"> 111 <link rel="modulepreload" crossorigin href="/assets/vendor-radix-q0rzatl0.js"> 112 <link rel="modulepreload" crossorigin href="/assets/vendor-icons-hHTr3Gms.js"> 113 <link rel="stylesheet" crossorigin href="/assets/index-BDbKeqHm.css">
114<script defer src="/~flock.js" data-proxy-url="/~api/analytics"></script>
114<meta property="og:image" content="https://storage.googleapis.com/gpt-engineer-file-uploads/VKxsHweXOcTm9TQCFujLdVnOvfP2/social-images/social-1774857188036-VOVV.AI_Social_Image.webp"><meta name="twitter:image" content="https://storage.googleapis.com/gpt-engineer-file-uploads/VKxsHweXOcTm9TQCFujLdVnOvfP2/social-images/social-1774857188036-VOVV.AI_Social_Image.webp"></head> 115 116 <body> 117 <!-- Google Tag Manager (noscript) -->
vendor: 72 bytes, lines 117-118
117 118 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
118GTM-P29VVFW3
vendor: 91 bytes, lines 118-120
118" 119 height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 120
120<!-- End Google Tag Manager (noscript) --> 121 <div id="root"> 122 <div style="display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:100vh;background:#faf9f7;gap:10px;font-family:Inter,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;"> 123 <span style="font-size:15px;font-weight:500;letter-spacing:0.18em;color:#1a2436;line-height:1;animation:_b 2.4s ease-in-out infinite;">VOVV.AI</span> 124 <div style="position:relative;height:1px;width:80px;overflow:hidden;background:linear-gradient(to right,transparent,#e5e3df,transparent);"> 125 <div style="position:absolute;top:0;left:0;height:1px;width:40%;background:linear-gradient(to right,transparent,#2d3a4e,transparent);animation:_w 1.6s ease-in-out infinite;"></div> 126 </div> 127 </div> 128 <style>@keyframes _b{0%,100%{opacity:.7}50%{opacity:1}}@keyframes _w{0%{transform:translateX(-100%)}100%{transform:translateX(350%)}}</style> 129 </div> 130 </body> 131</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.