{"id":45019965,"url":"https://github.com/cemroot/yt-ai-summarizer","last_synced_at":"2026-04-06T19:00:57.022Z","repository":{"id":339188634,"uuid":"1158526881","full_name":"CemRoot/yt-ai-summarizer","owner":"CemRoot","description":"Free AI-powered YouTube video summarizer — get summaries, key points \u0026 detailed analysis in 20+ languages. Supports Groq \u0026 Ollama Cloud. No subscription needed.","archived":false,"fork":false,"pushed_at":"2026-04-06T17:05:48.000Z","size":4036,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-06T17:23:11.042Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CemRoot.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-15T14:22:38.000Z","updated_at":"2026-04-06T17:05:50.000Z","dependencies_parsed_at":null,"dependency_job_id":"a4339610-91dc-4a8b-a16e-21e3863046de","html_url":"https://github.com/CemRoot/yt-ai-summarizer","commit_stats":null,"previous_names":["cemroot/yt-ai-summarizer"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/CemRoot/yt-ai-summarizer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CemRoot%2Fyt-ai-summarizer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CemRoot%2Fyt-ai-summarizer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CemRoot%2Fyt-ai-summarizer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CemRoot%2Fyt-ai-summarizer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CemRoot","download_url":"https://codeload.github.com/CemRoot/yt-ai-summarizer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CemRoot%2Fyt-ai-summarizer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31485516,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-06T17:22:55.647Z","status":"ssl_error","status_checked_at":"2026-04-06T17:22:54.741Z","response_time":112,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-02-19T02:05:39.789Z","updated_at":"2026-04-06T19:00:57.015Z","avatar_url":"https://github.com/CemRoot.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# YouTube AI Summarizer\n\n\u003e **Stop watching. Start reading.** Summarize any YouTube video for free with your own AI — no subscriptions, no hidden fees.\n\n[![CI](https://github.com/CemRoot/yt-ai-summarizer/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/CemRoot/yt-ai-summarizer/actions/workflows/ci.yml)\n![Manifest Version](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2FCemRoot%2Fyt-ai-summarizer%2Fmain%2Fmanifest.json\u0026query=%24.manifest_version\u0026label=manifest\u0026prefix=v\u0026color=blue)\n![License](https://img.shields.io/badge/license-MIT-green)\n![Version](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2FCemRoot%2Fyt-ai-summarizer%2Fmain%2Fmanifest.json\u0026query=%24.version\u0026label=version\u0026color=orange)\n\n---\n\n## What It Does\n\nTurn any YouTube video into a concise, actionable summary in seconds. Bring your own AI key, choose your language, and get:\n\n- **Summary** — Full picture in 3–5 clean paragraphs\n- **Key Points** — 5–10 evidence-backed takeaways as a numbered list\n- **Detailed Analysis** — Section-by-section breakdown with names, dates, data preserved\n- **🎙️ AI Podcast** — Two-host NotebookLM-style audio conversation with Gemini TTS, volume control, and WAV download\n- **💬 Chat** — Ask follow-up questions about the video and get AI answers grounded in the transcript\n\nSummary, Key Points, and Detailed are generated in a **single API call** — no rate limit issues.\n\n---\n\n## Features\n\n| Feature | Details |\n|---------|---------|\n| **Dual AI Provider** | Choose between **Groq** (ultra-fast) or **Ollama Cloud** (flexible models). Switch anytime. |\n| **20+ Languages** | Output in English, Türkçe, Español, Français, Deutsch, 日本語, 한국어, 中文 and more — regardless of video language. |\n| **Modern UI/UX** | Seamless YouTube integration, underline-style tabs, smooth animations, Inter font. |\n| **Dark \u0026 Light Mode** | Automatically matches YouTube's theme + system preference. |\n| **Onboarding Flow** | Step-by-step welcome page with provider selection and guided API key setup. |\n| **First-Visit Tooltip** | Animated \"Hey! I'm here\" bubble guides new users to the button. |\n| **One-Click Copy** | Copy any analysis to clipboard instantly. |\n| **Auto-Summarize** | Optional: generate summaries automatically when you open a video. |\n| **Smart Caching (LRU)** | In-memory + persistent storage with LRU eviction (max 20 videos). Tab switching is instant — even during active generation. |\n| **Fun Facts on Loading** | 50 rotating \"Did you know?\" facts keep you entertained while AI processes. |\n| **🎙️ AI Podcast** | NotebookLM-style two-host podcast with randomly paired male \u0026 female voices. Powered by Gemini TTS — volume control, WAV download for offline/WhatsApp sharing, completely free. |\n| **💬 Video Chat** | Ask follow-up questions about the video. AI answers strictly from the transcript with full conversation history. |\n| **🖥️ Fullscreen-Aware** | Extension UI auto-hides in fullscreen mode for distraction-free viewing. |\n| **🌍 Multi-Language Onboarding** | Welcome page auto-detects browser language with manual selector. 11 languages: EN, TR, ES, FR, DE, JA, KO, ZH, PT, AR, HI. |\n| **SPA-Compatible** | Works seamlessly with YouTube's single-page navigation. |\n| **CI/CD Pipeline** | GitHub Actions: manifest validation, JS syntax checks, security audit, automated packaging. |\n\n---\n\n## Getting Started\n\n### 1. Install\n\n```bash\n# Clone the repo\ngit clone https://github.com/CemRoot/yt-ai-summarizer.git\n\n# Or download the latest release ZIP\n```\n\nThen in Chrome:\n1. Navigate to `chrome://extensions/`\n2. Enable **Developer mode** (toggle top-right)\n3. Click **Load unpacked** → select the extension folder\n\n### 2. Get a Free API Key\n\nChoose your provider:\n\n| Provider | Get Key | Free Tier |\n|----------|---------|-----------|\n| **Ollama Cloud** (recommended) | [ollama.com/settings/keys](https://ollama.com/settings/keys) | Gemini 3 Flash, 10+ models, free tier |\n| **Groq** | [console.groq.com/keys](https://console.groq.com/keys) | 30 RPM, up to 500K tokens/day |\n\n### 3. Configure \u0026 Go\n\n1. Click the extension icon → paste your API key\n2. Pick your AI model and output language\n3. Open any YouTube video → click the floating brain icon\n4. Done. Summaries in seconds.\n\n---\n\n## How It Works\n\n```\nYouTube Video → Extract Transcript → Send to AI Provider → Parse 3 Sections → Display\n                                   ↳ Chat Mode → Transcript + Question + History → AI Answer\n```\n\n1. **Transcript Extraction** — Pulls caption data directly from YouTube using Android client context (no external APIs).\n2. **Combined AI Call** — A single prompt generates Summary + Key Points + Detailed Analysis simultaneously.\n3. **Robust Parsing** — 4-layer parser: exact delimiters → regex variants → heuristic headings → smart split.\n4. **Instant Display** — Results shown in a native-feeling side panel. Switch tabs instantly from cache.\n5. **Conversational Chat** — Chat tab sends questions alongside the transcript and conversation history for context-aware answers.\n\n---\n\n## AI Models\n\n### Groq\n\n| Model | Speed | Quality | Best For |\n|-------|-------|---------|----------|\n| Llama 3.3 70B | ⚡⚡ | ★★★★★ | Highest quality summaries |\n| Llama 3.1 8B | ⚡⚡⚡ | ★★★ | Fast results, higher rate limit |\n| Llama 4 Scout 17B | ⚡⚡ | ★★★★ | New generation model |\n| Qwen3 32B | ⚡⚡ | ★★★★ | Strong reasoning |\n\n### Ollama Cloud\n\n| Model | Size | Best For |\n|-------|------|----------|\n| **Gemini 3 Flash** ⭐ | — | **Recommended** — Fast \u0026 high quality |\n| Qwen3-Next 80B | 80B | Reasoning \u0026 thinking |\n| DeepSeek V3.2 | 671B | Most powerful |\n| GPT-OSS 120B | 120B | General purpose |\n| Kimi K2.5 | — | Multimodal |\n| Devstral Small | 24B | Code-focused |\n\n---\n\n## Project Structure\n\n```\nyt-ai-summarizer/\n├── manifest.json              # Extension manifest (V3)\n├── service-worker.js          # Background: AI calls, routing, parsing\n├── content/\n│   ├── content.js             # Main controller (cache, SPA nav, chat)\n│   ├── content.css            # Panel styles + dark/light theme + chat UI\n│   ├── transcript.js          # YouTube transcript extraction\n│   ├── ui.js                  # Panel UI, tabs, chat interface, onboarding tooltip\n│   ├── podcast.js             # Podcast audio player\n│   └── page-bridge.js         # MAIN world bridge for YT data\n├── popup/\n│   ├── popup.html             # Settings panel (dual provider)\n│   ├── popup.js               # Settings logic\n│   └── popup.css              # Modern card-based styles\n├── update/\n│   ├── update.html            # What's New page shown after extension updates\n│   ├── update.js              # Changelog rendering + i18n + actions\n│   └── update.css             # What's New page styles\n├── welcome/\n│   ├── welcome.html           # Step-by-step onboarding\n│   ├── welcome.js             # Provider selection \u0026 validation\n│   └── welcome.css            # Onboarding styles\n├── utils/\n│   ├── storage.js             # Provider-aware storage helpers\n│   └── gemini-pcm-wav.js      # Gemini TTS PCM→WAV export + download\n├── icons/                     # Extension icons (16, 48, 128px)\n├── _locales/\n│   ├── en/messages.json       # English strings\n│   └── tr/messages.json       # Turkish strings\n├── privacy-policy.html        # Privacy policy (bundled with extension)\n├── privacy-policy.js          # TOC highlight script for privacy page\n├── docs/                      # GitHub Pages (uninstall feedback, etc.)\n│   ├── index.html\n│   └── uninstall.html\n├── .github/workflows/\n│   ├── ci.yml                 # CI/CD pipeline\n│   └── github-pages.yml       # Deploy docs/ to GitHub Pages\n└── README.md\n```\n\n---\n\n## CI/CD Pipeline\n\nEvery push to `main` triggers 5 automated checks:\n\n| Job | What It Does |\n|-----|-------------|\n| **Manifest Check** | Validates JSON, required fields, manifest_version 3, referenced file existence |\n| **JS Lint** | Syntax checks on all `.js` files, JSON validation, HTML structure checks |\n| **Security Audit** | Scans for hardcoded API keys, `eval()`, `document.write()`, CSP validation, host permission audit |\n| **Version Consistency** | Ensures version numbers match across manifest.json, privacy-policy.html, and README.md |\n| **Build \u0026 Package** | Creates versioned `.zip` artifact for Chrome Web Store submission |\n\n### Automated Maintenance\n\n| Workflow | Schedule | What It Does |\n|----------|----------|-------------|\n| **YouTube Version Monitor** | Mon \u0026 Thu 09:00 UTC | Compares ANDROID client version against NewPipeExtractor, auto-creates PR if outdated |\n| **Transcript Health Check** | Daily 06:00 UTC | Tests InnerTube caption extraction against a known video, opens GitHub Issue on failure |\n\n---\n\n## Privacy\n\n- **Zero data collection** — no analytics, no tracking, no telemetry\n- **Local storage only** — API keys and settings stay in `chrome.storage.local` on your device\n- **Direct API calls** — transcripts and chat prompts go only to the AI hosts you enabled (Groq, Ollama Cloud, Gemini TTS)\n- **Permissions** — `storage`, `activeTab`, plus declared host access for YouTube and those providers (see `manifest.json`)\n- **Open source** — inspect every line of code\n\nSee the full [Privacy Policy](privacy-policy.html).\n\n### Uninstall feedback URL (custom domain)\n\nAfter uninstall, Chrome opens a page you host over **HTTPS** (required by `chrome.runtime.setUninstallURL`). This project uses your portfolio domain:\n\n**https://cemkoyluoglu.codes/yt-ai-summarizer/uninstall.html**\n\nThe constant `UNINSTALL_FEEDBACK_URL` in `service-worker.js` must match that URL exactly (including `www` vs apex if you standardize on one).\n\n**Deploy on Vercel (portfolio site):**\n\n1. In this repo, the canonical HTML is [`docs/uninstall.html`](docs/uninstall.html).\n2. In your **portfolio** Vercel project, add the same file at **`public/yt-ai-summarizer/uninstall.html`** (Next.js, Vite, or any setup that serves `public/` at the site root).\n3. Deploy. Confirm the URL loads in an incognito window.\n4. Whenever you change `docs/uninstall.html` here, copy it to the portfolio repo again and redeploy — then ship a new extension version if the URL path ever changes.\n\n**Why not `github.io`?** Users only see the domain above; `cemroot.github.io` is no longer used for uninstall.\n\n**Optional — GitHub Pages backup:** [`.github/workflows/github-pages.yml`](.github/workflows/github-pages.yml) can still publish `docs/` for your own testing or redirects; the extension does not point there unless you change `UNINSTALL_FEEDBACK_URL` back.\n\n---\n\n## Requirements\n\n- Chrome 111 or later\n- A free API key from [Groq](https://console.groq.com/keys) or [Ollama](https://ollama.com/settings/keys)\n\n---\n\n## Pre-release checklist (maintainers)\n\n- **Security:** CI runs secret-pattern grep, CSP check, and manifest file references — keep `host_permissions` minimal.\n- **Debug noise:** No `console.log` / `console.warn` / `debugger` in shipping paths; `console.error` is only used for serious failures (e.g. missing content-script dependencies).\n- **Architecture:** Prefer ES classes and shared helpers (`StorageHelper`, controllers, UI modules) — avoid duplicating secrets or API base URLs outside `utils/storage.js` / `service-worker.js`.\n- **Versions:** `manifest.json`, `privacy-policy.html`, and the top README changelog entry must stay aligned (enforced by the **Version Consistency** CI job).\n- **Uninstall page:** After editing `docs/uninstall.html`, copy it to the portfolio Vercel project at `public/yt-ai-summarizer/uninstall.html` and redeploy so it matches `UNINSTALL_FEEDBACK_URL`.\n\n---\n\n## Troubleshooting\n\n### \"This extension is not trusted by Enhanced Safe Browsing\"\n\nThis warning appears for **all new extensions** on the Chrome Web Store. It is **not** a security issue — it simply means the developer account hasn't yet built a long enough compliance history with Google. The warning disappears automatically after a few months. You can safely click **\"Continue to install\"** to proceed.\n\n### CRX_FILE_NOT_READABLE on reinstall\n\nIf you uninstall the extension and immediately try to reinstall from the Chrome Web Store, Chrome may show a `CRX_FILE_NOT_READABLE` error. This is caused by Chrome's internal download cache holding a stale reference.\n\n**Fix:** Close Chrome completely, reopen it, then install the extension again from the Web Store. This clears Chrome's session cache and allows a fresh download.\n\n### Extension not appearing on YouTube\n\n- Make sure you're on `youtube.com` (not an embedded player)\n- Check that the extension is enabled at `chrome://extensions/`\n- Try refreshing the YouTube page (Ctrl+R / Cmd+R)\n- If you just installed, wait a moment and navigate to a new video\n\n---\n\n## Changelog\n\n### v1.8.2\n\n- **🎨 Update page polish**: Refined `update/update.css` for a more professional What's New layout and visual hierarchy. Fixed top accent line styling to match the welcome page.\n- **✨ Hero icon update**: Replaced the oversized red star SVG with the actual extension icon (`icon128.png`) in the update page's hero section.\n- **🔖 YouTube favicon**: Added a YouTube-style SVG favicon and wired it to update + popup pages.\n- **🧭 Open Settings behavior**: What's New now requests opening the extension action popup first, with an elegant in-page Settings Toast fallback if the popup API fails, instead of opening an ugly new tab.\n- **📜 Previous Versions toggle**: Fixed a CSS conflict (`display: flex` overriding `hidden`) making the previous versions list permanently visible instead of hidden by default.\n\n### v1.8.1\n\n- **📦 Store resubmit**: Bumped manifest version above 1.8.0 so Chrome Web Store accepts a new package (same codebase as 1.8.0 feature set).\n- **🏷️ Version label**: Popup and What’s New read `chrome.runtime.getManifest().version` — no hardcoded version string.\n- **📁 Package**: Distribution ZIP includes `update/` (What’s New page assets).\n\n### v1.8.0\n\n- **🎙️ Podcast TTS Model Fix**: Migrated from `gemini-2.5-flash-tts` (non-existent in v1beta) to `gemini-2.5-flash-preview-tts` — the correct model ID per Google's official speech generation docs. Fixes \"model not found\" error that broke all podcast generation.\n- **🔊 Podcast Volume Control**: New volume slider (0–100%) on the podcast player. Setting persists across videos via `chrome.storage.local`.\n- **📥 Podcast WAV Download**: \"Download audio (WAV)\" button exports the Gemini TTS audio as a proper WAV file. Users can save locally or share via WhatsApp as a document for offline listening.\n- **🔄 Non-Blocking Tab Switching**: Completely reworked tab switch architecture — each pipeline (summary, podcast, chat) now has its own busy flag. Switching tabs while AI is generating no longer freezes the UI or shows stale content from another tab. Cache-first display ensures instant tab switches.\n- **🧹 Clean Content Transitions**: `switchMode` now clears the content area synchronously before dispatching async handlers, eliminating brief flashes of wrong-tab content.\n\n### v1.7.2\n\n- **🔗 Uninstall URL**: Post-uninstall page now opens on **https://cemkoyluoglu.codes/yt-ai-summarizer/uninstall.html** (portfolio / Vercel) instead of GitHub Pages — same markup as `docs/uninstall.html`; host that file under `public/yt-ai-summarizer/` on Vercel.\n\n### v1.7.1\n\n- **📄 Privacy policy**: Redesigned layout and copy (Chat, Gemini TTS, storage, permissions). Last updated date refreshed.\n- **🌐 GitHub Pages**: `docs/index.html` landing polish; uninstall page uses an inline SVG favicon (no missing `favicon.png` on Pages).\n- **📖 README**: Project structure, Pages/uninstall URL, optional custom-domain notes, maintainer pre-release checklist.\n- **🔧 Version sync**: Patch bump so store/build artifacts match the updated bundled `privacy-policy.html`.\n\n### v1.7.0\n\n- **💬 Interactive Video Chat**: New \"Chat\" tab lets you ask follow-up questions about the video. AI answers strictly from the transcript with full conversation history (last 10 messages). Works with all providers (Groq, Ollama, Gemini).\n- **🖥️ Fullscreen Auto-Hide**: Extension toggle button and panel automatically hide when YouTube enters fullscreen mode — no more UI clutter during cinema viewing.\n- **🧹 Pre-Release Cleanup**: Removed routine `console.log` / `console.warn` debugging from production paths; `console.error` remains only for serious failures (e.g. missing dependencies).\n- **🐛 Podcast Rate Bug Fix**: Fixed a race condition in `podcast.js` where changing playback speed caused a small seek jump. Position is now captured before the rate changes.\n- **📏 Chat Context Alignment**: Chat transcript context window set to 80K characters, matching the summary pipeline.\n\n### v1.6.4\n\n- **Gemini TTS Model Update**: Updated TTS model identifier.\n- **Auto-Merge Pipeline**: Version Monitor PRs now auto-merge via squash after all CI checks pass — zero manual intervention needed.\n- **Branch Protection**: All PRs require 5 CI checks before merging (Manifest, Lint, Security, Version Consistency, Build).\n- **CODEOWNERS**: Critical files auto-assign @CemRoot as reviewer on PRs.\n\n### v1.6.3\n\n- **Fix Empty Transcript**: Updated YouTube InnerTube ANDROID client from v19.29.37 to v21.03.36 (SDK 35, Android 15). YouTube was rejecting the outdated client version and returning empty captions.\n- **Dynamic Client Version**: Extension now auto-extracts YouTube's current WEB client version at runtime as a fallback when the ANDROID client fails. No more manual version updates for WEB client changes.\n- **YouTube Version Monitor**: New GitHub Actions workflow checks NewPipeExtractor twice a week and auto-creates PRs when the ANDROID client version is outdated.\n- **Transcript Health Check**: Daily automated probe tests InnerTube caption extraction and opens a GitHub Issue if transcript fetching is broken.\n- **Version Consistency CI**: New CI job ensures version numbers stay in sync across manifest.json, privacy-policy.html, and README.md.\n- **Uninstall URL**: Added `uninstall_url` to manifest for post-uninstall feedback and reinstall guidance.\n- **Troubleshooting Guide**: Added FAQ section to README covering Enhanced Safe Browsing warning, CRX_FILE_NOT_READABLE reinstall issue, and common setup questions.\n\n### v1.6.2\n\n- **Version Bump**: Force Chrome Web Store CRX regeneration to resolve CDN caching issues.\n\n### v1.6.1\n\n- **🎛️ New Language Selector**: Searchable, two-column language menu with flags and modern \"pill\" trigger on the welcome page.\n- **💾 Cache Controls**: Added \"Cache summaries\" and \"Cache transcripts\" toggles to settings; transcript caching disabled by default, reducing RAM/disk usage.\n- **🔐 API Key Obfuscation**: Keys stored with XOR + Base64 encoding in chrome.storage instead of plaintext.\n- **🔧 Aligned Defaults**: Provider and model defaults now match across all entry points — Ollama + Gemini 3 Flash.\n- **🗑️ Quick Cache Clear**: One-click trash icon in the panel header to clear cached data.\n- **🔒 CI Security Checks**: Obfuscation and sender.id validation checks added to the CI pipeline.\n- **🌍 Welcome Page i18n Fix**: Fixed a bug where instruction steps, Validate button, and footer stayed in English when switching languages.\n\n### v1.6.0\n\n- **🎭 Random Voice Pairs**: Podcast voices are no longer always male-male. 10 voice pair combinations with male-female, female-male, and female-female options randomly selected per video. Uses Gemini TTS voices: Charon, Kore, Puck, Aoede, Fenrir, Leda, Orus, Zephyr.\n- **🌍 Multi-Language Welcome Page**: Onboarding page now supports 11 languages (English, Türkçe, Español, Français, Deutsch, 日本語, 한국어, 中文, Português, العربية, हिन्दी). Auto-detects browser language with manual language selector. RTL support for Arabic.\n- **📋 Inline Gemini API Key**: Removed \"Open Settings\" redirect. Users can now enter their Gemini API key directly inside the podcast panel without leaving the page.\n- **🔒 Security Audit**: Comprehensive code review — no XSS vectors, API keys stored safely in chrome.storage.local, all user input sanitized with escapeHtml, CSP enforced, no eval/document.write usage.\n- **📄 Privacy Policy**: Updated to include Google Gemini TTS data flow and host permission documentation.\n- **Step 3 updated**: \"How It Works\" now mentions the Podcast mode alongside Summary, Key Points, and Detailed Analysis.\n\n### v1.5.0\n\n- **🎙️ Gemini TTS Podcast**: Replaced Web Speech API with Google Gemini 2.5 Flash TTS\n  - Near-human quality voices (Charon for Alex, Puck for Sam)\n  - Multi-speaker audio generated as a single audio file\n  - Real audio player: play/pause, seek bar, 10s skip, speed control (0.75x–1.5x)\n  - Audio duration displayed, progress bar click-to-seek\n- **Gemini API Key**: New settings field for free Gemini API key (no credit card needed)\n- **Guided setup**: Step-by-step instructions shown when Gemini key is missing\n- **Region restrictions**: Friendly \"not available\" messages for unsupported regions (China, Iran, Russia, North Korea) in their native languages\n- **Error handling**: Specific messages for GEMINI_REGION_BLOCKED, GEMINI_RATE_LIMITED, GEMINI_KEY_MISSING\n\n### v1.4.0\n\n- **🎙️ AI Podcast**: NotebookLM-style two-host podcast generated from video summaries\n  - AI writes a natural conversation script between two hosts (Alex \u0026 Sam)\n  - Web Speech API plays it with two distinct voices — completely free, no extra API needed\n  - Full podcast player: play/pause, skip forward/back, speed control (0.75x–1.5x)\n  - Live subtitles showing who's speaking and what they're saying\n  - Scrollable transcript with click-to-jump navigation\n  - Podcast tab added alongside Summary, Key Points, and Detailed Analysis\n- New `podcast.js` engine: voice selection, state management, sequential speech playback\n\n### v1.3.0\n\n- **Fun Facts**: 50 rotating \"Did you know?\" facts displayed during AI processing to keep users entertained\n- **Default provider changed**: Ollama Cloud is now the recommended provider (was Groq)\n- **Recommended model**: Gemini 3 Flash set as default for Ollama Cloud\n- Welcome page, popup, and storage defaults all updated to reflect Ollama Cloud + Gemini 3 Flash\n- Facts rotate every 5 seconds with smooth fade animation\n\n### v1.2.3\n\n- Performance: ~3x faster for long videos (chunk size 24K → 80K, parallel processing)\n- Most 1-hour videos now fit in a single chunk — no pre-summarization needed\n- Remaining chunks processed in parallel batches of 3 via `Promise.all()`\n\n### v1.2.2\n\n- LRU cache algorithm: max 20 videos cached, oldest auto-evicted when limit is reached\n- Each video stores up to 4 keys (3 summaries + 1 transcript), max ~800 KB total\n- Cache reads update `lastAccessed` timestamp — frequently watched videos stay cached longer\n- `clearCache()` now also wipes the LRU index\n\n### v1.2.1\n\n- Fixed: Toggle button not appearing on SPA navigation (broadened content script matching)\n- Added: \"Summarize this video?\" start prompt — no API call until user clicks Start (saves credits)\n- Localized start prompt in 8 languages (EN, TR, ES, FR, DE, JA, KO, ZH)\n- Fixed: CI false positive on placeholder API keys\n\n### v1.2.0\n\n- Dual AI provider support (Groq + Ollama Cloud)\n- Complete UI/UX redesign (Inter font, card-based settings, underline tabs)\n- 20+ language support with flag emojis in selector\n- First-visit onboarding tooltip (\"Hey! I'm here\")\n- Robust 4-layer response parser (fixes all-tabs-same-content bug)\n- GitHub Actions CI/CD pipeline\n- Updated privacy policy for both providers\n- Marketing-focused Chrome Web Store descriptions\n\n### v1.0.2\n\n- Fix: credentials added to all YouTube fetch calls\n\n### v1.0.1\n\n- Fix: empty transcript bug in transcript extraction\n\n### v1.0.0\n\n- Initial release\n\n---\n\n## Contributing\n\n1. Fork the repo\n2. Create a feature branch (`git checkout -b feature/amazing`)\n3. Commit your changes\n4. Push and open a Pull Request\n\n---\n\n## License\n\nMIT License — free to use, modify, and distribute.\n\n---\n\n\u003cp align=\"center\"\u003e\n  Built for people who learn faster by reading.\u003cbr\u003e\n  Built by people who got tired of 45-minute videos with 3 minutes of useful content.\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcemroot%2Fyt-ai-summarizer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcemroot%2Fyt-ai-summarizer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcemroot%2Fyt-ai-summarizer/lists"}