Departed Fall 2024
Palo
YouTube · Browser extension · Archived
[image: Heimler's History APUSH Unit 4 video — slide on the American System — with the Palo sidebar injected where suggested videos normally live, showing a three-sentence Louisiana Purchase summary and a clickable [02:19] timestamp]
Departure
APUSH review videos run an hour and the one sentence I needed about the Louisiana Purchase was buried somewhere around minute 32. ClipChat — my first attempt — was a chat box stapled to YouTube with no real search and no instinct for where in the video the answer lived. Palo was the rewrite: inject a sidebar into the YouTube DOM, scrape the transcript, hand it to Gemini, and get back a three-sentence summary with a clickable [02:19] that drops the playhead exactly there.
Approach
- Manifest v3
- JavaScript
- Gemini
- ExtPay
- GitHub Pages
Chrome extension — content script can touch the DOM but not Chrome APIs, background service worker holds the keys and the quota, transcript has to be scraped because YouTube doesn't expose it.
Field log
Sep 2024 — the pain
Drowning in video content. YouTube has billions of videos and finding the right one is only half of it — locating the one specific minute inside the video is the part nobody solved. Scrubbing, skimming, pausing, repeating. The whole point of the next thing I built had to be that motion.
Spring 2024 — ClipChat, the first attempt
Simple chat interface inside YouTube, powered by an LLM, answers questions from the transcript. Built it for APUSH note-taking. The early concept lived on grid paper before it lived in code.
[image: ClipChat hand-drawn early wireframe — Heimler's History video header at top, then a hand-drawn box labeled 'input box' with a circled 'send' button, and below that a chat thread labeled 'words word words' with a wavy 'Assistant Response' and a 'reply' button to a 'Previous chat']
Spring 2024 — why ClipChat didn't work
The UI/UX was clunky. The core thing — searching inside the video — wasn't intuitive or effective. No real users, no data telling me what to fix. I shelved it.
[image: ClipChat shortcomings collage — left, two dark-mode mobile screens (a profile page with Following/Followers/Likes and an analytics dashboard); middle, a YouTube video titled 'GREAT AWAKENING' (APUSH Period 2) covered in dense hand-written digital annotations; right, a desktop YouTube comments section where a 'You' user asks 'whats this video about' and an 'Assistant' replies 'I don't have access to the video transcript or the video itself']
Summer 2024 — sketching v2 on grid paper
Different modes, better searching, better interface. A sidebar that didn't fight the YouTube layout, with a 'chat' tab and a 'search' tab that returned timestamped results.
[image: ClipChat v2 wireframe on grid paper — APUSH Unit 3 Review video at top, then a hand-drawn sidebar with 'chat' and 'search' tabs, blue notes pointing to 'Changes Modes Chat or Search', sketched assistant/user bubbles annotated 'summarizes the text' and 'outputs bullet point notes', and a Search tab below showing results like '02:41 text contents...' and '19:37 some more text contents...']
Nov 2024 — Palo, the rewrite
Instant summaries, ask questions, jump to key moments — all without leaving the YouTube interface. Same APUSH Unit 4 video as before, but this time the assistant tells me the Louisiana Purchase was a big win for America that put Jefferson in a constitutional bind, and hands me [02:19] as a link.
Nov 2024 — three things in a trench coat
Architecturally Palo is a syringe, a YouTube, and a Gemini. The content script injects the sidebar box into the DOM. It fetches the transcript of the current video. Whenever you prompt it, it bundles the transcript and the question and hands it to the Gemini API.
Nov 2024 — anatomy of a Chrome extension
manifest.json holds the metadata — name, version, permissions, file list. content.js runs inside the page and can touch the DOM but can't talk to Chrome APIs. background.js (service-worker.js, in MV3) sits behind everything, talks to chrome.* APIs, and answers messages the content script sends it. Plus the auxiliary files: a guide.html that walks people through getting their own Gemini key if they want to, an options.html for settings, a plans.html for the paid tier.
[image: Dark-themed file explorer of the PALO 2 directory — a 'scripts' folder, then a flat list including google-analytics.js, content.js, ExtPay.js, guide.html, guide.js, manifest.json, options.html, plans.html, service-worker.js, plus a stack of numbered logo PNGs and step-by-step guide images]
Nov 2024 — the prompt
The Gemini prompt is a stack of pseudo-XML tags — system_prompt, output_style, timestamp_guide, timestamp_formatting, video_metadata, video_transcript, chat_history, user_message. The model gets a persona (friendly YouTube assistant named Palo), a strict format rule for timestamps ([mm:ss]), the full scraped transcript with metadata, the running chat, and finally the new question. Lock the format, then let it talk.
[image: Dark-themed code editor showing a JavaScript template literal called format_prompt — pseudo-XML tags <system_prompt>, <output_style>, <timestamp_guide>, <timestamp_formatting>, <video_metadata>, <video_transcript>, <chat_history>, <user_message> — inside, instructions to keep responses short and conversational and to format every timestamp as [mm:ss]]
Nov 2024 — making timestamps clickable
A regex .replace finds every [mm:ss] in the assistant's response, converts it to total seconds, and rewrites it as an <a> with an onclick that grabs the page's <video> element and sets video.currentTime. A second .replace chain converts asterisks and \n into <strong>, <em>, <br>. The output is a chat bubble where every cited time is a real link into the video.
[image: Two stacked dark-themed code screenshots — top: a JavaScript .replace on a [mm:ss] regex that calculates total seconds and emits an <a> anchor with an onclick that sets the YouTube <video> element's currentTime; bottom: a markdown-to-HTML .replace chain (asterisks to <strong>/<em>, newlines to <br>) — and a light-blue 'Assistant' chat bubble underneath rendering bolded 'C programming language' and 'compilers' with clickable blue [02:13] and [06:11] links]
Nov 2024 — background message listeners
service-worker.js is one big chrome.runtime.onMessage.addListener switch: trackEvent fires Google Analytics, reloadPopup re-renders the active tab, checkUserPaid runs through ExtPay, openPayment opens the Stripe page, fetchQuota checks chrome.storage.sync — resets the count daily, and hands out 1747 messages to paid users vs 20 to free, decreaseQuota decrements unless the user is unlimited, openPlansPage and openOptionsPage create new tabs.
[image: Wide two-column dark-themed code screenshot of the Palo background script — chrome.runtime.onMessage.addListener with case branches for trackEvent, reloadPopup, checkUserPaid (via ExtPay), openPayment, fetchQuota (1747 paid / 20 free, daily reset via chrome.storage.sync), decreaseQuota, openPlansPage, openOptionsPage]
Nov 2024 — demo
[image: Browser mockup showing a YouTube watch page (youtube.com/watch?v=RRubcjpTkks) — a young man speaks to camera with a circular semi-transparent loading spinner overlaid on his nose, standard YouTube transport bar showing 0:00 / 13:59, light-grey placeholder rectangles below for the title/channel/description, with the words D-E-M-O V-I-D-E-O stacked vertically down the left margin]
Nov 2024 — Chrome Web Store upload
Listing for 'Palo - Youtube AI Chat Assistant'. Icon, website (paloai.github.io), supplementary video and images, description with Top Features / Completely FREE / Instant Video Summaries. The part nobody warns you about: every host permission and every storage permission needs a written justification — fetching analytics IDs, user preferences, API keys, the context of the YouTube video the user is watching.
[image: Chrome Web Store listing for 'Palo - Youtube AI Chat Assistant' — labeled callouts pointing to Icon, Website (paloai.github.io), Supplementary Video and Images, Description, beside a separate developer dashboard panel titled 'Permission justification' with text boxes for storage and host permission justifications]
Oct 2024 — the landing page
paloai.github.io. Blue curved header, the Palo logo and bird mark, five yellow stars and a 5.0 rating, a white 'Install on Chrome' button next to a blue 'Learn More'. Below that, a screenshot of the extension in the wild on a 'Why is this number everywhere? 37' video.
Oct 2024 — getting the word out
Show HN as a high schooler asking for feedback. Product Hunt listing. A Reddit post from a stranger calling Palo 'one of the most useful' YouTube summarizers they'd found. Instagram reels. YouTube Shorts retention split was 51.9% viewed vs 48.1% swiped. The @aipalo Twitter account got suspended before it ever pulled traffic — never found out why.
[image: Marketing collage — Product Hunt card with 'Install now for FREE' and 9 upvotes, a Reddit post by user Standard-Accident258 calling Palo 'one of the most useful' YouTube summarizers, a dark grey Twitter/X popup over a half-visible @aipalo tweet reading 'This account has been suspended', the Instagram palo.ai profile with a 'THE BROCCOLI TASTE' Reels cover, and a YouTube Studio Shorts dashboard showing 1.1K shown, 563 views, 51.9% Viewed vs 48.1% Swiped]
Oct 18, 2024 — the peak
Google Analytics line peaked just over 30 active users on the Chrome extension page. Top countries: United States 112, India 19, Germany 13, Canada 9, United Kingdom 8, Brazil 7, Philippines 7. install event count 102, total users 77.
[image: Google Analytics screen — left, a blue line chart of active users on the Chrome extension page from Sep 22 to Nov 03 with a clear spike past 30 around Oct 18; right, a world map shaded by user density next to a country table led by United States 112, India 19, Germany 13, Canada 9, United Kingdom 8]
Late Oct 2024 — Chrome Stats
User count 73, climbing +8 in a day, +13 in a week. Average rating 4.83 across 6 ratings, flat as a pancake (in a good way). SEO position 77,247 overall — buried — but the trend was up: +2540 in a day, +3557 in a week. 'assistant' keyword position 135, 'chat' keyword position 148, both climbing.
[image: Chrome Stats data table — User count 73 with green +8 day / +13 week and a steadily climbing sparkline; Average rating 4.83 with flat sparkline; Rating count 6 with flat sparkline]
Nov 2024 — the future I sketched
Prompt optimization to dodge Gemini's safety blocks (or swap providers). A $0.99/month Palo+ subscription via ExtPay — daily message quota, 10+ premium themes, dark/light, an ad-free experience. +10 hour video support, +40 languages, smart speed, instant timestamps. Everything that didn't ship before the transcript apocalypse.
[image: Feature collage — three rounded 'Focus' theme buttons (green/blue/orange), a 'Personalized Palo' tower of mini chat panels in different theme colors, a 'Dark or Light' split, a chat bubble titled 'Faster info every video' with a [251:08] timestamp, a 3D Palo logo tile, an 'Easy Timelines' bullet list of timestamps, and a Palo+ pricing card with a blue 'POPULAR' sash offering Unlimited Video Summaries, Unlimited Chat Messages, 10+ Premium Themes, and Ad-free Experience]
Summer 2025 — the silence
YouTube blocked the transcript API. Active-user line dropped to absolute zero overnight. The error dialog spammed every install: 'There was an error fetching the transcript.' The feedback form filled with the same complaint, two weeks running, before I sat down to fix it.
Summer 2025 — triage
Googled 'youtube transcript' and worked through the third-party services. Most were 404s. The ones that resolved CORS-blocked the extension — their server expected requests from their-site.com, the browser refused. Vatis Tech returned Access-Control-Allow-Origin: * — wildcard, usable from a content script. That was the unlock.
[image: Troubleshooting layout — top left, Google search for 'youtube transcript' surfacing third-party tools; center left, a 'Free YouTube Transcript Generator' page above a 'Page Not Found' 404; top right, a CORS diagram showing the Palo extension blocked by a Strict API Server (red X, 'expects their-site.com') vs the Palo extension allowed through a Vatis API Server (green check, 'Access-Control-Allow-Origin: *'); bottom right, a chat interface footer reading 'Powered by Transcript by Vatis Tech']
Summer 2025 — key cycling and the Python recipe
Replicated the two-step process of the Python youtube-transcript-api in JS — findBestTranscript prioritizes manual English transcripts over auto-generated, then falls back. Wrapped Vatis with an apiKeys array and a getApiKey() that reads chrome.storage.local: if the date has rolled over, reset the index to 0; if a key hits its rate limit, cycle to the next one. The extension started breathing again.
[image: Two side-by-side JavaScript code screenshots — left: const apiKeys = [...] array of strings, then async function getApiKey() that reads chrome.storage.local for the stored date and current index, resets to 0 on a new day, and cycles to the next key on rate-limit failure; right: a function findBestTranscript that prioritizes manual English transcripts and a fetch chain that manipulates URLs to bypass basic restrictions, captioned 'exactly replicating the reliable, two-step process of the youtube-transcript-api Python library']
From the gallery
[image: paloai.github.io landing page — blue curved header with the Palo bird logo, five yellow stars and a 5.0 rating, white headline 'Chat with Youtube Videos Using AI', subheadline 'Save time on long videos, get key ideas instantly with Palo', a white 'Install on Chrome' button beside a blue 'Learn More →', and below the fold a 'Why is this number everywhere? 37' video with the Palo sidebar injected on the right]
[image: Chrome Web Store dashboard — Palo user count 73, average rating 4.83 across 6 ratings, growing +8/day and +13/week, with a steadily climbing sparkline trend]
[image: User feedback bug report from the Palo Chrome Extension Feedback/Feature Form — 'has been broken for the past 2 weeks... shows failed to load transcript']
[image: Active-user line graph dropping to absolute zero on the day YouTube blocked the transcript API, with a thick red vertical line marking the drop and a red error dialog beside it reading 'There was an error fetching the transcript. Please ensure this video has a transcript. If it does, reload the page.']
[image: CORS diagram — top half: Palo extension → Strict API Server, red X at the browser, server expects their-site.com; bottom half: Palo extension → Vatis API Server, green check at the browser, server returns Access-Control-Allow-Origin: *]
What I came back with
73 users, 4.83 stars, survived a transcript apocalypse
Lesson from the terrain
Shipping to real users is the part the side projects had been missing — a feedback form full of 'it's been broken for two weeks' hits differently than a localhost console.log. The fragile part of Palo was never the model or the prompt; it was the scrape. The whole product depended on a transcript endpoint YouTube never promised would stay up, and the day it didn't, every install on the Chrome Web Store turned into the same red dialog at the same time. CORS, rate limits, and key rotation aren't features — they're the cost of building on someone else's platform without permission.
Cross-links
This fed into / from