Josh Ramirez
← Back to the journal

Departed Fall 2024

Palo

YouTube · Browser extension · Archived

Slide 6 of the original deck — the moment the sidebar stops being a chat box and starts being a way through the video.

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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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.

  8. 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.

  9. 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.

  10. 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.

  11. Nov 2024 — demo

  12. 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.

  13. 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.

  14. 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.

  15. 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.

  16. 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.

  17. 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.

  18. 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.

  19. 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.

  20. 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.

From the gallery

Slide 15 — the marketing site that fed Show HN, Product Hunt, and Reddit.
What growth looks like before YouTube pulls the rug.
The form I'd added 'just in case' became the only thing telling me how dead the extension was.
The 'Palo: Fixed' opening slide. Hard to misread.
Why one third-party transcript provider worked and the other four didn't.

What I came back with

73 users, 4.83 stars, survived a transcript apocalypse

paloai.github.io

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