DEV Community

Cover image for I built my first Chrome extension to copy YouTube transcripts — here's what I learned
Ergashev Maksud
Ergashev Maksud

Posted on

I built my first Chrome extension to copy YouTube transcripts — here's what I learned

I watch a lot of YouTube — lectures, tech talks, podcasts. And I kept doing the same thing over and over: open the transcript panel, scroll, select all, copy, paste into ChatGPT or Claude. Every time it was messy — broken lines, timestamps mixed in, no formatting.

So I decided to build a Chrome extension to do it for me. I had zero experience with browser extensions before this.

What it does
It adds a small button inside the YouTube player. You click it, and you get the full transcript in a clean overlay. From there you can:

Copy or download as Markdown, plain text, SRT, or VTT
Search inside the transcript
Click any timestamp to jump to that moment
Switch between subtitle languages
Send the text directly to Claude or ChatGPT
No AI, no accounts, no tracking. Just the text.

What I learned building it
YouTube doesn't make it easy. There's no public API for transcripts. I had to reverse-engineer how YouTube loads captions internally — through InnerTube endpoints, timedtext XML, DOM scraping, and signed URLs that expire. Some videos (like TED talks with community captions) need a completely different approach than regular videos.

Publishing on the Chrome Web Store is painful. I got rejected twice before getting approved. First time for unclear permissions justification, second time for a screenshot that didn't meet their size requirements (1280x800). The review process takes 1-3 days each time, so every rejection costs you a week.

The manifest v3 migration is real. Most tutorials and Stack Overflow answers are still for manifest v2. If you're building a new extension in 2026, you're dealing with service workers instead of background pages, and content scripts run in an isolated world by default — which means you can't access YouTube's page variables directly without injecting a MAIN world script.

The hardest part
Language switching. YouTube renders its transcript language dropdown as a custom Polymer component (tp-yt-paper-item inside iron-dropdown). The same component is used for the comments sort dropdown ("Top" / "Newest"), so you have to distinguish between them. And for videos with community-contributed captions, the timedtext API returns empty — you have to physically click through YouTube's own UI to switch languages.

Try it
If you work with YouTube transcripts regularly, feel free to check it out:

YT Transcript on Chrome Web Store

Free: 10 exports/month. If you need more — $7 one-time, no subscription.

This was my first extension and first time publishing anything. Happy to answer questions about the process.

Top comments (0)