1<!DOCTYPE html><html lang="en" dir="ltr" class="bg-ink-950 text-zinc-100"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"><meta name="theme-color" content="#07070b"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><link rel="canonical" href="https://www.ai-geminiomni.com/"><title>Gemini Omni: Avatar, Flash, Free Access & Pricing (2026)</title><meta name="description" content="What is Gemini Omni? Google's AI video model with a personal AI avatar and Omni Flash. Is it free? Get pricing, specs, official demos, use cases, the API roadmap and FAQ â 2026."><meta name="generator" content="Astro v5.18.1"><meta name="robots" content="index,follow,max-image-preview:large,max-snippet:-1,max-video-preview:-1"><meta name="google-adsense-account" content="ca-pub-1916766675410622"><link rel="alternate" hreflang="en" href="https://www.ai-geminiomni.com/"><link rel="alternate" hreflang="es" href="https://www.ai-geminiomni.com/es/"><link rel="alternate" hreflang="it" href="https://www.ai-geminiomni.com/it/"><link rel="alternate" hreflang="hi" href="https://www.ai-geminiomni.com/hi/"><link rel="alternate" hreflang="ar" href="https://www.ai-geminiomni.com/ar/"><link rel="alternate" hreflang="zh-CN" href="https://www.ai-geminiomni.com/zh/"><link rel="alternate" hreflang="ja" href="https://www.ai-geminiomni.com/ja/"><link rel="alternate" hreflang="ko" href="https://www.ai-geminiomni.com/ko/"><link rel="alternate" hreflang="fr" href="https://www.ai-geminiomni.com/fr/"><link rel="alternate" hreflang="de" href="https://www.ai-geminiomni.com/de/"><link rel="alternate" hreflang="nl" href="https://www.ai-geminiomni.com/nl/"><link rel="alternate" hreflang="pl" href="https://www.ai-geminiomni.com/pl/"><link rel="alternate" hreflang="pt-BR" href="https://www.ai-geminiomni.com/pt-BR/"><link rel="alternate" hreflang="ru" href="https://www.ai-geminiomni.com/ru/"><link rel="alternate" hreflang="tr" href="https://www.ai-geminiomni.com/tr/"><link rel="alternate" hreflang="id" href="https://www.ai-geminiomni.com/id/"><link rel="alternate" hreflang="vi" href="https://www.ai-geminiomni.com/vi/"><link rel="alternate" hreflang="th" href="https://www.ai-geminiomni.com/th/"><link rel="alternate" hreflang="ms" href="https://www.ai-geminiomni.com/ms/"><link rel="alternate" hreflang="tl" href="https://www.ai-geminiomni.com/tl/"><link rel="alternate" hreflang="bn" href="https://www.ai-geminiomni.com/bn/"><link rel="alternate" hreflang="ta" href="https://www.ai-geminiomni.com/ta/"><link rel="alternate" hreflang="te" href="https://www.ai-geminiomni.com/te/"><link rel="alternate" hreflang="mr" href="https://www.ai-geminiomni.com/mr/"><link rel="alternate" hreflang="he" href="https://www.ai-geminiomni.com/he/"><link rel="alternate" hreflang="fa" href="https://www.ai-geminiomni.com/fa/"><link rel="alternate" hreflang="ur" href="https://www.ai-geminiomni.com/ur/"><link rel="alternate" hreflang="x-default" href="https://www.ai-geminiomni.com/"><meta property="og:type" content="website"><meta property="og:site_name" content="Gemini Omni Info Hub"><meta property="og:title" content="Gemini Omni: Avatar, Flash, Free Access & Pricing (2026)"><meta property="og:description" content="What is Gemini Omni? Google's AI video model with a personal AI avatar and Omni Flash. Is it free? Get pricing, specs, official demos, use cases, the API roadmap and FAQ â 2026."><meta property="og:url" content="https://www.ai-geminiomni.com/"><meta property="og:image" content="https://www.ai-geminiomni.com/og.svg"><meta property="og:locale" content="en"><meta property="og:locale:alternate" content="es"><meta property="og:locale:alternate" content="it"><meta property="og:locale:alternate" content="hi"><meta property="og:locale:alternate" content="ar"><meta property="og:locale:alternate" content="zh-CN"><meta property="og:locale:alternate" content="ja"><meta property="og:locale:alternate" content="ko"><meta property="og:locale:alternate" content="fr"><meta property="og:locale:alternate" content="de"><meta property="og:locale:alternate" content="nl"><meta property="og:locale:alternate" content="pl"><meta property="og:locale:alternate" content="pt-BR"><meta property="og:locale:alternate" content="ru"><meta property="og:locale:alternate" content="tr"><meta property="og:locale:alternate" content="id"><meta property="og:locale:alternate" content="vi"><meta property="og:locale:alternate" content="th"><meta property="og:locale:alternate" content="ms"><meta property="og:locale:alternate" content="tl"><meta property="og:locale:alternate" content="bn"><meta property="og:locale:alternate" content="ta"><meta property="og:locale:alternate" content="te"><meta property="og:locale:alternate" content="mr"><meta property="og:locale:alternate" content="he"><meta property="og:locale:alternate" content="fa"><meta property="og:locale:alternate" content="ur"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Gemini Omni: Avatar, Flash, Free Access & Pricing (2026)"><meta name="twitter:description" content="What is Gemini Omni? Google's AI video model with a personal AI avatar and Omni Flash. Is it free? Get pricing, specs, official demos, use cases, the API roadmap and FAQ â 2026."><meta name="twitter:image" content="https://www.ai-geminiomni.com/og.svg">
1<script type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","inLanguage":"en","mainEntity":[{"@type":"Question","name":"What exactly is Gemini Omni?","acceptedAnswer":{"@type":"Answer","text":"Gemini Omni is Google's unified multimodal family. The production model is Gemini Omni 1.1 Flash (gemini-omni-1.1-flash), which generates video with native synced audio from text, image and video inputs inside one architecture. It supports scene extensions up to 40 seconds, first/last frame control, 360p drafts, and 4K upscaling."}},{"@type":"Question","name":"Is Gemini Omni free?","acceptedAnswer":{"@type":"Answer","text":"Partly. Gemini Omni Flash is free on Google Flow's free tier, YouTube Shorts and the YouTube Create app. Using Omni inside the standalone Gemini app requires a paid Google AI Plus, Pro or Ultra plan."}},{"@type":"Question","name":"How much does Gemini Omni cost?","acceptedAnswer":{"@type":"Answer","text":"Google AI Plus starts around US$7.99 per month, AI Pro is the most common creator tier, and AI Ultra is roughly US$100 per month. Two Omni Flash generations consume about 86% of the AI Pro daily quota, so budget retries carefully. The developer API will arrive with its own pricing."}}
1,{"@type":"Question","name":"When will it ship?","acceptedAnswer":{"@type":"Answer","text":"It already shipped. Google announced Gemini Omni on the Google I/O 2026 main stage on May 19, 2026, simultaneously publishing the official product page and demo videos."}},{"@type":"Question","name":"How does it relate to Veo 3.1?","acceptedAnswer":{"@type":"Answer","text":"Gemini Omni is the successor to Veo inside the Gemini app â Google explicitly says Omni \"will replace Veo in the Gemini app\". The video stack is now folded into the same architecture as Gemini text and image."}},{"@type":"Question","name":"Does it really generate sound?","acceptedAnswer":{"@type":"Answer","text":"Yes. Ambient sound, score and dialogue are produced in the same pass as the video â that's the whole reason for the 'omni' name."}},{"@type":"Question","name":"What is the current clip-length limit?","acceptedAnswer":{"@type":"Answer","text":"Single clips are up to 10 seconds, with scene extensions allowing up to 40 seconds total (10-second increments). Supports native audio, up to 5 photo references, video references up to 3 seconds, and multi-turn editing. Draft in 360p or upscale to 4K."}}
1,{"@type":"Question","name":"How will pricing work?","acceptedAnswer":{"@type":"Answer","text":"Gemini Omni requires a Google AI Plus, Pro or Ultra plan and you must be 18+. Some features (avatars, video-to-video editing) may be restricted in certain countries."}},{"@type":"Question","name":"What is the Gemini Omni AI avatar?","acceptedAnswer":{"@type":"Answer","text":"An optional digital version of you that lets Gemini generate videos which look and sound like you, with no need to re-upload photos each time â and only you can use your own avatar."}}]}</script>
vendor: 63 bytes, line 1
1<script async src="https://www.googletagmanager.com/gtag/js?id=
1G-R7WH0BH713
vendor: 11 bytes, line 1
1"></script>
1<script>(function(){const gaId = "G-R7WH0BH713"; 2 3 window.dataLayer = window.dataLayer || []; 4 function gtag(){ dataLayer.push(arguments); } 5 gtag('js', new Date()); 6 gtag('config', gaId, { anonymize_ip: true }); 7 })();</script>
7<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1916766675410622" crossorigin="anonymous"></script>
7<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link rel="preconnect" href="https://accounts.google.com"><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Space+Grotesk:wght@500;600;700&family=JetBrains+Mono:wght@400;500&family=Noto+Sans+Arabic:wght@400;500;600;700&family=Noto+Sans+Hebrew:wght@400;500;600;700&family=Noto+Sans+Thai:wght@400;500;600;700&display=swap"><link rel="stylesheet" href="/_astro/_slug_.CcK_mi-L.css"> 8<style>.orbit-tag[data-astro-cid-bbe6dxrz]{animation:float 6s ease-in-out infinite}.orbit-tag[data-astro-cid-bbe6dxrz]:nth-child(2){animation-delay:.8s}.orbit-tag[data-astro-cid-bbe6dxrz]:nth-child(3){animation-delay:1.6s}.orbit-tag[data-astro-cid-bbe6dxrz]:nth-child(4){animation-delay:2.4s} 9</style></head> <body class="relative overflow-x-hidden font-sans antialiased"> <aside id="locale-banner" class="locale-banner" role="region" aria-label="Language recommendation banner" data-current-lang="en" data-default-lang="en" data-lang-labels="{"zh":"䏿","en":"English","ja":"æ¥æ¬èª","ko":"íêµì´","es":"Español","fr":"Français","de":"Deutsch","it":"Italiano","nl":"Nederlands","pl":"Polski","pt-BR":"Português","ru":"Ð ÑÑÑкий","tr":"Türkçe","id":"Bahasa Indonesia","vi":"Tiếng Viá»t","th":"à¹à¸à¸¢","ms":"Bahasa Melayu","tl":"Filipino","hi":"हिनà¥à¤¦à¥","bn":"বাà¦à¦²à¦¾","ta":"தமிழà¯","te":"à°¤à±à°²à±à°à±","mr":"मराठà¥","ar":"Ø§ÙØ¹Ø±Ø¨ÙØ©","he":"×¢×ר×ת","fa":"ÙØ§Ø±Ø³Û","ur":"اردÙ"}" data-lang-urls="{"en":"/","es":"/es/","it":"/it/","hi":"/hi/","ar":"/ar/","zh":"/zh/","ja":"/ja/","ko":"/ko/","fr":"/fr/","de":"/de/","nl":"/nl/","pl":"/pl/","pt-BR":"/pt-BR/","ru":"/ru/","tr":"/tr/","id":"/id/","vi":"/vi/","th":"/th/","ms":"/ms/","tl":"/tl/","bn":"/bn/","ta":"/ta/","te":"/te/","mr":"/mr/","he":"/he/","fa":"/fa/","ur":"/ur/"}" data-banner-copy="{"en":{"prompt":"Choose another language to browse content adapted for your browser language preference.","continue":"Continue","close":"Close suggestion banner","selectLabel":"Select preferred language","regionLabel":"Language recommendation banner"},"zh":{"prompt":"éæ©å¦ä¸è¯è¨ä»¥æµè§éç¨äºä½ æµè§å¨è¯è¨å好çå 容ã","continue":"ç»§ç»","close":"å ³éè¯è¨å»ºè®®æ¨ªå¹ ","selectLabel":"éæ©é¦éè¯è¨","regionLabel":"è¯è¨æ¨èæ¨ªå¹ "},"ja":{"prompt":"å¥ã®è¨èªãé¸ã¶ã¨ããã©ã¦ã¶ã®è¨èªè¨å®ã«åãããã³ã³ãã³ãã表示ã§ãã¾ãã","continue":"ç¶ãã","close":"è¨èªææ¡ããã¼ãéãã","selectLabel":"叿ã®è¨èªã鏿","regionLabel":"è¨èªããããããã¼"},"ko":{"prompt":"ë¤ë¥¸ ì¸ì´ë¥¼ ì ííë©´ ë¸ë¼ì°ì ì¸ì´ ì¤ì ì ë§ë ì½í ì¸ ë¥¼ ë³¼ ì ììµëë¤.","continue":"ê³ì","close":"ì¸ì´ ì ì ë°°ë ë«ê¸°","selectLabel":"ìíë ì¸ì´ ì í","regionLabel":"ì¸ì´ ì¶ì² ë°°ë"},"es":{"prompt":"Elija otro idioma para ver contenido adaptado a la preferencia de idioma de su navegador.","continue":"Continuar","close":"Cerrar banner de sugerencia de idioma","selectLabel":"Seleccionar idioma preferido","regionLabel":"Banner de recomendación de idioma"},"fr":{"prompt":"Choisissez une autre langue pour afficher le contenu adapté aux préférences linguistiques de votre navigateur.","continue":"Continuer","close":"Fermer la bannière de suggestion de langue","selectLabel":"Sélectionner la langue préférée","regionLabel":"Bannière de recommandation de langue"},"de":{"prompt":"Wählen Sie eine andere Sprache, um Inhalte entsprechend Ihrer Browser-Spracheinstellung anzuzeigen.","continue":"Weiter","close":"Sprachvorschlagsbanner schlieÃen","selectLabel":"Bevorzugte Sprache auswählen","regionLabel":"Sprachempfehlungsbanner"},"it":{"prompt":"Scegli un'altra lingua per visualizzare contenuti adattati alle preferenze linguistiche del browser.","continue":"Continua","close":"Chiudi banner suggerimento lingua","selectLabel":"Seleziona lingua preferita","regionLabel":"Banner raccomandazione lingua"},"nl":{"prompt":"Kies een andere taal om content te bekijken die is afgestemd op de taalvoorkeur van je browser.","continue":"Doorgaan","close":"Sluit taalsuggestiebanner","selectLabel":"Selecteer voorkeurstaal","regionLabel":"Taalaanbevelingsbanner"},"pl":{"prompt":"Wybierz inny jÄzyk, aby przeglÄ daÄ treÅci dopasowane do preferencji jÄzykowych przeglÄ darki.","continue":"Kontynuuj","close":"Zamknij baner sugestii jÄzyka","selectLabel":"Wybierz preferowany jÄzyk","regionLabel":"Baner rekomendacji jÄzyka"},"pt-BR":{"prompt":"Escolha outro idioma para ver conteúdo adaptado à preferência de idioma do seu navegador.","continue":"Continuar","close":"Fechar banner de sugestão de idioma","selectLabel":"Selecionar idioma preferido","regionLabel":"Banner de recomendação de idioma"},"ru":{"prompt":"ÐÑбеÑиÑе дÑÑгой ÑзÑк, ÑÑÐ¾Ð±Ñ Ð¿ÑоÑмаÑÑиваÑÑ ÐºÐ¾Ð½ÑенÑ, адапÑиÑованнÑй к ÑзÑковÑм наÑÑÑойкам ваÑего бÑаÑзеÑа.","continue":"ÐÑодолжиÑÑ","close":"ÐакÑÑÑÑ Ð±Ð°Ð½Ð½ÐµÑ Ð¿ÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑзÑка","selectLabel":"ÐÑбеÑиÑе пÑедпоÑиÑаемÑй ÑзÑк","regionLabel":"ÐÐ°Ð½Ð½ÐµÑ ÑекомендаÑии ÑзÑка"},"tr":{"prompt":"Tarayıcı dil tercihinize uygun içeriÄi görmek için baÅka bir dil seçin.","continue":"Devam","close":"Dil önerisi baÅlıÄını kapat","selectLabel":"Tercih edilen dili seçin","regionLabel":"Dil önerisi baÅlıÄı"},"id":{"prompt":"Pilih bahasa lain untuk melihat konten yang disesuaikan dengan preferensi bahasa browser Anda.","continue":"Lanjutkan","close":"Tutup banner saran bahasa","selectLabel":"Pilih bahasa pilihan","regionLabel":"Banner rekomendasi bahasa"},"vi":{"prompt":"Chá»n ngôn ngữ khác Äá» xem ná»i dung phù hợp vá»i tùy chá»n ngôn ngữ trình duyá»t cá»§a bạn.","continue":"Tiếp tục","close":"Äóng banner gợi ý ngôn ngữ","selectLabel":"Chá»n ngôn ngữ ưa thÃch","regionLabel":"Banner Äá» xuất ngôn ngữ"},"th":{"prompt":"à¹à¸¥à¸·à¸à¸à¸ าษาà¸à¸·à¹à¸à¹à¸à¸·à¹à¸à¸à¸¹à¹à¸à¸·à¹à¸à¸«à¸²à¸à¸µà¹à¸à¸£à¸±à¸à¹à¸«à¹à¹à¸à¹à¸²à¸à¸±à¸à¸à¸²à¸£à¸à¸±à¹à¸à¸à¹à¸²à¸ าษาà¸à¸à¸à¹à¸à¸£à¸²à¸§à¹à¹à¸à¸à¸£à¹à¸à¸à¸à¸à¸¸à¸","continue":"à¸à¸³à¹à¸à¸´à¸à¸à¸²à¸£à¸à¹à¸","close":"à¸à¸´à¸à¹à¸à¸à¹à¸à¸à¸£à¹à¹à¸à¸°à¸à¸³à¸ าษา","selectLabel":"à¹à¸¥à¸·à¸à¸à¸ าษาà¸à¸µà¹à¸à¹à¸à¸à¸à¸²à¸£","regionLabel":"à¹à¸à¸à¹à¸à¸à¸£à¹à¹à¸à¸°à¸à¸³à¸ าษา"},"ms":{"prompt":"Pilih bahasa lain untuk melihat kandungan yang disesuaikan dengan pilihan bahasa pelayar anda.","continue":"Teruskan","close":"Tutup banner cadangan bahasa","selectLabel":"Pilih bahasa pilihan","regionLabel":"Banner cadangan bahasa"},"tl":{"prompt":"Pumili ng ibang wika upang makita ang content na naaayon sa preference ng wika ng browser mo.","continue":"Magpatuloy","close":"Isara ang banner ng mungkahi sa wika","selectLabel":"Piliin ang gustong wika","regionLabel":"Banner ng rekomendasyon sa wika"},"bn":{"prompt":"à¦à¦ªà¦¨à¦¾à¦° বà§à¦°à¦¾à¦à¦à¦¾à¦°à§à¦° à¦à¦¾à¦·à¦¾à¦° পà¦à¦¨à§à¦¦ ঠনà§à¦¯à¦¾à¦¯à¦¼à§ à¦à¦¨à¦à§à¦¨à§à¦ দà§à¦à¦¤à§ ঠনà§à¦¯ à¦à¦¾à¦·à¦¾ বà§à¦à§ নিন।","continue":"à¦à¦¾à¦²à¦¿à¦¯à¦¼à§ যান","close":"à¦à¦¾à¦·à¦¾ পরামরà§à¦¶ বà§à¦¯à¦¾à¦¨à¦¾à¦° বনà§à¦§ à¦à¦°à§à¦¨","selectLabel":"পà¦à¦¨à§à¦¦à§à¦° à¦à¦¾à¦·à¦¾ নিরà§à¦¬à¦¾à¦à¦¨ à¦à¦°à§à¦¨","regionLabel":"à¦à¦¾à¦·à¦¾ সà§à¦ªà¦¾à¦°à¦¿à¦¶ বà§à¦¯à¦¾à¦¨à¦¾à¦°"},"ta":{"prompt":"à®à®à¯à®à®³à¯ à®à®²à®¾à®µà®¿ à®®à¯à®´à®¿ விரà¯à®ªà¯à®ª
9தà¯à®¤à®¿à®±à¯à®à¯ à®à®±à¯à®ª à®à®³à¯à®³à®à®à¯à®à®¤à¯à®¤à¯à®ªà¯ பாரà¯à®à¯à® வà¯à®±à¯ à®®à¯à®´à®¿à®¯à¯à®¤à¯ தà¯à®°à¯à®¨à¯à®¤à¯à®à¯à®à¯à®à®µà¯à®®à¯.","continue":"தà¯à®à®°à®µà¯à®®à¯","close":"à®®à¯à®´à®¿ பரிநà¯à®¤à¯à®°à¯ பà¯à®©à®°à¯ à®®à¯à®à®µà¯à®®à¯","selectLabel":"விரà¯à®ªà¯à®ª à®®à¯à®´à®¿à®¯à¯à®¤à¯ தà¯à®°à¯à®¨à¯à®¤à¯à®à¯à®à¯à®à®µà¯à®®à¯","regionLabel":"à®®à¯à®´à®¿ பரிநà¯à®¤à¯à®°à¯ பà¯à®©à®°à¯"},"te":{"prompt":"మౠబà±à°°à±à°à°°à± à°à°¾à°·à°¾ à°ªà±à°°à°¾à°§à°¾à°¨à±à°¯à°¤à°à± à°
à°¨à±à°à±à°£à°à°à°¾ à°à°à°à±à°à°à±âనౠà°à±à°¡à°à°¾à°¨à°¿à°à°¿ మరà±à° à°à°¾à°·à°¨à± à°à°à°à±à°à±à°à°¡à°¿.","continue":"à°à±à°¨à°¸à°¾à°à°¿à°à°à±","close":"à°à°¾à°· à°¸à±à°à°¨ à°¬à±à°¯à°¾à°¨à°°à±âనౠమà±à°¸à°¿à°µà±à°¯à°¿","selectLabel":"à°à°·à±à°à°®à±à°¨ à°à°¾à°·à°¨à± à°à°à°à±à°à±à°à°¡à°¿","regionLabel":"à°à°¾à°· సిఫారà±à°¸à± à°¬à±à°¯à°¾à°¨à°°à±"},"mr":{"prompt":"तà¥à¤®à¤à¥à¤¯à¤¾ बà¥à¤°à¤¾à¤à¤à¤°à¤à¥à¤¯à¤¾ à¤à¤¾à¤·à¤¾ पà¥à¤°à¤¾à¤§à¤¾à¤¨à¥à¤¯à¤¾à¤¨à¥à¤¸à¤¾à¤° सामà¤à¥à¤°à¥ पाहणà¥à¤¯à¤¾à¤¸à¤¾à¤ ॠदà¥à¤¸à¤°à¥ à¤à¤¾à¤·à¤¾ निवडा.","continue":"पà¥à¤¢à¥ à¤à¤¾","close":"à¤à¤¾à¤·à¤¾ सà¥à¤à¤¨à¤¾ बà¥
नर बà¤à¤¦ à¤à¤°à¤¾","selectLabel":"पसà¤à¤¤à¥à¤à¥ à¤à¤¾à¤·à¤¾ निवडा","regionLabel":"à¤à¤¾à¤·à¤¾ शिफारस बà¥
नर"},"ar":{"prompt":"اختر ÙØºØ© Ø£Ø®Ø±Ù ÙØ¹Ø±Ø¶ Ù
ØØªÙÙ ÙØªÙÙÙ Ù
ع ØªÙØ¶ÙÙØ§Øª ÙØºØ© Ù
ØªØµÙØÙ.","continue":"Ù
تابعة","close":"Ø¥ØºÙØ§Ù Ø´Ø±ÙØ· Ø§ÙØªØ±Ø§Ø اÙÙØºØ©","selectLabel":"اختر اÙÙØºØ© اÙÙ
ÙØ¶ÙØ©","regionLabel":"Ø´Ø±ÙØ· ØªÙØµÙØ© اÙÙØºØ©"},"he":{"prompt":"××ר ×©×¤× ××רת ××× ×צפ×ת ×ת××× ×××ת×× ×××¢×פת ××©×¤× ×©× ××פ××¤× ×©××.","continue":"××ש×","close":"ס××ר ×ת ××× ×¨ ×צעת ×שפ×","selectLabel":"××ר ×©×¤× ×××¢×פת","regionLabel":"××× ×¨ ×××צת שפ×"},"fa":{"prompt":"زبا٠دÛÚ¯Ø±Û Ø±Ø§ Ø§ÙØªØ®Ø§Ø¨ Ú©ÙÛØ¯ تا Ù
ØØªÙاÛÛ Ù
ØªÙØ§Ø³Ø¨ با ØªØ±Ø¬ÛØ زبا٠Ù
Ø±ÙØ±Ú¯Ø± Ø®ÙØ¯ ببÛÙÛØ¯.","continue":"اداÙ
Ù","close":"Ø¨Ø³ØªÙ Ø¨ÙØ± Ù¾ÛØ´ÙÙØ§Ø¯ زباÙ","selectLabel":"Ø§ÙØªØ®Ø§Ø¨ Ø²Ø¨Ø§Ù ØªØ±Ø¬ÛØÛ","regionLabel":"Ø¨ÙØ± Ù¾ÛØ´ÙÙØ§Ø¯ زباÙ"},"hi":{"prompt":"à¤
पनॠबà¥à¤°à¤¾à¤à¤à¤¼à¤° à¤à¤¾à¤·à¤¾ पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤à¤¤à¤¾ à¤à¥ à¤
नà¥à¤¸à¤¾à¤° सामà¤à¥à¤°à¥ दà¥à¤à¤¨à¥ à¤à¥ लिठदà¥à¤¸à¤°à¥ à¤à¤¾à¤·à¤¾ à¤à¥à¤¨à¥à¤à¥¤","continue":"à¤à¤¾à¤°à¥ रà¤à¥à¤","close":"à¤à¤¾à¤·à¤¾ सà¥à¤à¤¾à¤µ बà¥à¤¨à¤° बà¤à¤¦ à¤à¤°à¥à¤","selectLabel":"पसà¤à¤¦à¥à¤¦à¤¾ à¤à¤¾à¤·à¤¾ à¤à¥à¤¨à¥à¤","regionLabel":"à¤à¤¾à¤·à¤¾ à¤
नà¥à¤¶à¤à¤¸à¤¾ बà¥à¤¨à¤°"},"ur":{"prompt":"اپÙÛ Ø¨Ø±Ø§Ø¤Ø²Ø± Ø²Ø¨Ø§Ù Ú©Û ØªØ±Ø¬ÛØ Ú©Û Ù
طاب٠Ù
ÙØ§Ø¯ دÛÚ©Ú¾ÙÛ Ú©Û ÙÛÛ Ø¯ÙØ³Ø±Û زبا٠Ù
ÙØªØ®Ø¨ کرÛÚºÛ","continue":"Ø¬Ø§Ø±Û Ø±Ú©Ú¾ÛÚº","close":"Ø²Ø¨Ø§Ù Ú©Û ØªØ¬ÙÛØ² بÛÙØ± Ø¨ÙØ¯ کرÛÚº","selectLabel":"Ù¾Ø³ÙØ¯ÛØ¯Û Ø²Ø¨Ø§Ù Ù
ÙØªØ®Ø¨ کرÛÚº","regionLabel":"Ø²Ø¨Ø§Ù Ú©Û Ø³ÙØ§Ø±Ø´ بÛÙØ±"}}" style="display: none;" data-astro-cid-xujs2ijk> <div class="locale-banner-inner" data-astro-cid-xujs2ijk> <div class="locale-banner-text" data-astro-cid-xujs2ijk> <span id="locale-banner-message" data-astro-cid-xujs2ijk>Choose another language to browse content adapted for your browser language preference.</span> </div>
9 <div class="locale-banner-controls" data-astro-cid-xujs2ijk> <div class="locale-banner-actions" data-astro-cid-xujs2ijk> <div class="locale-banner-select-wrapper" data-astro-cid-xujs2ijk> <svg class="locale-banner-check" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true" data-astro-cid-xujs2ijk> <polyline points="20 6 9 17 4 12" data-astro-cid-xujs2ijk></polyline> </svg> <select id="locale-banner-select" class="locale-banner-select" aria-label="Select preferred language" data-astro-cid-xujs2ijk> <option value="en" data-astro-cid-xujs2ijk>English</option><option value="es" selected data-astro-cid-xujs2ijk>Español</option><option value="it" selected data-astro-cid-xujs2ijk>Italiano</option><option value="hi" selected data-astro-cid-xujs2ijk>हिनà¥à¤¦à¥</option><option value="ar" selected data-astro-cid-xujs2ijk>Ø§ÙØ¹Ø±Ø¨ÙØ©</option><option value="zh" selected data-astro-cid-xujs2ijk>䏿</option><option value="ja" selected data-astro-cid-xujs2ijk>æ¥æ¬èª</option><option value="ko" selected data-astro-cid-xujs2ijk>íêµì´</option><option value="fr" selected data-astro-cid-xujs2ijk>Français</option><option value="de" selected data-astro-cid-xujs2ijk>Deutsch</option><option value="nl" selected data-astro-cid-xujs2ijk>Nederlands</option><option value="pl" selected data-astro-cid-xujs2ijk>Polski</option><option value="pt-BR" selected data-astro-cid-xujs2ijk>Português</option><option value="ru" selected data-astro-cid-xujs2ijk>Ð ÑÑÑкий</option><option value="tr" selected data-astro-cid-xujs2ijk>Türkçe</option><option value="id" selected data-astro-cid-xujs2ijk>Bahasa Indonesia</option><option value="vi" selected data-astro-cid-xujs2ijk>Tiếng Viá»t</option><option value="th" selected data-astro-cid-xujs2ijk>à¹à¸à¸¢</option><option value="ms" selected data-astro-cid-xujs2ijk>Bahasa Melayu</option><option value="tl" selected data-astro-cid-xujs2ijk>Filipino</option><option value="bn" selected data-astro-cid-xujs2ijk>বাà¦à¦²à¦¾</option><option value="ta" selected data-astro-cid-xujs2ijk>தமிழà¯</option><option value="te" selected data-astro-cid-xujs2ijk>à°¤à±à°²à±à°à±</option><option value="mr" selected data-astro-cid-xujs2ijk>मराठà¥</option><option value="he" selected data-astro-cid-xujs2ijk>×¢×ר×ת</option><option value="fa" selected data-astro-cid-xujs2ijk>ÙØ§Ø±Ø³Û</option><option value="ur" selected data-astro-cid-xujs2ijk>اردÙ</option> </select> <svg class="locale-banner-chevron" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true" data-astro-cid-xujs2ijk> <polyline points="6 9 12 15 18 9" data-astro-cid-xujs2ijk></polyline> </svg> </div> <a id="locale-banner-continue" href="#" class="locale-banner-button" data-astro-cid-xujs2ijk> Continue </a> </div> <button id="locale-banner-close" class="locale-banner-close" aria-label="Close suggestion banner" type="button" data-astro-cid-xujs2ijk> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true" data-astro-cid-xujs2ijk> <line x1="18" y1="6" x2="6" y2="18" data-astro-cid-xujs2ijk></line> <line x1="6" y1="6" x2="18" y2="18" data-astro-cid-xujs2ijk></line> </svg> </button> </div> </div> </aside>
9<script> 10 (() => { 11 try { 12 const banner = document.getElementById('locale-banner'); 13 if (!banner) return; 14 15 const DISMISSED_KEY = 'apple_style_lang_banner_dismissed'; 16 if (sessionStorage.getItem(DISMISSED_KEY) === '1') return; 17 18 const currentLang = banner.getAttribute('data-current-lang') || 'en'; 19 const langUrls = JSON.parse(banner.getAttribute('data-lang-urls') || '{}'); 20 const bannerCopy = JSON.parse(banner.getAttribute('data-banner-copy') || '{}'); 21 const supportedLangs = Object.keys(langUrls); 22 23 const alias = { pt: 'pt-BR', zh: 'zh', iw: 'he', in: 'id', fil: 'tl', tl: 'tl' }; 24 25 function match(raw) { 26 raw = (raw || '').toLowerCase(); 27 if (!raw) return ''; 28 for (let i = 0; i < supportedLangs.length; i++) { 29 if (supportedLangs[i].toLowerCase() === raw) return supportedLangs[i]; 30 } 31 const base = raw.split('-')[0]; 32 if (alias[base]) return alias[base]; 33 for (let j = 0; j < supportedLangs.length; j++) { 34 const s = supportedLangs[j].toLowerCase(); 35 if (s === base || s.split('-')[0] === base) return supportedLangs[j]; 36 } 37 return ''; 38 } 39 40 const prefs = 41 navigator.languages && navigator.languages.length 42 ? navigator.languages 43 : [navigator.language || 'en']; 44 45 let detectedLang = ''; 46 for (let k = 0; k < prefs.length && !detectedLang; k++) { 47 detectedLang = match(prefs[k]); 48 } 49 if (!detectedLang) detectedLang = 'en'; 50 51 if (detectedLang === currentLang) return; 52 53 const select = document.getElementById('locale-banner-select'); 54 const continueBtn = document.getElementById('locale-banner-continue'); 55 const closeBtn = document.getElementById('locale-banner-close'); 56 const msg = document.getElementById('locale-banner-message'); 57 58 function applyBannerCopy(lang) { 59 const copy = bannerCopy[lang] || bannerCopy.en || {}; 60 if (msg) msg.textContent = copy.prompt || ''; 61 if (continueBtn) continueBtn.textContent = copy.continue || ''; 62 if (select) select.setAttribute('aria-label', copy.selectLabel || ''); 63 if (closeBtn) closeBtn.setAttribute('aria-label', copy.close || ''); 64 banner.setAttribute('aria-label', copy.regionLabel || ''); 65 } 66 67 if (select) select.value = detectedLang; 68 applyBannerCopy(detectedLang); 69 70 function updateContinueTarget() { 71 if (!select || !continueBtn) return; 72 const target = select.value; 73 continueBtn.setAttribute('href', langUrls[target] || '/'); 74 applyBannerCopy(target); 75 } 76 77 if (select) select.addEventListener('change', updateContinueTarget); 78 79 if (closeBtn) { 80 closeBtn.addEventListener('click', () => { 81 banner.style.display = 'none'; 82 sessionStorage.setItem(DISMISSED_KEY, '1'); 83 }); 84 } 85 86 updateContinueTarget(); 87 banner.style.display = 'block'; 88 } catch (e) {} 89 })(); 90</script>
90 <div aria-hidden="true" class="pointer-events-none fixed inset-0 -z-10 mask-fade-b"> <div class="absolute -top-40 left-1/2 h-[600px] w-[1200px] -translate-x-1/2 rounded-full bg-violet-500/20 blur-3xl"></div> <div class="absolute right-[-200px] top-40 h-[500px] w-[500px] rounded-full bg-cyan-400/10 blur-3xl"></div> <div class="absolute inset-x-0 top-0 h-px bg-gradient-to-r from-transparent via-white/15 to-transparent"></div> </div> <header class="sticky top-0 z-40 border-b border-white/5 bg-ink-950/70 backdrop-blur-md"> <div class="container-x flex h-16 items-center justify-between gap-4"> <a href="/" class="flex shrink-0 items-center gap-2.5 font-display text-base font-semibold tracking-tight text-white"> <span class="grid h-7 w-7 shrink-0 place-items-center rounded-lg bg-brand-gradient text-ink-950 shadow-glow"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="currentColor" d="M12 2l1.7 7.3L21 11l-7.3 1.7L12 20l-1.7-7.3L3 11l7.3-1.7L12 2z"></path> </svg> </span> <span class="whitespace-nowrap">Gemini Omni</span> </a> <nav aria-label="Primary" class="hidden lg:block"> <ul class="flex items-center gap-1 text-sm text-zinc-300"> <li> <a href="#showcase" class="whitespace-nowrap rounded-full px-3 py-1.5 transition-colors hover:bg-white/[0.06] hover:text-white"> Demos </a> </li><li> <a href="#features" class="whitespace-nowrap rounded-full px-3 py-1.5 transition-colors hover:bg-white/[0.06] hover:text-white"> Features </a> </li><li> <a href="#specs" class="whitespace-nowrap rounded-full px-3 py-1.5 transition-colors hover:bg-white/[0.06] hover:text-white"> Specs </a> </li><li> <a href="#free" class="whitespace-nowrap rounded-full px-3 py-1.5 transition-colors hover:bg-white/[0.06] hover:text-white"> Free vs paid </a> </li><li> <a href="/prompt-generator/" class="whitespace-nowrap rounded-full px-3 py-1.5 transition-colors hover:bg-white/[0.06] hover:text-white"> Prompt builder </a> </li><li> <a href="/video-studio/" class="whitespace-nowrap rounded-full px-3 py-1.5 transition-colors hover:bg-white/[0.06] hover:text-white"> Video Studio </a> </li><li> <a href="/pricing/" class="whitespace-nowrap rounded-full px-3 py-1.5 transition-colors hover:bg-white/[0.06] hover:text-white"> Pricing </a> </li><li> <a href="/blog/" class="whitespace-nowrap rounded-full px-3 py-1.5 transition-colors hover:bg-white/[0.06] hover:text-white"> Articles </a> </li><li> <a href="#faq" class="whitespace-nowrap rounded-full px-3 py-1.5 transition-colors hover:bg-white/[0.06] hover:text-white"> FAQ </a> </li> </ul> </nav> <div class="flex shrink-0 items-center gap-2"> <div data-auth class="relative flex items-center gap-2"> <button type="button" data-open-login data-auth-signed-out class="chip cursor-pointer hover:border-violet-400/40 hover:text-white"> Sign in </button> <a href="/pricing/" data-auth-points hidden aria-label="Available credits" title="Credits" class="hidden items-center gap-1.5 rounded-full border border-violet-400/30 bg-violet-500/10 px-3 py-1 text-xs font-semibold text-violet-100 transition-colors hover:border-violet-400/60 hover:bg-violet-500/15 hover:text-white"> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="currentColor" d="M13 2L3 14h7l-1 8 10-12h-7l1-8z"></path> </svg> <span data-auth-points-value class="tabular-nums">0</span> </a> <button type="button" data-auth-signed-in hidden aria-haspopup="menu" aria-expanded="false" class="flex items-center gap-2 rounded-full border border-white/10 bg-white/[0.04] py-1 pl-1 pr-3 text-sm transition-colors hover:border-violet-400/40"> <span data-auth-avatar class="grid h-7 w-7 place-items-center overflow-hidden rounded-full bg-brand-gradient text-xs font-semibold uppercase text-ink-950"></span> <span data-auth-name class="hidden max-w-[8rem] truncate text-zinc-200 sm:inline"></span> <svg viewBox="0 0 24 24" class="hidden h-3 w-3 opacity-60 sm:inline" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M6 9l6 6 6-6"></path> </svg> </button> <div data-auth-menu hidden role="menu" class="absolute right-0 top-full z-50 mt-2 w-64 max-w-[calc(100vw-1rem)] origin-top-right rounded-2xl border border-white/10 bg-ink-900/95 p-3 shadow-xl backdrop-blur"> <div class="flex items-center gap-3 border-b border-white/5 px-2 pb-3"> <span data-auth-avatar-lg class="grid h-10 w-10 shrink-0 place-items-center overflow-hidden rounded-full bg-brand-gradient text-sm font-semibold uppercase text-ink-950"></span> <div class="min-w-0"> <p data-auth-name-full class="truncate text-sm font-semibold text-white"></p> <p data-auth-email class="truncate text-xs text-zinc-400"></p> </div> </div> <button type="button" data-auth-logout class="mt-3 flex w-full items-center justify-center gap-2 rounded-xl border border-rose-400/30 bg-rose-500/10 px-3 py-2 text-sm font-semibold text-rose-200 transition-colors hover:bg-rose-500/15"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M15 12H4m0 0l4-4m-4 4l4 4M9 4h7a2 2 0 012 2v12a2 2 0 01-2 2H9"></path> </svg> Log out </button> </div> </div>
90<script>(function(){const API_BASE = "https://www.gushanai.com/api"; 91const APP_KEY = "gemini_omni_4561"; 92const HTML_LANG = "en"; 93 94 (() => { 95 if (typeof window === 'undefined') return; 96 97 const AUTH_TOKEN_KEY = 'auth_token'; 98 const USER_INFO_KEY = 'user_info'; 99 const AUTH_CHANGED_EVENT = 'gemini-omni:auth-changed'; 100 const REFRESH_USER_EVENT = 'gemini-omni:refresh-user'; 101 const SESSION_REFRESHED_KEY = 'gemini-omni:auth-refreshed'; 102 103 const root = document.querySelector('[data-auth]'); 104 if (!root) return; 105 106 const signedOutEl = root.querySelector('[data-auth-signed-out]'); 107 const signedInEl = root.querySelector('[data-auth-signed-in]'); 108 const menuEl = root.querySelector('[data-auth-menu]'); 109 const avatarEl = root.querySelector('[data-auth-avatar]'); 110 const avatarLgEl = root.querySelector('[data-auth-avatar-lg]'); 111 const nameEl = root.querySelector('[data-auth-name]'); 112 const nameFullEl = root.querySelector('[data-auth-name-full]'); 113 const emailEl = root.querySelector('[data-auth-email]'); 114 const logoutBtn = root.querySelector('[data-auth-logout]'); 115 const pointsEl = root.querySelector('[data-auth-points]'); 116 const pointsValueEl = root.querySelector('[data-auth-points-value]'); 117 118 let pointsFormatter; 119 try { 120 pointsFormatter = new Intl.NumberFormat(HTML_LANG); 121 } catch { 122 pointsFormatter = new Intl.NumberFormat('en'); 123 } 124 125 const getToken = () => window.localStorage.getItem(AUTH_TOKEN_KEY); 126 const getUser = () => { 127 const raw = window.localStorage.getItem(USER_INFO_KEY); 128 if (!raw) return null; 129 try { 130 return JSON.parse(raw); 131 } catch { 132 return null; 133 } 134 }; 135 136 const initials = (user) => { 137 const src = (user?.nickName || user?.email || '').trim(); 138 if (!src) return '?'; 139 const ch = src.codePointAt(0); 140 return ch ? String.fromCodePoint(ch).toUpperCase() : '?'; 141 }; 142 143 const renderAvatar = (el, user) => { 144 if (!el) return; 145 el.innerHTML = ''; 146 if (user?.avatarUrl) { 147 const img = document.createElement('img'); 148 img.src = user.avatarUrl; 149 img.alt = user.nickName || user.email || ''; 150 img.referrerPolicy = 'no-referrer'; 151 img.className = 'h-full w-full object-cover'; 152 el.appendChild(img); 153 } else { 154 el.textContent = initials(user); 155 } 156 }; 157 158 const closeMenu = () => { 159 menuEl?.setAttribute('hidden', ''); 160 signedInEl?.setAttribute('aria-expanded', 'false'); 161 if (menuEl) menuEl.style.right = ''; 162 }; 163 164 const adjustMenuPosition = () => { 165 if (!menuEl) return; 166 menuEl.style.right = ''; 167 const rect = menuEl.getBoundingClientRect(); 168 const minMargin = 8; 169 if (rect.left < minMargin) { 170 const shift = minMargin - rect.left; 171 menuEl.style.right = `-${shift}px`; 172 } else if (rect.right > window.innerWidth - minMargin) { 173 const overflow = rect.right - (window.innerWidth - minMargin); 174 menuEl.style.right = `${overflow}px`; 175 } 176 }; 177 178 const openMenu = () => { 179 menuEl?.removeAttribute('hidden'); 180 signedInEl?.setAttribute('aria-expanded', 'true'); 181 adjustMenuPosition(); 182 }; 183 184 const renderPoints = (user) => { 185 if (!pointsEl) return; 186 const total = Number(user?.wallet?.points?.totalBalance); 187 if (Number.isFinite(total) && total >= 0) { 188 if (pointsValueEl) pointsValueEl.textContent = pointsFormatter.format(total); 189 pointsEl.removeAttribute('hidden'); 190 pointsEl.classList.remove('hidden'); 191 pointsEl.classList.add('inline-flex'); 192 } else { 193 pointsEl.setAttribute('hidden', ''); 194 pointsEl.classList.add('hidden'); 195 pointsEl.classList.remove('inline-flex'); 196 } 197 }; 198 199 const render = () => { 200 const token = getToken(); 201 const user = getUser(); 202 if (token && user) { 203 signedOutEl?.setAttribute('hidden', ''); 204 signedInEl?.removeAttribute('hidden'); 205 renderAvatar(avatarEl, user); 206 renderAvatar(avatarLgEl, user); 207 const display = user.nickName || user.email || ''; 208 if (nameEl) nameEl.textContent = display; 209 if (nameFullEl) nameFullEl.textContent = user.nickName || user.email || ''; 210 if (emailEl) emailEl.textContent = user.email || ''; 211 renderPoints(user); 212 } else { 213 signedInEl?.setAttribute('hidden', ''); 214 signedOutEl?.removeAttribute('hidden'); 215 renderPoints(null); 216 closeMenu(); 217 } 218 }; 219 220 const apiRequest = async (path, body) => { 221 const headers = { 'Content-Type': 'application/json', 'x-app-key': APP_KEY }; 222 const token = getToken(); 223 if (token) headers.Authorization = token; 224 const res = await fetch(`${API_BASE}${path}`, { 225 method: 'POST', 226 headers, 227 body: JSON.stringify(body || {}), 228 }); 229 let env;
230 try { 231 env = await res.json(); 232 } catch { 233 env = { code: res.status, message: `HTTP ${res.status}` }; 234 } 235 if (!env || (env.code !== 200 && env.code !== 0)) { 236 const err = new Error(env?.message || `HTTP ${res.status}`); 237 err.code = env?.code ?? res.status; 238 err.status = res.status; 239 throw err; 240 } 241 return env.data; 242 }; 243 244 const clearAuth = () => { 245 window.localStorage.removeItem(AUTH_TOKEN_KEY); 246 window.localStorage.removeItem(USER_INFO_KEY); 247 try { 248 window.sessionStorage.removeItem(SESSION_REFRESHED_KEY); 249 } catch {} 250 window.dispatchEvent(new CustomEvent(AUTH_CHANGED_EVENT, { detail: { token: null, user: null } })); 251 }; 252 253 const refreshIfNeeded = async () => { 254 const token = getToken(); 255 if (!token) return; 256 let alreadyRefreshed = false; 257 try { 258 alreadyRefreshed = window.sessionStorage.getItem(SESSION_REFRESHED_KEY) === '1'; 259 } catch {} 260 if (alreadyRefreshed) return; 261 try { 262 const refreshData = await apiRequest('/auth/refresh', {}); 263 if (refreshData?.token) { 264 window.localStorage.setItem(AUTH_TOKEN_KEY, refreshData.token); 265 } 266 const user = await apiRequest('/mine/info', {}); 267 if (user) { 268 window.localStorage.setItem(USER_INFO_KEY, JSON.stringify(user)); 269 } 270 try { 271 window.sessionStorage.setItem(SESSION_REFRESHED_KEY, '1'); 272 } catch {} 273 window.dispatchEvent( 274 new CustomEvent(AUTH_CHANGED_EVENT, { detail: { token: getToken(), user } }) 275 ); 276 } catch (err) { 277 const status = err && (err.status || err.code); 278 if (status === 401 || status === 403) { 279 clearAuth(); 280 } 281 } 282 }; 283 284 signedInEl?.addEventListener('click', (e) => { 285 e.stopPropagation(); 286 if (menuEl?.hasAttribute('hidden')) openMenu(); 287 else closeMenu(); 288 }); 289 290 logoutBtn?.addEventListener('click', (e) => { 291 e.stopPropagation(); 292 clearAuth(); 293 closeMenu(); 294 }); 295 296 document.addEventListener('click', (e) => { 297 if (!root.contains(e.target)) closeMenu(); 298 }); 299 300 document.addEventListener('keydown', (e) => { 301 if (e.key === 'Escape') closeMenu(); 302 }); 303 304 window.addEventListener(AUTH_CHANGED_EVENT, render); 305 306 window.addEventListener(REFRESH_USER_EVENT, async () => { 307 if (!getToken()) return; 308 try { 309 const user = await apiRequest('/mine/info', {}); 310 if (user) { 311 window.localStorage.setItem(USER_INFO_KEY, JSON.stringify(user)); 312 window.dispatchEvent( 313 new CustomEvent(AUTH_CHANGED_EVENT, { detail: { token: getToken(), user } }) 314 ); 315 } 316 } catch (err) { 317 const status = err && (err.status || err.code); 318 if (status === 401 || status === 403) { 319 clearAuth(); 320 } 321 } 322 }); 323 324 render(); 325 refreshIfNeeded(); 326 })(); 327})();</script>
327 <div class="relative" data-lang-switcher> <button type="button" class="chip hover:border-violet-400/40 hover:text-white" aria-label="Switch language" aria-haspopup="listbox" aria-expanded="false" data-lang-toggle> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" d="M12 3v18M3 12h18M5.5 7.5c4 3 9 3 13 0M5.5 16.5c4-3 9-3 13 0"></path> </svg> <span class="hidden sm:inline">English</span> <svg viewBox="0 0 24 24" class="h-3 w-3 opacity-60" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M6 9l6 6 6-6"></path> </svg> </button> <div class="absolute end-0 z-50 mt-2 hidden max-h-[min(60vh,420px)] w-48 origin-top-right overflow-y-auto overscroll-contain rtl:origin-top-left rounded-2xl border border-white/10 bg-ink-900/95 p-1.5 shadow-xl backdrop-blur" role="listbox" data-lang-menu> <a href="/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors bg-white/[0.06] text-white" role="option" aria-selected="true" hreflang="en"> <span>English</span> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5 text-violet-300" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M5 12l5 5 9-11"></path> </svg> </a><a href="/es/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="es"> <span>Español</span> </a><a href="/it/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="it"> <span>Italiano</span> </a><a href="/hi/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="hi"> <span>हिनà¥à¤¦à¥</span> </a><a href="/ar/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="ar"> <span>Ø§ÙØ¹Ø±Ø¨ÙØ©</span> </a><a href="/zh/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="zh"> <span>䏿</span> </a><a href="/ja/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="ja"> <span>æ¥æ¬èª</span> </a><a href="/ko/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="ko"> <span>íêµì´</span> </a><a href="/fr/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="fr"> <span>Français</span> </a><a href="/de/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="de"> <span>Deutsch</span> </a><a href="/nl/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="nl"> <span>Nederlands</span> </a><a href="/pl/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="pl"> <span>Polski</span> </a><a href="/pt-BR/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="pt-BR"> <span>Português</span> </a><a href="/ru/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="ru"> <span>Ð ÑÑÑкий</span> </a><a href="/tr/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="tr"> <span>Türkçe</span> </a><a href="/id/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="id"> <span>Bahasa Indonesia</span> </a><a href="/vi/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="vi"> <span>Tiếng Viá»t</span> </a><a href="/th/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="th"> <span>à¹à¸à¸¢</span> </a>
327<a href="/ms/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="ms"> <span>Bahasa Melayu</span> </a><a href="/tl/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="tl"> <span>Filipino</span> </a><a href="/bn/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="bn"> <span>বাà¦à¦²à¦¾</span> </a><a href="/ta/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="ta"> <span>தமிழà¯</span> </a><a href="/te/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="te"> <span>à°¤à±à°²à±à°à±</span> </a><a href="/mr/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="mr"> <span>मराठà¥</span> </a><a href="/he/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="he"> <span>×¢×ר×ת</span> </a><a href="/fa/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="fa"> <span>ÙØ§Ø±Ø³Û</span> </a><a href="/ur/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="ur"> <span>اردÙ</span> </a> </div> </div> <button type="button" class="grid h-9 w-9 place-items-center rounded-full border border-white/10 bg-white/[0.04] text-zinc-200 transition-colors hover:border-violet-400/40 hover:text-white lg:hidden" aria-label="Menu" aria-expanded="false" aria-controls="mobile-menu" data-mobile-toggle> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" d="M4 7h16M4 12h16M4 17h16"></path> </svg> </button> </div> </div> <div id="mobile-menu" class="lg:hidden hidden border-t border-white/5 bg-ink-950/95 backdrop-blur"> <ul class="container-x flex flex-col gap-1 py-3 text-sm text-zinc-300"> <li> <a href="#showcase" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Demos </a> </li><li> <a href="#features" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Features </a> </li><li> <a href="#specs" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Specs </a> </li><li> <a href="#architecture" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Architecture </a> </li><li> <a href="#cases" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Use cases </a> </li><li> <a href="#comparison" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Compare </a> </li><li> <a href="#free" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Free vs paid </a> </li><li> <a href="#timeline" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Timeline </a> </li><li> <a href="/prompt-generator/" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link>
327 Prompt builder </a> </li><li> <a href="/video-studio/" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Video Studio </a> </li><li> <a href="/pricing/" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Pricing </a> </li><li> <a href="/blog/" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Articles </a> </li><li> <a href="#faq" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> FAQ </a> </li><li> <a href="#sources" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Sources </a> </li> </ul> </div> </header>
327<script> 328 (() => { 329 const toggle = document.querySelector('[data-mobile-toggle]'); 330 const menu = document.getElementById('mobile-menu'); 331 if (toggle && menu) { 332 const close = () => { menu.classList.add('hidden'); toggle.setAttribute('aria-expanded', 'false'); }; 333 const open = () => { menu.classList.remove('hidden'); toggle.setAttribute('aria-expanded', 'true'); }; 334 toggle.addEventListener('click', () => menu.classList.contains('hidden') ? open() : close()); 335 menu.querySelectorAll('[data-mobile-link]').forEach((el) => el.addEventListener('click', close)); 336 } 337 338 const switcher = document.querySelector('[data-lang-switcher]'); 339 if (switcher) { 340 const langToggle = switcher.querySelector('[data-lang-toggle]'); 341 const langMenu = switcher.querySelector('[data-lang-menu]'); 342 const closeLang = () => { langMenu.classList.add('hidden'); langToggle.setAttribute('aria-expanded', 'false'); }; 343 const openLang = () => { langMenu.classList.remove('hidden'); langToggle.setAttribute('aria-expanded', 'true'); }; 344 langToggle.addEventListener('click', (e) => { 345 e.stopPropagation(); 346 langMenu.classList.contains('hidden') ? openLang() : closeLang(); 347 }); 348 document.addEventListener('click', (e) => { 349 if (!switcher.contains(e.target)) closeLang(); 350 }); 351 document.addEventListener('keydown', (e) => { 352 if (e.key === 'Escape') closeLang(); 353 }); 354 } 355 })(); 356</script>
356 <main> <section class="relative overflow-hidden pt-20 pb-16 sm:pt-28 sm:pb-24" data-astro-cid-bbe6dxrz> <div class="container-x" data-astro-cid-bbe6dxrz> <div class="grid items-center gap-12 lg:grid-cols-[1.1fr_0.9fr]" data-astro-cid-bbe6dxrz> <div class="reveal" data-astro-cid-bbe6dxrz> <span class="chip mb-6 border-violet-400/30 text-violet-200" data-astro-cid-bbe6dxrz> <span class="relative flex h-2 w-2" data-astro-cid-bbe6dxrz> <span class="absolute inline-flex h-full w-full animate-ping rounded-full bg-violet-400 opacity-70" data-astro-cid-bbe6dxrz></span> <span class="relative inline-flex h-2 w-2 rounded-full bg-violet-400" data-astro-cid-bbe6dxrz></span> </span> Omni 1.1 Flash · Production-ready video generation & editing </span> <h1 class="font-display text-4xl font-semibold leading-[1.05] tracking-tight text-white sm:text-5xl lg:text-6xl" data-astro-cid-bbe6dxrz> <span class="text-gradient" data-astro-cid-bbe6dxrz>Gemini Omni</span> <br data-astro-cid-bbe6dxrz> <span class="text-zinc-100" data-astro-cid-bbe6dxrz>Speak it. See it. Share it.</span> </h1> <p class="mt-6 max-w-xl text-base leading-relaxed text-zinc-400 sm:text-lg" data-astro-cid-bbe6dxrz> Gemini Omni 1.1 Flash launched August 27, 2026 â Google's production-ready update with scene extensions up to 40 seconds, first and last frame control, 360p draft mode, 4K upscaling, and video references. It replaces Veo inside the Gemini app and is available across Google Flow, YouTube Shorts, Google Vids, Google AI Studio and the Gemini Enterprise Agent Platform. </p> <div data-hero-ctas data-signed-in="false" class="group/hero mt-8 flex flex-wrap items-center gap-3" data-astro-cid-bbe6dxrz> <button type="button" data-open-login class="btn-primary group-data-[signed-in=true]/hero:hidden" data-astro-cid-bbe6dxrz> Try Gemini Omni <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true" data-astro-cid-bbe6dxrz> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M5 12h14M13 6l6 6-6 6" data-astro-cid-bbe6dxrz></path> </svg> </button> <a href="/prompt-generator/" class="btn-primary hidden group-data-[signed-in=true]/hero:inline-flex" data-astro-cid-bbe6dxrz> Open the prompt builder <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true" data-astro-cid-bbe6dxrz> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M5 12h14M13 6l6 6-6 6" data-astro-cid-bbe6dxrz></path> </svg> </a> <a href="/prompt-generator/" class="btn-ghost group-data-[signed-in=true]/hero:hidden" data-astro-cid-bbe6dxrz> Open the prompt builder </a> <span class="btn-ghost hidden cursor-default opacity-90 group-data-[signed-in=true]/hero:inline-flex" aria-disabled="true" data-astro-cid-bbe6dxrz> <svg viewBox="0 0 24 24" class="h-4 w-4 text-emerald-300" aria-hidden="true" data-astro-cid-bbe6dxrz> <path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M5 12l4.5 4.5L19 7" data-astro-cid-bbe6dxrz></path> </svg> You're on the list </span> <a href="#features" class="btn-ghost" data-astro-cid-bbe6dxrz>See the capabilities</a> <a href="/blog/" class="btn-ghost" data-astro-cid-bbe6dxrz>Articles</a> </div> <div class="mt-8 flex flex-wrap gap-2" data-astro-cid-bbe6dxrz> <span class="chip" data-astro-cid-bbe6dxrz>Unified model</span> <span class="chip" data-astro-cid-bbe6dxrz>Synced audio</span> <span class="chip" data-astro-cid-bbe6dxrz>In-chat editing</span> </div> </div> <div class="reveal relative" data-astro-cid-bbe6dxrz> <div class="relative mx-auto aspect-square w-full max-w-md" data-astro-cid-bbe6dxrz> <div class="absolute inset-0 rounded-full bg-brand-gradient opacity-20 blur-3xl" data-astro-cid-bbe6dxrz></div> <div class="absolute inset-8 rounded-full bg-brand-gradient opacity-30 blur-2xl animate-float" data-astro-cid-bbe6dxrz></div> <div class="absolute inset-0 grid place-items-center" data-astro-cid-bbe6dxrz> <div class="relative h-64 w-64 sm:h-72 sm:w-72" data-astro-cid-bbe6dxrz> <div class="absolute inset-0 rounded-full border border-white/15" data-astro-cid-bbe6dxrz></div> <div class="absolute inset-4 rounded-full border border-white/10" data-astro-cid-bbe6dxrz></div> <div class="absolute inset-10 rounded-full border border-white/10" data-astro-cid-bbe6dxrz></div> <div class="absolute inset-0 grid place-items-center" data-astro-cid-bbe6dxrz> <div class="grid h-24 w-24 place-items-center rounded-full bg-ink-900/80 backdrop-blur ring-1 ring-white/10 shadow-glow" data-astro-cid-bbe6dxrz> <span class="font-display text-2xl font-semibold text-gradient" data-astro-cid-bbe6dxrz>Omni</span> </div> </div> <div class="orbit-tag absolute left-1/2 top-0 -translate-x-1/2 -translate-y-1/2 chip border-violet-400/30 text-violet-200" data-astro-cid-bbe6dxrz> 357Text 358</div> <div class="orbit-tag absolute right-0 top-1/2 translate-x-1/2 -translate-y-1/2 chip border-cyan-400/30 text-cyan-200" data-astro-cid-bbe6dxrz> 359Image 360</div> <div class="orbit-tag absolute left-1/2 bottom-0 -translate-x-1/2 translate-y-1/2 chip border-indigo-400/30 text-indigo-200" data-astro-cid-bbe6dxrz> 361Video 362</div> <div class="orbit-tag absolute left-0 top-1/2 -translate-x-1/2 -translate-y-1/2 chip border-fuchsia-400/30 text-fuchsia-200" data-astro-cid-bbe6dxrz> 363Audio 364</div> </div> </div> </div> </div> </div> </div> </section>
364<script> 365 (() => { 366 if (typeof window === 'undefined') return; 367 const root = document.querySelector('[data-hero-ctas]'); 368 if (!root) return; 369 const AUTH_TOKEN_KEY = 'auth_token'; 370 const AUTH_CHANGED_EVENT = 'gemini-omni:auth-changed'; 371 const sync = () => { 372 let token = null; 373 try { 374 token = window.localStorage.getItem(AUTH_TOKEN_KEY); 375 } catch {} 376 root.setAttribute('data-signed-in', token ? 'true' : 'false'); 377 }; 378 window.addEventListener(AUTH_CHANGED_EVENT, sync); 379 sync(); 380 })(); 381</script>
381 <section class="py-8 sm:py-12" aria-labelledby="highlights-title"> <div class="container-x"> <h2 id="highlights-title" class="sr-only">Quick stats</h2> <div class="reveal grid gap-3 sm:grid-cols-2 lg:grid-cols-4"> <div class="card flex flex-col gap-1.5"> <span class="font-display text-3xl font-semibold tracking-tight text-gradient sm:text-4xl"> 10s · up to 40s </span> <span class="text-sm font-medium text-zinc-400">Clip length</span> </div><div class="card flex flex-col gap-1.5"> <span class="font-display text-3xl font-semibold tracking-tight text-gradient sm:text-4xl"> 4K </span> <span class="text-sm font-medium text-zinc-400">Max output</span> </div><div class="card flex flex-col gap-1.5"> <span class="font-display text-3xl font-semibold tracking-tight text-gradient sm:text-4xl"> 16:9 · 9:16 · 1:1 </span> <span class="text-sm font-medium text-zinc-400">Aspect ratios</span> </div><div class="card flex flex-col gap-1.5"> <span class="font-display text-3xl font-semibold tracking-tight text-gradient sm:text-4xl"> Aug 2026 </span> <span class="text-sm font-medium text-zinc-400">Latest release</span> </div> </div> </div> </section> <section id="showcase" class="py-20 sm:py-28" aria-labelledby="showcase-title"> <div class="container-x"> <div class="reveal max-w-3xl"> <span class="section-eyebrow">Official demos</span> <h2 id="showcase-title" class="section-title">See what Gemini Omni actually outputs</h2> <p class="section-desc">Every clip below is embedded straight from Google's official Gemini Omni product page: text-to-video, image-to-video, style transfer, chat editing, video-to-video and the AI avatar â the full capability surface.</p> <p class="mt-3 text-xs text-zinc-500">All demo videos are © Google, used here for informational aggregation; streamed directly from storage.googleapis.com/gweb-gemini-cdn.</p> </div> <figure class="reveal mt-12 overflow-hidden rounded-3xl border border-white/10 bg-white/[0.03] shadow-glow"> <div class="aspect-video w-full bg-black"> <video class="h-full w-full object-cover" src="https://storage.googleapis.com/gweb-gemini-cdn/gemini/uploads/1f9fd2cb30c7d122190623587be5b7a3e3ce57c1.mp4" autoplay loop muted playsinline preload="metadata" controls aria-label="Speak it. See it. Share it."></video> </div> <figcaption class="flex flex-col gap-1 border-t border-white/10 px-5 py-4 sm:flex-row sm:items-center sm:justify-between"> <div> <h3 class="font-display text-base font-semibold text-zinc-50">Speak it. See it. Share it.</h3> <p class="text-sm text-zinc-400">Gemini Omni's main hero reel: create, remix and edit videos through conversation.</p> </div> <a href="https://gemini.google/overview/video-generation/" target="_blank" rel="noopener" class="chip border-violet-400/30 text-violet-200 transition-colors hover:border-violet-300/60"> View the official page <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </a> </figcaption> </figure> <div class="reveal mt-6 grid gap-4 sm:grid-cols-2 lg:grid-cols-3"> <figure class="group overflow-hidden rounded-2xl border border-white/10 bg-white/[0.03] transition-all duration-300 hover:border-violet-400/40 hover:shadow-glow"> <div class="relative aspect-video w-full overflow-hidden bg-black"> <video class="h-full w-full object-cover" src="https://storage.googleapis.com/gweb-gemini-cdn/gemini/uploads/bf4a94fc524fb19019b69904a039d3f41da54d50.mp4" loop muted playsinline preload="none" controls aria-label="Step into the story"></video> <span class="pointer-events-none absolute left-3 top-3 chip border-white/20 bg-black/55 text-[10px] uppercase tracking-[0.16em] text-zinc-100 backdrop-blur"> Text â video </span> </div> <figcaption class="flex flex-col gap-1 border-t border-white/10 px-4 py-3"> <h3 class="font-display text-sm font-semibold text-zinc-50">Step into the story</h3> <p class="text-xs leading-relaxed text-zinc-400">A single text prompt produces a multi-shot clip with cohesive environment and camera language.</p> </figcaption> </figure><figure class="group overflow-hidden rounded-2xl border border-white/10 bg-white/[0.03] transition-all duration-300 hover:border-violet-400/40 hover:shadow-glow"> <div class="relative aspect-video w-full overflow-hidden bg-black"> <video class="h-full w-full object-cover" src="https://storage.googleapis.com/gweb-gemini-cdn/gemini/uploads/93742adbdb2db0609cecdc306526c1bb0de2c712.mp4" loop muted playsinline preload="none" controls aria-label="Bring photos to life"></video> <span class="pointer-events-none absolute left-3 top-3 chip border-white/20 bg-black/55 text-[10px] uppercase tracking-[0.16em] text-zinc-100 backdrop-blur"> Image â video </span> </div> <figcaption class="flex flex-col gap-1 border-t border-white/10 px-4 py-3"> <h3 class="font-display text-sm font-semibold text-zinc-50">Bring photos to life</h3> <p class="text-xs leading-relaxed text-zinc-400">Upload reference images and Omni drives the motion, filling in the timeline automatically.</p> </figcaption> </figure><figure class="group overflow-hidden rounded-2xl border border-white/10 bg-white/[0.03] transition-all duration-300 hover:border-violet-400/40 hover:shadow-glow"> <div class="relative aspect-video w-full overflow-hidden bg-black"> <video class="h-full w-full object-cover" src="https://storage.googleapis.com/gweb-gemini-cdn/gemini/uploads/35e529bc0795a3e8a08eabd3aca7b69c116526b4.mp4" loop muted playsinline preload="none" controls aria-label="Keep the soul of the shot"></video> <span class="pointer-events-none absolute left-3 top-3 chip border-white/20 bg-black/55 text-[10px] uppercase tracking-[0.16em] text-zinc-100 backdrop-blur"> Style · template </span> </div> <figcaption class="flex flex-col gap-1 border-t border-white/10 px-4 py-3"> <h3 class="font-display text-sm font-semibold text-zinc-50">Keep the soul of the shot</h3> <p class="text-xs leading-relaxed text-zinc-400">Swap backgrounds, change the wardrobe or transfer styles â your subject keeps its details.</p> </figcaption> </figure><figure class="group overflow-hidden rounded-2xl border border-white/10 bg-white/[0.03] transition-all duration-300 hover:border-violet-400/40 hover:shadow-glow"> <div class="relative aspect-video w-full overflow-hidden bg-black"> <video class="h-full w-full object-cover" src="https://storage.googleapis.com/gweb-gemini-cdn/gemini/uploads/c474731c2a15d74ac9ed3c3ee3702e0cd3d849ad.mp4" loop muted playsinline preload="none" controls aria-label="Remix an existing clip"></video> <span class="pointer-events-none absolute left-3 top-3 chip border-white/20 bg-black/55 text-[10px] uppercase tracking-[0.16em] text-zinc-100 backdrop-blur"> Video â video </span> </div> <figcaption class="flex flex-col gap-1 border-t border-white/10 px-4 py-3"> <h3 class="font-display text-sm font-semibold text-zinc-50">Remix an existing clip</h3> <p class="text-xs leading-relaxed text-zinc-400">Re-cast an existing piece of footage in a new style â lighting, lens or even material rewritten by prompt.</p> </figcaption> </figure><figure class="group overflow-hidden rounded-2xl border border-white/10 bg-white/[0.03] transition-all duration-300 hover:border-violet-400/40 hover:shadow-glow"> <div class="relative aspect-video w-full overflow-hidden bg-black"> <video class="h-full w-full object-cover" src="https://storage.googleapis.com/gweb-gemini-cdn/gemini/uploads/2a4a531c10b8aa4c5bf7ed5dc5503b6b64047775.mp4" loop muted playsinline preload="none" controls aria-label="Easy editing"></video> <span class="pointer-events-none absolute left-3 top-3 chip border-white/20 bg-black/55 text-[10px] uppercase tracking-[0.16em] text-zinc-100 backdrop-blur"> Chat editing </span> </div> <figcaption class="flex flex-col gap-1 border-t border-white/10 px-4 py-3"> <h3 class="font-display text-sm font-semibold text-zinc-50">Easy editing</h3> <p class="text-xs leading-relaxed text-zinc-400">Re-cast characters, adjust lighting, stabilise shots â all by chatting, no regeneration needed.</p> </figcaption> </figure><figure class="group overflow-hidden rounded-2xl border border-white/10 bg-white/[0.03] transition-all duration-300 hover:border-violet-400/40 hover:shadow-glow"> <div class="relative aspect-video w-full overflow-hidden bg-black"> <video class="h-full w-full object-cover" src="https://storage.googleapis.com/gweb-gemini-cdn/gemini/uploads/a9a1bbc770e3617245ca5feb3cc3328ce2e81760.mp4" loop muted playsinline preload="none" controls aria-label="Be the star of your own show"></video> <span class="pointer-events-none absolute left-3 top-3 chip border-white/20 bg-black/55 text-[10px] uppercase tracking-[0.16em] text-zinc-100 backdrop-blur"> AI avatar </span> </div> <figcaption class="flex flex-col gap-1 border-t border-white/10 px-4 py-3"> <h3 class="font-display text-sm font-semibold text-zinc-50">Be the star of your own show</h3> <p class="text-xs leading-relaxed text-zinc-400">Set up an AI avatar once, then star in every future video without re-uploading photos.</p> </figcaption> </figure> </div> </div> </section>
381<script type="module">if(typeof window<"u"&&"IntersectionObserver"in window){const i=document.querySelectorAll('#showcase video[preload="none"]'),n=new IntersectionObserver(o=>{o.forEach(t=>{const e=t.target;t.isIntersecting?(e.preload="metadata",e.paused&&e.play().catch(()=>{})):e.paused||e.pause()})},{rootMargin:"0px",threshold:.35});i.forEach(o=>n.observe(o))}</script>
381 <section id="features" class="py-20 sm:py-28"> <div class="container-x"> <div class="reveal max-w-3xl"> <span class="section-eyebrow">Capabilities</span> <h2 class="section-title">The whole pipeline collapses into one model</h2> <p class="section-desc">Unlike specialised video models such as Veo, Sora 2, Seedance 2.0 or Kling, Gemini Omni keeps language reasoning, image generation, video generation and audio synthesis under one architecture.</p> </div> <div class="mt-12 grid gap-4 sm:grid-cols-2 lg:grid-cols-3"> <article class="reveal card group flex flex-col gap-4"> <span class="grid h-10 w-10 place-items-center rounded-xl border border-white/10 bg-white/[0.04] text-violet-300 transition-colors group-hover:border-violet-400/40 group-hover:text-violet-200"> <svg viewBox="0 0 24 24" class="h-5 w-5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M3 12a9 9 0 1 1 18 0a9 9 0 0 1-18 0Zm9-6v12M6 12h12"></path> </svg> </span> <div> <h3 class="font-display text-lg font-semibold text-zinc-50">Native multimodal output</h3> <p class="mt-2 text-sm leading-relaxed text-zinc-400">A single prompt produces matching text, keyframes and video, with consistent characters, style and lighting carrying across formats.</p> </div> </article><article class="reveal card group flex flex-col gap-4"> <span class="grid h-10 w-10 place-items-center rounded-xl border border-white/10 bg-white/[0.04] text-violet-300 transition-colors group-hover:border-violet-400/40 group-hover:text-violet-200"> <svg viewBox="0 0 24 24" class="h-5 w-5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M4 7h16v10H4zM8 7V4h8v3M8 17v3h8v-3"></path> </svg> </span> <div> <h3 class="font-display text-lg font-semibold text-zinc-50">One unified Gemini stack</h3> <p class="mt-2 text-sm leading-relaxed text-zinc-400">No more chaining of specialised models. Text, image, video and audio share the same weights and the same long context.</p> </div> </article><article class="reveal card group flex flex-col gap-4"> <span class="grid h-10 w-10 place-items-center rounded-xl border border-white/10 bg-white/[0.04] text-violet-300 transition-colors group-hover:border-violet-400/40 group-hover:text-violet-200"> <svg viewBox="0 0 24 24" class="h-5 w-5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M4 9h3l5-4v14l-5-4H4zM16 8a5 5 0 0 1 0 8M19 5a9 9 0 0 1 0 14"></path> </svg> </span> <div> <h3 class="font-display text-lg font-semibold text-zinc-50">Synced native audio</h3> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Ambient sound, score and dialogue are aligned with the picture in the same forward pass â footsteps land on the beat, lips match speech on first export.</p> </div> </article><article class="reveal card group flex flex-col gap-4"> <span class="grid h-10 w-10 place-items-center rounded-xl border border-white/10 bg-white/[0.04] text-violet-300 transition-colors group-hover:border-violet-400/40 group-hover:text-violet-200"> <svg viewBox="0 0 24 24" class="h-5 w-5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M4 5h13l3 3v11H4zM9 13l2 2 5-5"></path> </svg> </span> <div> <h3 class="font-display text-lg font-semibold text-zinc-50">Direct in-chat editing</h3> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Swap an object, change the lighting, adjust a camera move in natural language â no full regeneration, echoing the Nano Banana editing playbook.</p> </div> </article><article class="reveal card group flex flex-col gap-4"> <span class="grid h-10 w-10 place-items-center rounded-xl border border-white/10 bg-white/[0.04] text-violet-300 transition-colors group-hover:border-violet-400/40 group-hover:text-violet-200"> <svg viewBox="0 0 24 24" class="h-5 w-5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M4 12a8 8 0 0 1 14-5l2-2M20 12a8 8 0 0 1-14 5l-2 2M16 5h4v4M8 19H4v-4"></path> </svg> </span> <div> <h3 class="font-display text-lg font-semibold text-zinc-50">Remix and steer</h3> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Upload an existing clip and redirect it with prompts. Reference images, videos and audio can be combined in a single instruction.</p> </div> </article><article class="reveal card group flex flex-col gap-4"> <span class="grid h-10 w-10 place-items-center rounded-xl border border-white/10 bg-white/[0.04] text-violet-300 transition-colors group-hover:border-violet-400/40 group-hover:text-violet-200"> <svg viewBox="0 0 24 24" class="h-5 w-5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M4 5h7v7H4zM13 5h7v4h-7zM13 11h7v9h-7zM4 14h7v6H4z"></path> </svg> </span> <div> <h3 class="font-display text-lg font-semibold text-zinc-50">Templates & styles</h3> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Built-in templates for product ads, Reels, music videos and cinematic shorts lower the floor for first-time users while keeping camera language consistent.</p> </div> </article> </div> </div> </section> <section id="specs" class="py-20 sm:py-28"> <div class="container-x"> <div class="reveal max-w-3xl"> <span class="section-eyebrow">Specs</span> <h2 class="section-title">Official Omni 1.1 Flash specs</h2> <p class="section-desc">Figures below follow Google's August 27, 2026 production launch of gemini-omni-1.1-flash. Available via Google AI Studio and Gemini Enterprise Agent Platform.</p> </div> <div class="reveal mt-12 overflow-hidden rounded-2xl border border-white/10 bg-white/[0.02] backdrop-blur-sm"> <table class="w-full text-left text-sm"> <thead class="bg-white/[0.04] text-xs uppercase tracking-[0.16em] text-zinc-400"> <tr> <th class="w-1/3 px-5 py-4 font-semibold">Dimension</th> <th class="px-5 py-4 font-semibold">Known signal</th> </tr> </thead> <tbody class="divide-y divide-white/5"> <tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 font-medium text-zinc-200 align-top">Model family</td> <td class="px-5 py-4 text-zinc-300 align-top "> Google Gemini Omni â 1.1 Flash is the production-ready release </td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 font-medium text-zinc-200 align-top">Model ID</td> <td class="px-5 py-4 text-zinc-300 align-top font-mono text-[13px]"> gemini-omni-1.1-flash </td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 font-medium text-zinc-200 align-top">Clip length</td> <td class="px-5 py-4 text-zinc-300 align-top "> Up to 10 seconds per generation · up to 40 seconds with scene extensions (10-second increments) </td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 font-medium text-zinc-200 align-top">Resolution</td> <td class="px-5 py-4 text-zinc-300 align-top "> 360p draft · 720p standard · 1080p · 4K upscale </td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 font-medium text-zinc-200 align-top">Aspect ratios</td> <td class="px-5 py-4 text-zinc-300 align-top "> 16:9, 9:16, 1:1 </td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 font-medium text-zinc-200 align-top">Audio</td> <td class="px-5 py-4 text-zinc-300 align-top "> Native synced audio on output · API audio references not supported yet </td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 font-medium text-zinc-200 align-top">Inputs</td> <td class="px-5 py-4 text-zinc-300 align-top "> Text / image / video (API audio reference not yet supported) </td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 font-medium text-zinc-200 align-top">Access</td> <td class="px-5 py-4 text-zinc-300 align-top "> Gemini app, Google Flow, YouTube Shorts/Create, Google Vids · developers via Gemini API, Google AI Studio and Gemini Enterprise Agent Platform </td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 font-medium text-zinc-200 align-top">API pricing</td> <td class="px-5 py-4 text-zinc-300 align-top "> $0.10 per second of video output (same as Veo 3.1 Fast) </td> </tr> </tbody> </table> </div> </div> </section> <section id="architecture" class="py-20 sm:py-28"> <div class="container-x"> <div class="reveal max-w-3xl"> <span class="section-eyebrow">Architecture</span> <h2 class="section-title">Three product lines collapse into one Omni</h2> <p class="section-desc">Google's generative stack used to be split across Veo for video, Nano Banana / Imagen for image and Gemini for text. Omni rolls those into a single architecture.</p> </div> <div class="reveal mt-12 grid items-center gap-8 lg:grid-cols-[1fr_auto_1fr]"> <div> <p class="mb-4 text-xs font-semibold uppercase tracking-[0.18em] text-zinc-500">Before</p> <div class="space-y-3"> <div class="rounded-2xl border bg-gradient-to-br from-indigo-500/15 to-indigo-500/5 text-indigo-200 border-indigo-400/30 px-5 py-4 backdrop-blur"> <p class="font-display text-base font-semibold">Veo 3.1</p> <p class="mt-1 text-sm opacity-80">Video + native audio</p> </div><div class="rounded-2xl border bg-gradient-to-br from-fuchsia-500/15 to-fuchsia-500/5 text-fuchsia-200 border-fuchsia-400/30 px-5 py-4 backdrop-blur"> <p class="font-display text-base font-semibold">Nano Banana / Imagen</p> <p class="mt-1 text-sm opacity-80">Image generation & editing</p> </div><div class="rounded-2xl border bg-gradient-to-br from-cyan-500/15 to-cyan-500/5 text-cyan-200 border-cyan-400/30 px-5 py-4 backdrop-blur"> <p class="font-display text-base font-semibold">Gemini 2.5 / 3.x</p> <p class="mt-1 text-sm opacity-80">Reasoning · long context</p> </div> </div> </div> <div class="flex justify-center lg:flex-col lg:gap-2"> <div class="hidden lg:flex flex-col items-center gap-1 text-zinc-500"> <span class="h-12 w-px bg-gradient-to-b from-transparent via-white/30 to-transparent"></span> <svg viewBox="0 0 24 24" class="h-5 w-5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" d="M12 5v14M6 13l6 6 6-6"></path> </svg> <span class="h-12 w-px bg-gradient-to-b from-transparent via-white/30 to-transparent"></span> </div> <div class="flex lg:hidden items-center gap-1 text-zinc-500"> <span class="h-px w-12 bg-gradient-to-r from-transparent via-white/30 to-transparent"></span> <svg viewBox="0 0 24 24" class="h-5 w-5 rotate-90" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" d="M12 5v14M6 13l6 6 6-6"></path> </svg> <span class="h-px w-12 bg-gradient-to-r from-transparent via-white/30 to-transparent"></span> </div> </div> <div> <p class="mb-4 text-xs font-semibold uppercase tracking-[0.18em] text-violet-300">Now · Omni</p> <div class="relative overflow-hidden rounded-2xl border border-violet-400/30 bg-gradient-to-br from-violet-500/20 via-indigo-500/10 to-cyan-400/10 p-6 backdrop-blur"> <div class="absolute -right-12 -top-12 h-48 w-48 rounded-full bg-violet-500/30 blur-3xl"></div> <div class="relative"> <p class="font-display text-2xl font-semibold text-white">Gemini Omni</p> <p class="mt-2 text-sm leading-relaxed text-zinc-200/90">Text · image · video · audio, one model, one prompt</p> <div class="mt-5 flex flex-wrap gap-2"> <span class="chip border-violet-400/30 text-violet-100">Text</span> <span class="chip border-cyan-400/30 text-cyan-100">Image</span> <span class="chip border-indigo-400/30 text-indigo-100">Video</span> <span class="chip border-fuchsia-400/30 text-fuchsia-100">Audio</span> </div> </div> </div> </div> </div> </div> </section> <section id="cases" class="py-20 sm:py-28"> <div class="container-x"> <div class="reveal max-w-3xl"> <span class="section-eyebrow">Use cases</span> <h2 class="section-title">From a single brief to publishable content</h2> <p class="section-desc">A unified model with long context and synced audio means teams can write one coherent brief and walk away with a finished cut.</p> </div> <div class="mt-12 grid gap-4 sm:grid-cols-2 lg:grid-cols-3"> <article class="reveal card group relative overflow-hidden"> <div class="absolute right-0 top-0 h-24 w-24 -translate-y-8 translate-x-8 rounded-full bg-violet-500/10 blur-2xl transition-opacity group-hover:opacity-100"></div> <div class="relative flex items-start gap-4"> <span class="grid h-9 w-9 shrink-0 place-items-center rounded-lg border border-white/10 bg-white/[0.04] text-cyan-300"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M3 7h18M3 12h12M3 17h18"></path> </svg> </span> <div> <div class="flex items-center gap-2"> <span class="font-mono text-xs text-zinc-500">01</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Product ads</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Hero shots, packaging reveals and lifestyle cuts shipped with ambient audio already locked.</p> </div> </div> </article><article class="reveal card group relative overflow-hidden"> <div class="absolute right-0 top-0 h-24 w-24 -translate-y-8 translate-x-8 rounded-full bg-violet-500/10 blur-2xl transition-opacity group-hover:opacity-100"></div> <div class="relative flex items-start gap-4"> <span class="grid h-9 w-9 shrink-0 place-items-center rounded-lg border border-white/10 bg-white/[0.04] text-cyan-300"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M7 3h10v18H7zM10 7h4"></path> </svg> </span> <div> <div class="flex items-center gap-2"> <span class="font-mono text-xs text-zinc-500">02</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Reels & Shorts</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Vertical 9:16 clips with on-mic dialogue and beat-synced motion, built for scroll-stopping social.</p> </div> </div> </article><article class="reveal card group relative overflow-hidden"> <div class="absolute right-0 top-0 h-24 w-24 -translate-y-8 translate-x-8 rounded-full bg-violet-500/10 blur-2xl transition-opacity group-hover:opacity-100"></div> <div class="relative flex items-start gap-4"> <span class="grid h-9 w-9 shrink-0 place-items-center rounded-lg border border-white/10 bg-white/[0.04] text-cyan-300"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M9 19V6l11-2v13M9 14a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm11 0a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z"></path> </svg> </span> <div> <div class="flex items-center gap-2"> <span class="font-mono text-xs text-zinc-500">03</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Music videos</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Reference a track and Omni cuts visuals to the beat, keeping a consistent character across shots.</p> </div> </div> </article><article class="reveal card group relative overflow-hidden"> <div class="absolute right-0 top-0 h-24 w-24 -translate-y-8 translate-x-8 rounded-full bg-violet-500/10 blur-2xl transition-opacity group-hover:opacity-100"></div> <div class="relative flex items-start gap-4"> <span class="grid h-9 w-9 shrink-0 place-items-center rounded-lg border border-white/10 bg-white/[0.04] text-cyan-300"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M3 6h18v12H3zM7 3v3M17 3v3M7 21v-3M17 21v-3"></path> </svg> </span> <div> <div class="flex items-center gap-2"> <span class="font-mono text-xs text-zinc-500">04</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Cinematic shorts</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Chain multiple 10-second omni-clips into multi-shot sequences with continuous lighting and audio bed.</p> </div> </div> </article><article class="revea
381l card group relative overflow-hidden"> <div class="absolute right-0 top-0 h-24 w-24 -translate-y-8 translate-x-8 rounded-full bg-violet-500/10 blur-2xl transition-opacity group-hover:opacity-100"></div> <div class="relative flex items-start gap-4"> <span class="grid h-9 w-9 shrink-0 place-items-center rounded-lg border border-white/10 bg-white/[0.04] text-cyan-300"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M4 6h16v12H4zM9 12l4 3-4 3z"></path> </svg> </span> <div> <div class="flex items-center gap-2"> <span class="font-mono text-xs text-zinc-500">05</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Landing-page hero loops</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Loopable 16:9 atmospheric clips for SaaS, fashion and DTC sites â branded and silent-friendly.</p> </div> </div> </article><article class="reveal card group relative overflow-hidden"> <div class="absolute right-0 top-0 h-24 w-24 -translate-y-8 translate-x-8 rounded-full bg-violet-500/10 blur-2xl transition-opacity group-hover:opacity-100"></div> <div class="relative flex items-start gap-4"> <span class="grid h-9 w-9 shrink-0 place-items-center rounded-lg border border-white/10 bg-white/[0.04] text-cyan-300"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M4 5h16v10H4zM8 19h8M12 15v4"></path> </svg> </span> <div> <div class="flex items-center gap-2"> <span class="font-mono text-xs text-zinc-500">06</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Explainers & tutorials</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Turn a script into a narrated sequence with lip-synced dialogue and matching ambient sound.</p> </div> </div> </article> </div> </div> </section> <section id="comparison" class="py-20 sm:py-28"> <div class="container-x"> <div class="reveal max-w-3xl"> <span class="section-eyebrow">Compare</span> <h2 class="section-title">Where Omni sits in the 2026 video stack</h2> <p class="section-desc">Aggregated from Artificial Analysis, Looksy AI, Oimi AI and the official keynotes â for orientation, not benchmark scores.</p> </div> <div class="reveal mt-12 overflow-x-auto rounded-2xl border border-white/10 bg-white/[0.02] backdrop-blur-sm"> <table class="w-full min-w-[720px] text-left text-sm"> <thead class="bg-white/[0.04] text-xs uppercase tracking-[0.16em] text-zinc-400"> <tr> <th class="px-5 py-4 font-semibold">Model</th> <th class="px-5 py-4 font-semibold">Maker</th> <th class="px-5 py-4 font-semibold">Architecture</th> <th class="px-5 py-4 font-semibold">Native audio</th> <th class="px-5 py-4 font-semibold">Clip length</th> </tr> </thead> <tbody class="divide-y divide-white/5"> <tr class="transition-colors bg-gradient-to-r from-violet-500/10 to-cyan-400/5 hover:from-violet-500/15"> <td class="px-5 py-4 align-top"> <div class="flex items-center gap-2"> <span class="font-display font-semibold text-white">Gemini Omni</span> <span class="rounded-full border border-violet-400/40 bg-violet-500/20 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wider text-violet-100"> 382Omni 383</span> </div> </td> <td class="px-5 py-4 align-top text-zinc-400">Google</td> <td class="px-5 py-4 align-top text-zinc-300">Unified omni (video + image + audio)</td> <td class="px-5 py-4 align-top text-zinc-300">Synced in one pass</td> <td class="px-5 py-4 align-top text-zinc-300">10s · up to 40s</td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 align-top"> <div class="flex items-center gap-2"> <span class="font-display font-semibold text-zinc-100">Veo 3.1</span> </div> </td> <td class="px-5 py-4 align-top text-zinc-400">Google</td> <td class="px-5 py-4 align-top text-zinc-300">Specialised video model</td> <td class="px-5 py-4 align-top text-zinc-300">Yes</td> <td class="px-5 py-4 align-top text-zinc-300">~8s</td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 align-top"> <div class="flex items-center gap-2"> <span class="font-display font-semibold text-zinc-100">Seedance 2.0</span> </div> </td> <td class="px-5 py-4 align-top text-zinc-400">ByteDance</td> <td class="px-5 py-4 align-top text-zinc-300">Specialised multi-modal video</td> <td class="px-5 py-4 align-top text-zinc-300">Yes</td> <td class="px-5 py-4 align-top text-zinc-300">up to 15s / shot</td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 align-top"> <div class="flex items-center gap-2"> <span class="font-display font-semibold text-zinc-100">Sora 2</span> </div> </td> <td class="px-5 py-4 align-top text-zinc-400">OpenAI</td> <td class="px-5 py-4 align-top text-zinc-300">Specialised video model</td> <td class="px-5 py-4 align-top text-zinc-300">Yes</td> <td class="px-5 py-4 align-top text-zinc-300">~20s</td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 align-top"> <div class="flex items-center gap-2"> <span class="font-display font-semibold text-zinc-100">Kling V3.0</span> </div> </td> <td class="px-5 py-4 align-top text-zinc-400">Kuaishou</td> <td class="px-5 py-4 align-top text-zinc-300">Specialised video model</td> <td class="px-5 py-4 align-top text-zinc-300">Limited</td> <td class="px-5 py-4 align-top text-zinc-300">~10s</td> </tr> </tbody> </table> </div> </div> </section> <section id="free" class="py-20 sm:py-28"> <div class="container-x"> <div class="reveal max-w-3xl"> <span class="section-eyebrow">Free access</span> <h2 class="section-title">Is Gemini Omni free? How to use it for free in 2026</h2> <p class="section-desc">Gemini Omni Flash is free on Google Flow's free tier, YouTube Shorts and the YouTube Create app. The standalone Gemini app needs Google AI Plus, Pro or Ultra. Open the official surfaces below.</p> </div> <div class="reveal mt-12 grid gap-4 sm:grid-cols-2"> <a href="https://labs.google/fx/tools/flow" target="_blank" rel="noopener" class="card group flex flex-col gap-3 border-emerald-400/30 hover:border-emerald-400/50"> <div class="flex items-center justify-between gap-3"> <span class="font-mono text-xs uppercase tracking-[0.16em] text-zinc-500">labs.google</span> <span class="chip text-[10px] uppercase tracking-wider border-emerald-400/40 bg-emerald-500/10 text-emerald-200"> Free </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">Google Flow · Free tier + plans</h3> <p class="text-sm leading-relaxed text-zinc-400">Google's AI filmmaking studio. The free tier includes Gemini Omni Flash with usage limits; upgrade to Plus / Pro / Ultra for higher limits and pro tools.</p> <span class="mt-auto inline-flex items-center gap-1 text-xs font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Open <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </a><a href="https://www.youtube.com/shorts" target="_blank" rel="noopener" class="card group flex flex-col gap-3 border-emerald-400/30 hover:border-emerald-400/50"> <div class="flex items-center justify-between gap-3"> <span class="font-mono text-xs uppercase tracking-[0.16em] text-zinc-500">youtube.com</span> <span class="chip text-[10px] uppercase tracking-wider border-emerald-400/40 bg-emerald-500/10 text-emerald-200"> Free </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">YouTube Shorts · Free Gemini Omni</h3> <p class="text-sm leading-relaxed text-zinc-400">Generate Gemini Omni Flash clips inside Shorts at no cost. The cheapest official way to try Omni for free.</p> <span class="mt-auto inline-flex items-center gap-1 text-xs font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Open <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </a><a href="https://www.youtube.com/create" target="_blank" rel="noopener" class="card group flex flex-col gap-3 border-emerald-400/30 hover:border-emerald-400/50"> <div class="flex items-center justify-between gap-3"> <span class="font-mono text-xs uppercase tracking-[0.16em] text-zinc-500">youtube.com</span> <span class="chip text-[10px] uppercase tracking-wider border-emerald-400/40 bg-emerald-500/10 text-emerald-200"> Free </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">YouTube Create App · Free mobile editor</h3> <p class="text-sm leading-relaxed text-zinc-400">Mobile-first editor with Gemini Omni Flash built in. No AI subscription required.</p> <span class="mt-auto inline-flex items-center gap-1 text-xs font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Open <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </a><a href="https://gemini.google.com/" target="_blank" rel="noopener" class="card group flex flex-col gap-3 "> <div class="flex items-center justify-between gap-3"> <span class="font-mono text-xs uppercase tracking-[0.16em] text-zinc-500">gemini.google.com</span> <span class="chip text-[10px] uppercase tracking-wider border-amber-400/30 bg-amber-500/10 text-amber-200"> Paid plan </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">Gemini app · Plus / Pro / Ultra</h3> <p class="text-sm leading-relaxed text-zinc-400">Use Omni inside the official Gemini app. Requires a Google AI Plus, Pro or Ultra plan.</p> <span class="mt-auto inline-flex items-center gap-1 text-xs font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Open <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </a> </div>
383 <div class="reveal mt-10 grid gap-4 rounded-3xl border border-white/10 bg-white/[0.03] p-7 backdrop-blur-sm sm:grid-cols-[1.4fr_1fr] sm:items-center"> <div> <h3 class="font-display text-lg font-semibold text-white">How to generate Gemini Omni videos for free</h3> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Fastest free path: sign in to YouTube Shorts or the YouTube Create app, pick a template and prompt with the same multi-shot hooks the Gemini app uses.</p> <ul class="mt-4 grid gap-2 text-sm text-zinc-300"> <li class="flex items-start gap-2"> <svg viewBox="0 0 24 24" class="mt-0.5 h-4 w-4 shrink-0 text-emerald-300" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M5 12l4.5 4.5L19 7"></path> </svg> <span>Draft for free in YouTube Shorts to lock camera language and pacing.</span> </li> <li class="flex items-start gap-2"> <svg viewBox="0 0 24 24" class="mt-0.5 h-4 w-4 shrink-0 text-emerald-300" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M5 12l4.5 4.5L19 7"></path> </svg> <span>Move to a Google AI Plus or Pro plan only when you need brand-grade output.</span> </li> <li class="flex items-start gap-2"> <svg viewBox="0 0 24 24" class="mt-0.5 h-4 w-4 shrink-0 text-emerald-300" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M5 12l4.5 4.5L19 7"></path> </svg> <span>Use in-chat editing instead of re-running to stretch every paid credit further.</span> </li> </ul> </div> <div class="flex flex-col gap-3"> <a href="/blog/is-gemini-omni-free/" class="btn-primary justify-center"> Read the free-access guide <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M5 12h14M13 6l6 6-6 6"></path> </svg> </a> <a href="/pricing/" class="btn-ghost justify-center">Compare paid plans</a> <a href="/blog/gemini-omni-pricing-plans-cost/" class="text-center text-xs text-zinc-500 underline-offset-4 hover:text-zinc-300 hover:underline"> Read the full pricing breakdown </a> <a href="/prompt-generator/" class="text-center text-xs text-zinc-500 underline-offset-4 hover:text-zinc-300 hover:underline"> Open the free prompt builder </a> </div> </div> <p class="reveal mt-6 text-center text-xs text-zinc-500">Free quotas and prices change by region and account. Always confirm on the official surfaces linked above.</p> </div> </section> <section id="timeline" class="py-20 sm:py-28"> <div class="container-x"> <div class="reveal max-w-3xl"> <span class="section-eyebrow">Timeline</span> <h2 class="section-title">From the first leak to launch â and what ships next</h2> <p class="section-desc">Ordered by public report date. Updated through the August 27, 2026 Omni 1.1 Flash production launch.</p> </div> <ol class="reveal relative mt-12 space-y-6 border-l border-white/10 pl-6 sm:pl-8"> <li class="relative"> <span class="absolute -left-[33px] sm:-left-[37px] grid h-4 w-4 place-items-center rounded-full ring-4 ring-ink-950 bg-white/20"></span> <div class="card "> <div class="flex flex-wrap items-baseline gap-3"> <span class="font-mono text-xs uppercase tracking-[0.18em] text-violet-300">2026 · 05 · 02</span> <h3 class="font-display text-lg font-semibold text-zinc-50">First "Powered by Omni" string</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">X user @Thomas16937378 spotted "Start with an idea or try a template. Powered by Omni." inside the Gemini video tab.</p> </div> </li><li class="relative"> <span class="absolute -left-[33px] sm:-left-[37px] grid h-4 w-4 place-items-center rounded-full ring-4 ring-ink-950 bg-white/20"></span> <div class="card "> <div class="flex flex-wrap items-baseline gap-3"> <span class="font-mono text-xs uppercase tracking-[0.18em] text-violet-300">2026 · 05 · 11</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Full preview card inside Gemini mobile</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">TestingCatalog and Chetaslua surfaced the "Meet our new video model" card, the full model ID and the 10-second clip cap.</p> </div> </li><li class="relative"> <span class="absolute -left-[33px] sm:-left-[37px] grid h-4 w-4 place-items-center rounded-full ring-4 ring-ink-950 bg-white/20"></span> <div class="card "> <div class="flex flex-wrap items-baseline gap-3"> <span class="font-mono text-xs uppercase tracking-[0.18em] text-violet-300">2026 · 05 · 12 â 18</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Demos circulate in the wild</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">A "professor solving trig on a chalkboard" clip showcased text coherence and physical fidelity, sparking heavy comparison with Veo 3.1.</p> </div> </li><li class="relative"> <span class="absolute -left-[33px] sm:-left-[37px] grid h-4 w-4 place-items-center rounded-full ring-4 ring-ink-950 bg-white/20"></span> <div class="card "> <div class="flex flex-wrap items-baseline gap-3"> <span class="font-mono text-xs uppercase tracking-[0.18em] text-violet-300">2026 · 05 · 19</span> <h3 class="font-display text-lg font-semibold text-zinc-50">
383Official launch at Google I/O 2026</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Gemini Omni Flash goes live globally inside the Gemini app, Google Flow, YouTube Shorts Remix and YouTube Create â 10âsecond clips, paid surfaces from $7.99/mo AI Plus and free on YouTube.</p> </div> </li><li class="relative"> <span class="absolute -left-[33px] sm:-left-[37px] grid h-4 w-4 place-items-center rounded-full ring-4 ring-ink-950 bg-white/20"></span> <div class="card "> <div class="flex flex-wrap items-baseline gap-3"> <span class="font-mono text-xs uppercase tracking-[0.18em] text-violet-300">2026 · 05 · 19 onward</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Avatars, character consistency and conversational editing</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Launch ships with a personal AI Avatar, persistent character identity across scenes, physicsâaware rendering and chatâstyle multiâturn editing â every clip carries an imperceptible SynthID watermark.</p> </div> </li><li class="relative"> <span class="absolute -left-[33px] sm:-left-[37px] grid h-4 w-4 place-items-center rounded-full ring-4 ring-ink-950 bg-white/20"></span> <div class="card "> <div class="flex flex-wrap items-baseline gap-3"> <span class="font-mono text-xs uppercase tracking-[0.18em] text-violet-300">2026 · 06 · 30</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Omni Flash API public preview for developers</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Model ID gemini-omni-flash-preview lands in Google AI Studio, the Gemini API and Gemini Enterprise Agent Platform at $0.10 per second of video output â same rate as Veo 3.1 Fast. Conversational editing and multimodal references (text, image, video) are supported; API audio references are not yet.</p> </div> </li><li class="relative"> <span class="absolute -left-[33px] sm:-left-[37px] grid h-4 w-4 place-items-center rounded-full ring-4 ring-ink-950 bg-gradient-to-br from-violet-400 to-cyan-400 shadow-glow"></span> <div class="card border-violet-400/30"> <div class="flex flex-wrap items-baseline gap-3"> <span class="font-mono text-xs uppercase tracking-[0.18em] text-violet-300">2026 · 08 · 27</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Gemini Omni 1.1 Flash production launch</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Model ID gemini-omni-1.1-flash goes production-ready via Google AI Studio and Gemini Enterprise Agent Platform. New capabilities: scene extensions up to 40 seconds, first and last frame specification, 360p draft mode (60% faster, 1/3 cost), 4K upscaling, and video references. Integrated by Adobe Firefly, Figma Weave, Runway and more.</p> </div> </li><li class="relative"> <span class="absolute -left-[33px] sm:-left-[37px] grid h-4 w-4 place-items-center rounded-full ring-4 ring-ink-950 bg-gradient-to-br from-violet-400 to-cyan-400 shadow-glow"></span> <div class="card border-violet-400/30"> <div class="flex flex-wrap items-baseline gap-3"> <span class="font-mono text-xs uppercase tracking-[0.18em] text-violet-300">On the roadmap</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Gemini Omni Pro wider rollout + image & audio outputs</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Google has announced a broader rollout of Gemini Omni Pro beyond the Ultra preview, along with image and audio output modalities beyond the current video-first launch â the full 'any input â any output' promise.</p> </div> </li> </ol> </div> </section> <section id="faq" class="py-20 sm:py-28"> <div class="container-x"> <div class="reveal max-w-3xl"> <span class="section-eyebrow">FAQ</span> <h2 class="section-title">The questions people ask most about Gemini Omni</h2> </div> <div class="reveal mt-12 grid gap-3 lg:grid-cols-2"> <details class="group rounded-2xl border border-white/10 bg-white/[0.03] p-5 backdrop-blur-sm transition-colors hover:border-violet-400/30 open:border-violet-400/40 open:bg-white/[0.05]"> <summary class="flex cursor-pointer list-none items-start justify-between gap-4 text-left"> <span class="font-display text-base font-semibold text-zinc-50">What exactly is Gemini Omni?</span> <span class="mt-1 grid h-6 w-6 shrink-0 place-items-center rounded-full border border-white/15 text-zinc-300 transition-transform group-open:rotate-45"> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M12 5v14M5 12h14"></path> </svg> </span> </summary> <p class="mt-3 text-sm leading-relaxed text-zinc-400">Gemini Omni is Google's unified multimodal family. The production model is Gemini Omni 1.1 Flash (gemini-omni-1.1-flash), which generates video with
383native synced audio from text, image and video inputs inside one architecture. It supports scene extensions up to 40 seconds, first/last frame control, 360p drafts, and 4K upscaling.</p> </details><details class="group rounded-2xl border border-white/10 bg-white/[0.03] p-5 backdrop-blur-sm transition-colors hover:border-violet-400/30 open:border-violet-400/40 open:bg-white/[0.05]"> <summary class="flex cursor-pointer list-none items-start justify-between gap-4 text-left"> <span class="font-display text-base font-semibold text-zinc-50">Is Gemini Omni free?</span> <span class="mt-1 grid h-6 w-6 shrink-0 place-items-center rounded-full border border-white/15 text-zinc-300 transition-transform group-open:rotate-45"> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M12 5v14M5 12h14"></path> </svg> </span> </summary> <p class="mt-3 text-sm leading-relaxed text-zinc-400">Partly. Gemini Omni Flash is free on Google Flow's free tier, YouTube Shorts and the YouTube Create app. Using Omni inside the standalone Gemini app requires a paid Google AI Plus, Pro or Ultra plan.</p> </details><details class="group rounded-2xl border border-white/10 bg-white/[0.03] p-5 backdrop-blur-sm transition-colors hover:border-violet-400/30 open:border-violet-400/40 open:bg-white/[0.05]"> <summary class="flex cursor-pointer list-none items-start justify-between gap-4 text-left"> <span class="font-display text-base font-semibold text-zinc-50">How much does Gemini Omni cost?</span> <span class="mt-1 grid h-6 w-6 shrink-0 place-items-center rounded-full border border-white/15 text-zinc-300 transition-transform group-open:rotate-45"> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M12 5v14M5 12h14"></path> </svg> </span> </summary> <p class="mt-3 text-sm leading-relaxed text-zinc-400">Google AI Plus starts around US$7.99 per month, AI Pro is the most common creator tier, and AI Ultra is roughly US$100 per month. Two Omni Flash generations consume about 86% of the AI Pro daily quota, so budget retries carefully. The developer API will arrive with its own pricing.</p> </details><details class="group rounded-2xl border border-white/10 bg-white/[0.03] p-5 backdrop-blur-sm transition-colors hover:border-violet-400/30 open:border-violet-400/40 open:bg-white/[0.05]"> <summary class="flex cursor-pointer list-none items-start justify-between gap-4 text-left"> <span class="font-display text-base font-semibold text-zinc-50">When will it ship?</span> <span class="mt-1 grid h-6 w-6 shrink-0 place-items-center rounded-full border border-white/15 text-zinc-300 transition-transform group-open:rotate-45"> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M12 5v14M5 12h14"></path> </svg> </span> </summary> <p class="mt-3 text-sm leading-relaxed text-zinc-400">It already shipped. Google announced Gemini Omni on the Google I/O 2026 main stage on May 19, 2026, simultaneously publishing the official product page and demo videos.</p> </details><details class="group rounded-2xl border border-white/10 bg-white/[0.03] p-5 backdrop-blur-sm transition-colors hover:border-violet-400/30 open:border-violet-400/40 open:bg-white/[0.05]"> <summary class="flex cursor-pointer list-none items-start justify-between gap-4 text-left"> <span class="font-display text-base font-semibold text-zinc-50">How does it relate to Veo 3.1?</span> <span class="mt-1 grid h-6 w-6 shrink-0 place-items-center rounded-full border border-white/15 text-zinc-300 transition-transform group-open:rotate-45"> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M12 5v14M5 12h14"></path> </svg> </span> </summary> <p class="mt-3 text-sm leading-relaxed text-zinc-400">Gemini Omni is the successor to Veo inside the Gemini app â Google explicitly says Omni "will replace Veo in the Gemini app". The video stack is now folded into the same architecture as Gemini text and image.</p> </details>
383<details class="group rounded-2xl border border-white/10 bg-white/[0.03] p-5 backdrop-blur-sm transition-colors hover:border-violet-400/30 open:border-violet-400/40 open:bg-white/[0.05]"> <summary class="flex cursor-pointer list-none items-start justify-between gap-4 text-left"> <span class="font-display text-base font-semibold text-zinc-50">Does it really generate sound?</span> <span class="mt-1 grid h-6 w-6 shrink-0 place-items-center rounded-full border border-white/15 text-zinc-300 transition-transform group-open:rotate-45"> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M12 5v14M5 12h14"></path> </svg> </span> </summary> <p class="mt-3 text-sm leading-relaxed text-zinc-400">Yes. Ambient sound, score and dialogue are produced in the same pass as the video â that's the whole reason for the 'omni' name.</p> </details><details class="group rounded-2xl border border-white/10 bg-white/[0.03] p-5 backdrop-blur-sm transition-colors hover:border-violet-400/30 open:border-violet-400/40 open:bg-white/[0.05]"> <summary class="flex cursor-pointer list-none items-start justify-between gap-4 text-left"> <span class="font-display text-base font-semibold text-zinc-50">What is the current clip-length limit?</span> <span class="mt-1 grid h-6 w-6 shrink-0 place-items-center rounded-full border border-white/15 text-zinc-300 transition-transform group-open:rotate-45"> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M12 5v14M5 12h14"></path> </svg> </span> </summary> <p class="mt-3 text-sm leading-relaxed text-zinc-400">Single clips are up to 10 seconds, with scene extensions allowing up to 40 seconds total (10-second increments). Supports native audio, up to 5 photo references, video references up to 3 seconds, and multi-turn editing. Draft in 360p or upscale to 4K.</p> </details><details class="group rounded-2xl border border-white/10 bg-white/[0.03] p-5 backdrop-blur-sm transition-colors hover:border-violet-400/30 open:border-violet-400/40 open:bg-white/[0.05]"> <summary class="flex cursor-pointer list-none items-start justify-between gap-4 text-left"> <span class="font-display text-base font-semibold text-zinc-50">How will pricing work?</span> <span class="mt-1 grid h-6 w-6 shrink-0 place-items-center rounded-full border border-white/15 text-zinc-300 transition-transform group-open:rotate-45"> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M12 5v14M5 12h14"></path> </svg> </span> </summary> <p class="mt-3 text-sm leading-relaxed text-zinc-400">Gemini Omni requires a Google AI Plus, Pro or Ultra plan and you must be 18+. Some features (avatars, video-to-video editing) may be restricted in certain countries.</p> </details><details class="group rounded-2xl border border-white/10 bg-white/[0.03] p-5 backdrop-blur-sm transition-colors hover:border-violet-400/30 open:border-violet-400/40 open:bg-white/[0.05]"> <summary class="flex cursor-pointer list-none items-start justify-between gap-4 text-left"> <span class="font-display text-base font-semibold text-zinc-50">What is the Gemini Omni AI avatar?</span> <span class="mt-1 grid h-6 w-6 shrink-0 place-items-center rounded-full border border-white/15 text-zinc-300 transition-transform group-open:rotate-45"> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M12 5v14M5 12h14"></path> </svg> </span> </summary> <p class="mt-3 text-sm leading-relaxed text-zinc-400">An optional digital version of you that lets Gemini generate videos which look and sound like you, with no need to re-upload photos each time â and only you can use your own avatar.</p> </details> </div> </div> </section> <section id="sources" class="py-20 sm:py-28"> <div class="container-x"> <div class="reveal max-w-3xl"> <span class="section-eyebrow">Sources</span> <h2 class="section-title">Primary reports and public links</h2> <p class="section-desc">Everything on this page is aggregated from the public sources below. Cross-reading is recommended.</p> </div> <div class="mt-12 grid gap-4 sm:grid-cols-2"> <a href="https://blog.google/intl/en-africa/products/explore-get-answers/gemini-omni/" target="_blank" rel="noopener" class="reveal card group flex flex-col gap-3"> <div class="flex items-center justify-between text-xs"> <span class="font-mono uppercase tracking-[0.16em] text-zinc-500">blog.google</span> <span class="inline-flex items-center gap-1 font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Read source <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">Google Blog · Introducing Gemini Omni</h3> <p class="text-sm leading-relaxed text-zinc-400">The official announcement post detailing the Omni Flash launch, capabilities, surfaces and rollout plan.</p> </a><a href="https://blog.google/innovation-and-ai/technology/ai/google-io-2026-all-our-announcements/" target="_blank" rel="noopener" class="reveal card group flex flex-col gap-3"> <div class="flex items-center justify-between text-xs"> <span class="font-mono uppercase tracking-[0.16em] text-zinc-500">blog.google</span> <span class="inline-flex items-center gap-1 font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Read source <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">Google Blog · 100 things from Google I/O 2026</h3> <p class="text-sm leading-relaxed text-zinc-400">Full I/O 2026 recap covering Gemini Omni, the new $100 AI Ultra tier and surrounding launches.</p> </a><a href="https://gemini.google/overview/video-generation/" target="_blank" rel="noopener" class="reveal card group flex flex-col gap-3"> <div class="flex items-center justify-between text-xs"> <span class="font-mono uppercase tracking-[0.16em] text-zinc-500">gemini.google</span> <span class="inline-flex items-center gap-1 font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Read source <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">Google · Official Gemini Omni page</h3> <p class="text-sm leading-relaxed text-zinc-400">
383The official launch page with demo videos, capability tour, supported plans and rollout details.</p> </a><a href="https://www.datacamp.com/blog/google-i-o-2026" target="_blank" rel="noopener" class="reveal card group flex flex-col gap-3"> <div class="flex items-center justify-between text-xs"> <span class="font-mono uppercase tracking-[0.16em] text-zinc-500">datacamp.com</span> <span class="inline-flex items-center gap-1 font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Read source <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">DataCamp · Google I/O 2026 deep dive</h3> <p class="text-sm leading-relaxed text-zinc-400">Independent analyst overview of how Omni collapses the Veo + Imagen stack into a single model and what is shipping now vs. next.</p> </a><a href="https://programminginsider.com/googles-gemini-omni-just-surfaced-heres-what-the-new-video-model-can-do/" target="_blank" rel="noopener" class="reveal card group flex flex-col gap-3"> <div class="flex items-center justify-between text-xs"> <span class="font-mono uppercase tracking-[0.16em] text-zinc-500">programminginsider.com</span> <span class="inline-flex items-center gap-1 font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Read source <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">TestingCatalog · Programming Insider report</h3> <p class="text-sm leading-relaxed text-zinc-400">Leak details, UI strings and early demo analysis.</p> </a><a href="https://officechai.com/ai/gemini-omni/" target="_blank" rel="noopener" class="reveal card group flex flex-col gap-3"> <div class="flex items-center justify-between text-xs"> <span class="font-mono uppercase tracking-[0.16em] text-zinc-500">officechai.com</span> <span class="inline-flex items-center gap-1 font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Read source <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">OfficeChai · Gemini Omni Spotted</h3> <p class="text-sm leading-relaxed text-zinc-400">Full model ID, in-app prompts and community reactions.</p> </a><a href="https://looksyai.in/features/gemini-omni" target="_blank" rel="noopener" class="reveal card group flex flex-col gap-3"> <div class="flex items-center justify-between text-xs"> <span class="font-mono uppercase tracking-[0.16em] text-zinc-500">looksyai.in</span> <span class="inline-flex items-center gap-1 font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Read source <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">Looksy AI · Gemini Omni product page</h3> <p class="text-sm leading-relaxed text-zinc-400">Tidy summary of specs, use cases and comparisons.</p> </a><a href="https://storage.googleapis.com/deepmind-media/gemini/gemini_v2_5_report.pdf" target="_blank" rel="noopener" class="reveal card group flex flex-col gap-3"> <div class="flex items-center justify-between text-xs"> <span class="font-mono uppercase tracking-[0.16em] text-zinc-500">storage.googleapis.com</span> <span class="inline-flex items-center gap-1 font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Read source <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">Gemini 2.5 technical report</h3> <p class="text-sm leading-relaxed text-zinc-400">Family-level multimodality, long context and the agentic direction.</p> </a> </div> </div> </section> </main> <footer class="mt-32 border-t border-white/5"> <div class="container-x grid gap-10 py-12 lg:grid-cols-[1.6fr_1fr_1fr]"> <div> <a href="/" class="inline-flex items-center gap-2.5 font-display text-base font-semibold text-white"> <span class="grid h-7 w-7 place-items-center rounded-lg bg-brand-gradient text-ink-950 shadow-glow"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true">
383 <path fill="currentColor" d="M12 2l1.7 7.3L21 11l-7.3 1.7L12 20l-1.7-7.3L3 11l7.3-1.7L12 2z"></path> </svg> </span> <span>Gemini Omni</span> </a> <p class="mt-4 max-w-md text-sm leading-relaxed text-zinc-500">Unofficial info hub. Content is aggregated from public reporting and community leaks. Gemini, Omni and related marks belong to Google.</p> <p class="mt-4 text-sm text-zinc-400"> <span class="text-zinc-500">Contact:</span> <a class="ml-1 text-white hover:underline" href="mailto:[email protected]">[email protected]</a> </p> </div> <div> <h2 class="text-xs font-semibold uppercase tracking-[0.18em] text-zinc-400">Quick links</h2> <ul class="mt-4 grid grid-cols-2 gap-y-2 text-sm text-zinc-400"> <li><a class="hover:text-white" href="/#showcase">Demos</a></li> <li><a class="hover:text-white" href="/#features">Features</a></li> <li><a class="hover:text-white" href="/#specs">Specs</a></li> <li><a class="hover:text-white" href="/#architecture">Architecture</a></li> <li><a class="hover:text-white" href="/#cases">Use cases</a></li> <li><a class="hover:text-white" href="/#comparison">Compare</a></li> <li><a class="hover:text-white" href="/#free">Free vs paid</a></li> <li><a class="hover:text-white" href="/#timeline">Timeline</a></li> <li><a class="hover:text-white" href="/prompt-generator/">Prompt builder</a></li> <li><a class="hover:text-white" href="/video-studio/">Video Studio</a></li> <li><a class="hover:text-white" href="/pricing/">Pricing</a></li> <li><a class="hover:text-white" href="/blog/">Articles</a></li> <li><a class="hover:text-white" href="/#faq">FAQ</a></li> <li><a class="hover:text-white" href="/#sources">Sources</a></li> </ul> </div> <div> <h2 class="text-xs font-semibold uppercase tracking-[0.18em] text-zinc-400">Language</h2> <ul class="mt-4 grid max-h-72 grid-cols-2 gap-y-2 overflow-y-auto overscroll-contain pr-2 text-sm text-zinc-400 sm:grid-cols-3 sm:max-h-64"> <li> <a class="hover:text-white text-white font-medium" href="/" hreflang="en"> English </a> </li><li> <a class="hover:text-white " href="/es/" hreflang="es"> Español </a> </li><li> <a class="hover:text-white " href="/it/" hreflang="it"> Italiano </a> </li><li> <a class="hover:text-white " href="/hi/" hreflang="hi"> हिनà¥à¤¦à¥ </a> </li><li> <a class="hover:text-white " href="/ar/" hreflang="ar"> Ø§ÙØ¹Ø±Ø¨ÙØ© </a> </li><li> <a class="hover:text-white " href="/zh/" hreflang="zh"> 䏿 </a> </li><li> <a class="hover:text-white " href="/ja/" hreflang="ja"> æ¥æ¬èª </a> </li><li> <a class="hover:text-white " href="/ko/" hreflang="ko"> íêµì´ </a> </li><li> <a class="hover:text-white " href="/fr/" hreflang="fr"> Français </a> </li><li> <a class="hover:text-white " href="/de/" hreflang="de"> Deutsch </a> </li><li> <a class="hover:text-white " href="/nl/" hreflang="nl"> Nederlands </a> </li><li> <a class="hover:text-white " href="/pl/" hreflang="pl"> Polski </a> </li><li> <a class="hover:text-white " href="/pt-BR/" hreflang="pt-BR"> Português </a> </li><li> <a class="hover:text-white " href="/ru/" hreflang="ru"> Ð ÑÑÑкий </a> </li><li> <a class="hover:text-white " href="/tr/" hreflang="tr"> Türkçe </a> </li><li> <a class="hover:text-white " href="/id/" hreflang="id"> Bahasa Indonesia </a> </li><li> <a class="hover:text-white " href="/vi/" hreflang="vi"> Tiếng Viá»t </a> </li><li> <a class="hover:text-white " href="/th/" hreflang="th"> à¹à¸à¸¢ </a> </li><li> <a class="hover:text-white " href="/ms/" hreflang="ms"> Bahasa Melayu </a> </li><li> <a class="hover:text-white " href="/tl/" hreflang="tl"> Filipino </a> </li><li> <a class="hover:text-white " href="/bn/" hreflang="bn"> বাà¦à¦²à¦¾ </a> </li><li> <a class="hover:text-white " href="/ta/" hreflang="ta"> தமிழ௠</a> </li><li> <a class="hover:text-white " href="/te/" hreflang="te"> à°¤à±à°²à±à°à± </a> </li><li> <a class="hover:text-white " href="/mr/" hreflang="mr"> मराठॠ</a> </li><li> <a class="hover:text-white " href="/he/" hreflang="he"> ×¢×ר×ת </a> </li><li> <a class="hover:text-white " href="/fa/" hreflang="fa"> ÙØ§Ø±Ø³Û </a> </li><li> <a class="hover:text-white " href="/ur/" hreflang="ur"> ارد٠</a> </li> </ul> </div> </div> <div class="border-t border-white/5"> <div class="container-x flex flex-col gap-3 py-5 text-xs text-zinc-500 sm:flex-row sm:items-center sm:justify-between"> <div class="flex flex-col gap-2 sm:flex-row sm:items-center sm:gap-4"> <p>© 2026 Gemini Omni Info Hub</p> <nav class="flex flex-wrap gap-x-4 gap-y-1" aria-label="Legal"> <a class="hover:text-white" href="/terms/">Terms of Service</a> <a class="hover:text-white" href="/privacy/">Privacy Policy</a> </nav> </div> <p>Built with Astro · Tailwind</p> </div> </div> </footer> <dialog id="login-modal" class="hidden w-[min(440px,calc(100vw-24px))] rounded-3xl border border-white/10 bg-ink-900/95 p-0 text-zinc-100 shadow-glow backdrop:bg-ink-950/70 backdrop:backdrop-blur-md open:flex open:flex-col" aria-labelledby="login-modal-title"> <div class="relative max-h-[min(720px,90vh)] overflow-y-auto px-7 pb-8 pt-9 sm:px-9"> <button type="button" data-close aria-label="Close" class="absolute right-3 top-3 grid h-9 w-9 place-items-center rounded-full border border-white/10 bg-white/[0.04] text-zinc-300 transition-colors hover:border-violet-400/40 hover:text-white"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M6 6l12 12M18 6L6 18"></path> </svg> </button> <div data-state="form" class="flex flex-col gap-6"> <header class="flex flex-col items-center text-center"> <span class="mb-4 grid h-14 w-14 place-items-center rounded-2xl bg-brand-gradient shadow-glow"> <img src="/favicon.svg" alt="Gemini Omni" class="h-9 w-9" width="36" height="36"> </span> <h2 id="login-modal-title" class="font-display text-2xl font-semibold tracking-tight text-white"> Be first when Gemini Omni opens up </h2> <p class="mt-2 max-w-xs text-sm leading-relaxed text-zinc-400"> Sign in to unlock the prompt builder and credits. Omni 1.1 Flash is production-ready for developers (gemini-omni-1.1-flash). </p> </header> <div class="flex flex-col gap-3"> <div id="gsi-button-container" data-locale="en" data-google-failed="Google sign-in failed. Please try again." class="flex min-h-[44px] items-center justify-center"></div> </div> <div class="relative"> <div class="absolute inset-0 flex items-center" aria-hidden="true"> <div class="w-full border-t border-white/10"></div> </div> <div class="relative flex justify-center"> <span class="bg-ink-900/95 px-3 text-xs uppercase tracking-[0.25em] text-zinc-500"> or </span> </div> </div> <div data-step="email" class="flex flex-col gap-3"> <label class="text-xs font-semibold uppercase tracking-[0.18em] text-zinc-400" for="login-email"> Email </label> <input id="login-email" type="email" autocomplete="email" inputmode="email" placeholder="[email protected]" class="w-full rounded-xl border border-white/10 bg-white/[0.04] px-4 py-3 text-sm text-white outline-none ring-2 ring-transparent transition-all placeholder:text-zinc-500 focus:border-violet-400/40 focu
383s:ring-violet-400/20"> <button type="button" data-action="send-code" data-invalid-email="Please enter a valid email address." data-send-failed="Failed to send code. Please try again." class="btn-primary w-full justify-center"> <span data-label-idle>Send code</span> <span data-label-loading hidden class="flex items-center gap-2"> <span class="inline-block h-3.5 w-3.5 animate-spin rounded-full border-2 border-white/70 border-t-transparent"></span> Sending⦠</span> </button> </div> <div data-step="code" hidden class="flex flex-col gap-3"> <div class="flex items-center justify-between"> <label class="text-xs font-semibold uppercase tracking-[0.18em] text-zinc-400" for="login-code"> Verification code </label> <button type="button" data-action="change-email" class="text-xs font-semibold text-violet-300 transition-colors hover:text-violet-200"> Change email </button> </div> <p class="rounded-xl border border-white/5 bg-white/[0.03] px-3 py-2 text-xs text-zinc-400"> <span>We sent a 6-digit code to</span> <span data-code-email class="ml-1 font-semibold text-zinc-100"></span> </p> <input id="login-code" type="text" inputmode="numeric" autocomplete="one-time-code" maxlength="6" placeholder="000000" class="w-full rounded-xl border border-white/10 bg-white/[0.04] px-4 py-4 text-center text-2xl font-semibold tracking-[0.6em] text-white outline-none ring-2 ring-transparent transition-all placeholder:text-zinc-600 focus:border-violet-400/40 focus:ring-violet-400/20"> <button type="button" data-action="verify" data-verify-failed="Invalid or expired code." class="btn-primary w-full justify-center"> <span data-label-idle>Verify & sign in</span> <span data-label-loading hidden class="flex items-center gap-2"> <span class="inline-block h-3.5 w-3.5 animate-spin rounded-full border-2 border-white/70 border-t-transparent"></span> Verifying⦠</span> </button> <div class="text-center text-xs text-zinc-400"> <button type="button" data-action="resend" data-template="Resend in {n}s" class="font-semibold text-violet-300 transition-colors hover:text-violet-200 disabled:cursor-not-allowed disabled:text-zinc-500 disabled:hover:text-zinc-500"> <span data-resend-idle>Resend code</span> <span data-resend-countdown hidden></span> </button> </div> </div> <p data-error hidden class="rounded-xl border border-rose-500/30 bg-rose-500/10 px-3 py-2 text-sm text-rose-200"></p> <p class="text-center text-xs leading-relaxed text-zinc-500"> By signing in, you agree to our <a href="/terms/" class="text-zinc-300 underline decoration-zinc-600 underline-offset-2 hover:text-white">Terms of Service</a> and <a href="/privacy/" class="text-zinc-300 underline decoration-zinc-600 underline-offset-2 hover:text-white">Privacy Policy</a> </p> </div> <div data-state="success" hidden class="flex flex-col items-center gap-5 py-4 text-center"> <span class="grid h-16 w-16 place-items-center rounded-full bg-emerald-500/15 text-emerald-300 ring-1 ring-emerald-400/40"> <svg viewBox="0 0 24 24" class="h-8 w-8" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" d="M5 12l4.5 4.5L19 7"></path> </svg> </span> <h2 class="font-display text-2xl font-semibold tracking-tight text-white"> You're signed in </h2> <p class="max-w-xs text-sm leading-relaxed text-zinc-400"> You can close this and keep exploring. Try the prompt builder when you are ready. </p> <p data-success-user class="text-sm font-semibold text-zinc-200"></p> <div class="flex w-full flex-col items-stretch gap-2 sm:flex-row sm:justify-center sm:gap-3"> <a href="/prompt-generator/" class="btn-primary justify-center"> Open the prompt builder <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M5 12h14M13 6l6 6-6 6"></path> </svg> </a> <button type="button" data-close class="btn-ghost justify-center"> Close </button> </div> </div> </div> </dialog>
383<script>(function(){const API_BASE = "https://www.gushanai.com/api"; 384const APP_KEY = "gemini_omni_4561"; 385const GOOGLE_CLIENT_ID = "463343176094-ptfq906flrtlronsfq8c4omvui6dtck2.apps.googleusercontent.com"; 386const HTML_LANG = "en"; 387 388 (() => { 389 if (typeof window === 'undefined') return; 390 const dialog = document.getElementById('login-modal'); 391 if (!(dialog instanceof HTMLDialogElement)) return; 392 393 const AUTH_TOKEN_KEY = 'auth_token'; 394 const USER_INFO_KEY = 'user_info'; 395 const AUTH_CHANGED_EVENT = 'gemini-omni:auth-changed'; 396 397 const formRoot = dialog.querySelector('[data-state="form"]'); 398 const successRoot = dialog.querySelector('[data-state="success"]'); 399 const errorEl = dialog.querySelector('[data-error]'); 400 const stepEmail = dialog.querySelector('[data-step="email"]'); 401 const stepCode = dialog.querySelector('[data-step="code"]'); 402 const emailInput = dialog.querySelector('#login-email'); 403 const codeInput = dialog.querySelector('#login-code'); 404 const codeEmailLabel = dialog.querySelector('[data-code-email]'); 405 const successUserEl = dialog.querySelector('[data-success-user]'); 406 const gsiContainer = dialog.querySelector('#gsi-button-container'); 407 408 const sendBtn = dialog.querySelector('[data-action="send-code"]'); 409 const verifyBtn = dialog.querySelector('[data-action="verify"]'); 410 const resendBtn = dialog.querySelector('[data-action="resend"]'); 411 const changeEmailBtn = dialog.querySelector('[data-action="change-email"]'); 412 413 let currentEmail = ''; 414 let countdown = 0; 415 let countdownTimer = null; 416 let gsiLoaded = false; 417 let gsiInitialized = false; 418 419 const isAuthed = () => !!window.localStorage.getItem(AUTH_TOKEN_KEY); 420 421 const showError = (msg) => { 422 if (!errorEl) return; 423 if (!msg) { 424 errorEl.textContent = ''; 425 errorEl.setAttribute('hidden', ''); 426 return; 427 } 428 errorEl.textContent = msg; 429 errorEl.removeAttribute('hidden'); 430 }; 431 432 const setBtnLoading = (btn, loading) => { 433 if (!btn) return; 434 btn.toggleAttribute('disabled', loading); 435 const idle = btn.querySelector('[data-label-idle]'); 436 const busy = btn.querySelector('[data-label-loading]'); 437 if (idle) idle.toggleAttribute('hidden', loading); 438 if (busy) busy.toggleAttribute('hidden', !loading); 439 }; 440 441 const switchStep = (step) => { 442 if (step === 'code') { 443 stepEmail?.setAttribute('hidden', ''); 444 stepCode?.removeAttribute('hidden'); 445 setTimeout(() => codeInput?.focus(), 30); 446 } else { 447 stepCode?.setAttribute('hidden', ''); 448 stepEmail?.removeAttribute('hidden'); 449 setTimeout(() => emailInput?.focus(), 30); 450 } 451 }; 452 453 const stopCountdown = () => { 454 if (countdownTimer) { 455 clearInterval(countdownTimer); 456 countdownTimer = null; 457 } 458 }; 459 460 const updateResendUI = () => { 461 if (!resendBtn) return; 462 const idle = resendBtn.querySelector('[data-resend-idle]'); 463 const cd = resendBtn.querySelector('[data-resend-countdown]'); 464 if (countdown > 0) { 465 resendBtn.setAttribute('disabled', ''); 466 idle?.setAttribute('hidden', ''); 467 if (cd) { 468 cd.removeAttribute('hidden'); 469 cd.textContent = (resendBtn.dataset.template || '{n}s').replace('{n}', String(countdown)); 470 } 471 } else { 472 resendBtn.removeAttribute('disabled'); 473 idle?.removeAttribute('hidden'); 474 cd?.setAttribute('hidden', ''); 475 } 476 }; 477 478 const startCountdown = (seconds) => { 479 stopCountdown(); 480 countdown = seconds; 481 updateResendUI(); 482 countdownTimer = window.setInterval(() => { 483 countdown -= 1; 484 if (countdown <= 0) { 485 countdown = 0; 486 stopCountdown(); 487 } 488 updateResendUI(); 489 }, 1000); 490 }; 491 492 const showSuccess = (user) => { 493 formRoot?.setAttribute('hidden', ''); 494 successRoot?.removeAttribute('hidden'); 495 if (successUserEl) { 496 const name = user?.nickName || user?.email || ''; 497 successUserEl.textContent = name; 498 successUserEl.toggleAttribute('hidden', !name); 499 } 500 }; 501 502 const resetForm = () => { 503 currentEmail = ''; 504 stopCountdown(); 505 countdown = 0; 506 updateResendUI(); 507 if (emailInput) emailInput.value = ''; 508 if (codeInput) codeInput.value = ''; 509 showError(''); 510 switchStep('email'); 511 formRoot?.removeAttribute('hidden'); 512 successRoot?.setAttribute('hidden', ''); 513 }; 514 515 const openDialog = () => { 516 showError(''); 517 if (isAuthed()) { 518 const raw = window.localStorage.getItem(USER_INFO_KEY); 519 let user = null; 520 try { user = raw ? JSON.parse(raw) : null; } catch {} 521 formRoot?.setAttribute('hidden', ''); 522 successRoot?.removeAttribute('hidden'); 523 if (successUserEl) { 524 const name = user?.nickName || user?.email || ''; 525 successUserEl.textContent = name; 526 successUserEl.toggleAttribute('hidden', !name); 527 } 528 } else { 529 resetForm(); 530 } 531 if (!dialog.open) { 532 try { dialog.showModal(); } catch { dialog.setAttribute('open', ''); } 533 } 534 ensureGoogleButton(); 535 }; 536 537 const closeDialog = () => { 538 if (dialog.open) { 539 try { dialog.close(); } catch { dialog.removeAttribute('open'); } 540 } 541 }; 542 543 const apiRequest = async (path, body) => { 544 const headers = { 'Content-Type': 'application/json', 'x-app-key': APP_KEY }; 545 const token = window.localStorage.getItem(AUTH_TOKEN_KEY); 546 if (token) headers.Authorization = token; 547 const res = await fetch(`${API_BASE}${path}`, { 548 method: 'POST', 549 headers, 550 body: JSON.stringify(body || {}), 551 }); 552 let env;
553 try { env = await res.json(); } catch { env = { code: res.status, message: `HTTP ${res.status}` }; } 554 if (!env || (env.code !== 200 && env.code !== 0)) { 555 const err = new Error(env?.message || `HTTP ${res.status}`); 556 err.code = env?.code ?? res.status; 557 throw err; 558 } 559 return env.data; 560 }; 561 562 const finishLogin = (token, user) => { 563 window.localStorage.setItem(AUTH_TOKEN_KEY, token); 564 if (user) window.localStorage.setItem(USER_INFO_KEY, JSON.stringify(user)); 565 window.dispatchEvent(new CustomEvent(AUTH_CHANGED_EVENT, { detail: { token, user } })); 566 showSuccess(user); 567 }; 568 569 const handleGoogleCredential = async (response) => { 570 const idToken = response?.credential; 571 if (!idToken) return; 572 showError(''); 573 try { 574 const data = await apiRequest('/auth/google/web', { idToken }); 575 finishLogin(data.token, data.user || null); 576 try { 577 const fresh = await apiRequest('/mine/info', {}); 578 window.localStorage.setItem(USER_INFO_KEY, JSON.stringify(fresh)); 579 if (successUserEl) { 580 const name = fresh?.nickName || fresh?.email || ''; 581 successUserEl.textContent = name; 582 successUserEl.toggleAttribute('hidden', !name); 583 } 584 } catch {} 585 } catch (err) { 586 showError(err?.message || gsiContainer?.dataset.googleFailed || 'Google sign-in failed'); 587 } 588 }; 589 590 const initGoogle = () => { 591 if (gsiInitialized || !gsiContainer) return; 592 const g = window.google; 593 if (!g?.accounts?.id) return; 594 g.accounts.id.initialize({ 595 client_id: GOOGLE_CLIENT_ID, 596 callback: handleGoogleCredential, 597 ux_mode: 'popup', 598 auto_select: false, 599 }); 600 gsiContainer.innerHTML = ''; 601 g.accounts.id.renderButton(gsiContainer, { 602 theme: 'filled_black', 603 size: 'large', 604 shape: 'pill', 605 text: 'signin_with', 606 logo_alignment: 'left', 607 width: gsiContainer.clientWidth || 320, 608 locale: HTML_LANG, 609 }); 610 gsiInitialized = true; 611 }; 612 613 const ensureGoogleButton = () => { 614 if (!gsiContainer || gsiInitialized) return; 615 if (gsiLoaded) { 616 initGoogle(); 617 return; 618 } 619 const existing = document.querySelector('script[data-gsi-loader]'); 620 if (existing) { 621 existing.addEventListener('load', initGoogle, { once: true }); 622 gsiLoaded = true; 623 return; 624 } 625 const s = document.createElement('script'); 626 s.src = 'https://accounts.google.com/gsi/client'; 627 s.async = true; 628 s.defer = true; 629 s.dataset.gsiLoader = '1'; 630 s.onload = () => { gsiLoaded = true; initGoogle(); }; 631 document.head.appendChild(s); 632 }; 633 634 const isValidEmail = (v) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v); 635 636 sendBtn?.addEventListener('click', async () => { 637 const email = (emailInput?.value || '').trim(); 638 showError(''); 639 if (!email || !isValidEmail(email)) { 640 showError(sendBtn.dataset.invalidEmail || 'Invalid email'); 641 return; 642 } 643 setBtnLoading(sendBtn, true);
644 try { 645 await apiRequest('/auth/email/send-code', { email }); 646 currentEmail = email; 647 if (codeEmailLabel) codeEmailLabel.textContent = email; 648 switchStep('code'); 649 startCountdown(60); 650 } catch (err) { 651 showError(err?.message || sendBtn.dataset.sendFailed || 'Failed to send code'); 652 } finally { 653 setBtnLoading(sendBtn, false); 654 } 655 }); 656 657 verifyBtn?.addEventListener('click', async () => { 658 const code = (codeInput?.value || '').replace(/\D/g, ''); 659 showError(''); 660 if (code.length !== 6) { 661 showError(verifyBtn.dataset.verifyFailed || 'Invalid code'); 662 return; 663 } 664 setBtnLoading(verifyBtn, true); 665 try { 666 const data = await apiRequest('/auth/email/verify', { email: currentEmail, code }); 667 finishLogin(data.token, data.user || null); 668 try { 669 const fresh = await apiRequest('/mine/info', {}); 670 window.localStorage.setItem(USER_INFO_KEY, JSON.stringify(fresh)); 671 if (successUserEl) { 672 const name = fresh?.nickName || fresh?.email || ''; 673 successUserEl.textContent = name; 674 successUserEl.toggleAttribute('hidden', !name); 675 } 676 } catch {} 677 } catch (err) { 678 showError(err?.message || verifyBtn.dataset.verifyFailed || 'Verification failed'); 679 } finally { 680 setBtnLoading(verifyBtn, false); 681 } 682 }); 683 684 resendBtn?.addEventListener('click', async () => { 685 if (countdown > 0 || !currentEmail) return; 686 showError(''); 687 try { 688 await apiRequest('/auth/email/send-code', { email: currentEmail }); 689 startCountdown(60); 690 } catch (err) { 691 showError(err?.message || sendBtn?.dataset.sendFailed || 'Failed to send code'); 692 } 693 }); 694 695 changeEmailBtn?.addEventListener('click', () => { 696 showError(''); 697 stopCountdown(); 698 countdown = 0; 699 updateResendUI(); 700 if (codeInput) codeInput.value = ''; 701 switchStep('email'); 702 }); 703 704 codeInput?.addEventListener('input', (e) => { 705 const target = e.target; 706 if (target instanceof HTMLInputElement) { 707 target.value = target.value.replace(/\D/g, '').slice(0, 6); 708 } 709 }); 710 711 emailInput?.addEventListener('keydown', (e) => { 712 if (e.key === 'Enter') { 713 e.preventDefault(); 714 sendBtn?.click(); 715 } 716 }); 717 718 codeInput?.addEventListener('keydown', (e) => { 719 if (e.key === 'Enter') { 720 e.preventDefault(); 721 verifyBtn?.click(); 722 } 723 }); 724 725 dialog.addEventListener('click', (e) => { 726 const target = e.target; 727 if (target instanceof Element && target.closest('[data-close]')) { 728 e.preventDefault(); 729 closeDialog(); 730 return; 731 } 732 if (target === dialog) { 733 closeDialog(); 734 } 735 }); 736 737 dialog.addEventListener('cancel', (e) => { 738 e.preventDefault(); 739 closeDialog(); 740 }); 741 742 window.addEventListener('open-login', openDialog); 743 744 document.addEventListener('click', (e) => { 745 const target = e.target; 746 if (!(target instanceof Element)) return; 747 const trigger = target.closest('[data-open-login]'); 748 if (trigger) { 749 e.preventDefault(); 750 openDialog(); 751 } 752 }); 753 })(); 754})();</script>
754 <dialog id="recharge-modal" class="hidden w-[min(440px,calc(100vw-24px))] rounded-3xl border border-white/10 bg-ink-900/95 p-0 text-zinc-100 shadow-glow backdrop:bg-ink-950/70 backdrop:backdrop-blur-md open:flex open:flex-col" aria-labelledby="recharge-modal-title"> <div class="relative px-7 pb-8 pt-9 sm:px-9"> <button type="button" data-close aria-label="Not now" class="absolute right-3 top-3 grid h-9 w-9 place-items-center rounded-full border border-white/10 bg-white/[0.04] text-zinc-300 transition-colors hover:border-violet-400/40 hover:text-white"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M6 6l12 12M18 6L6 18"></path> </svg> </button> <header class="flex flex-col items-center text-center"> <span class="mb-4 grid h-14 w-14 place-items-center rounded-2xl bg-gradient-to-br from-amber-400/30 via-rose-400/20 to-violet-500/30 ring-1 ring-amber-400/40"> <svg viewBox="0 0 24 24" class="h-7 w-7 text-amber-300" aria-hidden="true"> <path fill="currentColor" d="M13 2L3 14h7l-1 8 10-12h-7l1-8z"></path> </svg> </span> <h2 id="recharge-modal-title" class="font-display text-2xl font-semibold tracking-tight text-white"> You are out of credits </h2> <p class="mt-2 max-w-xs text-sm leading-relaxed text-zinc-400"> Top up your Gemini Omni balance to keep generating prompts and adaptations. </p> </header> <div class="mt-6 flex flex-col gap-3 sm:flex-row"> <button type="button" data-close class="btn-ghost w-full justify-center"> Not now </button> <a href="/pricing/" class="btn-primary w-full justify-center" data-recharge-cta> Go to pricing <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M5 12h14M13 6l6 6-6 6"></path> </svg> </a> </div> </div> </dialog>
754<script> 755 (() => { 756 if (typeof window === 'undefined') return; 757 const dialog = document.getElementById('recharge-modal'); 758 if (!(dialog instanceof HTMLDialogElement)) return; 759 760 const openDialog = () => { 761 if (!dialog.open) { 762 try { 763 dialog.showModal(); 764 } catch { 765 dialog.setAttribute('open', ''); 766 } 767 } 768 }; 769 770 const closeDialog = () => { 771 if (dialog.open) { 772 try { 773 dialog.close(); 774 } catch { 775 dialog.removeAttribute('open'); 776 } 777 } 778 }; 779 780 dialog.addEventListener('click', (e) => { 781 const target = e.target; 782 if (target instanceof Element && target.closest('[data-close]')) { 783 e.preventDefault(); 784 closeDialog(); 785 return; 786 } 787 if (target === dialog) closeDialog(); 788 }); 789 790 dialog.addEventListener('cancel', (e) => { 791 e.preventDefault(); 792 closeDialog(); 793 }); 794 795 window.addEventListener('gemini-omni:open-recharge', openDialog); 796 })(); 797</script>
797
797<script> 798 (() => { 799 if (typeof window === 'undefined') return; 800 const observer = new IntersectionObserver( 801 (entries) => { 802 for (const entry of entries) { 803 if (entry.isIntersecting) { 804 entry.target.classList.add('is-visible'); 805 observer.unobserve(entry.target); 806 } 807 } 808 }, 809 { threshold: 0.12, rootMargin: '0px 0px -40px 0px' } 810 ); 811 const onReady = () => { 812 document.querySelectorAll('.reveal').forEach((el) => observer.observe(el)); 813 }; 814 if (document.readyState === 'loading') { 815 document.addEventListener('DOMContentLoaded', onReady); 816 } else { 817 onReady(); 818 } 819 })(); 820 </script>
820 </body> </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.