Last Updated: 2026-08-27 Submission status: not yet submitted. See Blockers.
Extension Name
Transcript to PDF for YouTube
Short Description (117 characters)
Turn any YouTube video’s transcript into a formatted PDF. Runs entirely in your browser — no server, no account.
Detailed Description
Export the transcript of any YouTube video as a clean, formatted PDF, without uploading anything to anyone.
Paste a link — watch?v=, youtu.be, /shorts/, /embed/, /live/, or just the video ID — or let the extension read the video you already have open. Choose the caption language from whatever the video offers, including auto-generated tracks, then export.
What you get:
A PDF with the video’s title, channel, and source URL, and the transcript grouped into readable paragraphs rather than a wall of one-line caption cues. Timestamps are optional, and so is the paragraph grouping, so you can also get raw cues if that is what you need.
A Print option that renders through Chrome instead. Use this for Japanese, Chinese, Korean, Russian, Arabic, Greek, Hebrew, and any other script — the built-in PDF writer handles Latin text only, and the Print path handles everything.
A Copy button, if you would rather paste the text somewhere than save a file.
How to use it:
About privacy:
This extension has no server, no account, no analytics, and no third-party code. Your transcripts never leave your computer — the PDF is generated in your browser and saved directly to your downloads. The only site the extension can reach is youtube.com, and it requests pages without your cookies attached, so it cannot see who you are on YouTube or act on your behalf.
A note on how it works:
Since 2024, YouTube requires a browser-issued token on caption downloads. When a direct request is refused, the extension falls back to reading the transcript panel that YouTube itself renders — which sometimes means briefly opening the video in a background tab and closing it again. If a tab is already open on that video, that tab is reused instead.
Videos without captions cannot produce a transcript; there is no speech-to-text. Age-restricted and private videos are not accessible.
Support and source:
The extension is open source under the MIT licence. Report a problem or read the code at https://github.com/mithudso/youtube-transcript-to-pdf
Category
Productivity
Single Purpose
Exports the transcript of a YouTube video as a PDF file.
Primary Language
English
All generated by scripts/build-store-assets.mjs followed by
scripts/compose-store-screenshots.py. Sources live in store-assets/.
| Asset | Dimensions | Status | Filename |
|---|---|---|---|
| Store Icon [REQUIRED] | 128×128 PNG | ✅ Ready | icons/icon-128.png |
| Screenshot 1 [REQUIRED] | 1280×800 | ✅ Ready (live capture) | store-assets/screenshot-1-popup.png |
| Screenshot 2 [RECOMMENDED] | 1280×800 | ✅ Ready | store-assets/screenshot-2-pdf.png |
| Screenshot 3 [RECOMMENDED] | 1280×800 | ✅ Ready | store-assets/screenshot-3-viewer.png |
| Screenshot 4 | 1280×800 | ⬜ Not created | |
| Screenshot 5 | 1280×800 | ⬜ Not created | |
| Small Promo Tile [RECOMMENDED] | 440×280 | ✅ Ready | store-assets/promo-tile-small.png |
| Marquee Promo Tile | 1400×560 | ⬜ Not created |
The icon is generated by scripts/generate-icons.py: a white page with a
turned-down corner and lines of text, on the project’s red field. It replaced an
earlier play-triangle mark that read as YouTube’s logo.
Provenance. Screenshot 1 is a capture of the running extension, taken by hand from a real export and cropped to the popup alone — no browser chrome, no tabs, no personalised page content. It shows a genuine run: 255 caption lines, auto-generated captions, resolved via the transcript panel.
Screenshots 2 and 3 are rendered from the extension’s own markup, stylesheets,
and PDF writer, so the document and the print view are genuine output. Their
transcript text is authored sample content
(store-assets/sample-transcript.json), written for this repository so the
assets carry no third-party material.
Screenshot 1 was recaptured from a clean screenshot rather than the screen recording, so the popup’s colours match the real UI — the earlier frame was taken with a capture overlay active and read muted.
Plain-text versions ready to paste into the dashboard are in Paste-ready permission justifications below. Use those, not this table — the pipes and backticks here are markdown.
| Permission | Type | Justification |
|---|---|---|
tabs |
permissions | Reads the URL of the active tab so the extension can prefill the input with the video the user is already watching, and searches open tabs for one already showing the requested video so it can reuse that tab instead of opening another. Tab URLs are used in memory only and are never stored or transmitted. |
scripting |
permissions | Injects a single content script into a YouTube video tab, on demand, to read the transcript panel. This is required because YouTube refuses direct caption downloads that lack a browser-issued token, so the only reliable source is the panel YouTube renders itself. The script is not declared in the manifest and therefore never runs unless the user has asked for a transcript. |
storage |
permissions | Stores two booleans — whether timestamps and paragraph grouping are enabled — so the user’s formatting choices survive closing the popup. Also used to pass the transcript from the popup to the printable page, where it is deleted immediately after rendering. Local only; chrome.storage.sync is not used. |
downloads |
permissions | Saves the generated PDF to the user’s downloads folder. This is the extension’s primary output and there is no other way to write the file. |
https://www.youtube.com/* |
host_permissions | Fetches the video’s watch page, which carries the title, channel, and caption track list, and fetches the caption track itself. Also the page into which the transcript reader is injected. |
https://m.youtube.com/* |
host_permissions | The same, for users whose open tab is on the mobile YouTube host, so an already-open tab can be reused rather than opening a duplicate. |
The extension deliberately does not request <all_urls>, cookies,
webRequest, history, identity, or nativeMessaging. A youtu.be host
permission was removed during development once it was confirmed that all URLs
are normalised to youtube.com before any request is made.
The dashboard’s justification fields are plain text. Paste from here, not from the table above — the table’s pipes and backticks are markdown and show up literally in the form.
There is one box per permissions entry, and a single combined box for all
host permissions.
Reads the URL of the active tab so the extension can prefill the input with the video the user is already watching, and searches open tabs for one already showing the requested video so it can reuse that tab instead of opening another. Tab URLs are used in memory only and are never stored or transmitted.
Injects a single content script into a YouTube video tab, on demand, to read the transcript panel. This is required because YouTube refuses direct caption downloads that lack a browser-issued token, so the only reliable source is the panel YouTube renders itself. The script is not declared in the manifest and never runs unless the user has asked for a transcript.
Stores two booleans - whether timestamps and paragraph grouping are enabled - so the user’s formatting choices survive closing the popup. Also used to pass the transcript from the popup to the printable page, where it is deleted immediately after rendering. Storage is local only; chrome.storage.sync is not used, so nothing is uploaded to a Google account.
Saves the generated PDF to the user’s downloads folder. This is the extension’s primary output and there is no other way to write the file.
The extension fetches the YouTube watch page for the video the user asks about, which carries the title, the channel, and the list of available caption tracks, and then fetches the caption track itself. That same page is where the transcript reader is injected when YouTube refuses a direct caption download. www.youtube.com is the desktop host that serves video pages. m.youtube.com is requested only so that a tab the user already has open on the mobile host can be reused instead of opening a duplicate. No other host is requested, and the extension cannot reach any other site.
Does the extension collect user data? No.
| Data Type | Collected? | Transmitted Off-Device? | Purpose | Shared with Third Parties? |
|---|---|---|---|---|
| Personally identifiable info | No | No | — | No |
| Health info | No | No | — | No |
| Financial info | No | No | — | No |
| Authentication info | No | No | — | No |
| Personal communications | No | No | — | No |
| Location | No | No | — | No |
| Web history | No | No | — | No |
| User activity | No | No | — | No |
| Website content | No | No | — | No |
Notes for the reviewer. The extension reads the active tab’s URL and the
content of YouTube watch pages in order to function, but neither is collected:
both are used transiently in memory and neither is stored or transmitted
anywhere. The only network destination is youtube.com, and requests are made
with credentials: 'omit', so the user’s YouTube session is never attached.
The extension contains no analytics, no error reporting, no remote code, and no
third-party dependencies.
Privacy Policy URL
https://mithudso.github.io/youtube-transcript-to-pdf/PRIVACY.html
Verified live and serving the policy (HTTP 200) on 2026-08-27. Source:
PRIVACY.md, published via GitHub Pages from main.
Visibility: Public Regions: All regions Pricing: Free
Publisher Name: Mitchell Hudson
Contact Email: mitch@tsiser.net
Support URL: https://github.com/mithudso/youtube-transcript-to-pdf/issues
Homepage URL: https://github.com/mithudso/youtube-transcript-to-pdf
Store-assigned item ID: jpjnpjipphcgjgmabbgenoaepojffkle
This differs from the unpacked development ID and is permanent for this listing.
| Version | Date | Changes | Status |
|---|---|---|---|
| 1.0.0 | 2026-08-27 | Initial listing. Package uploaded, listing and privacy tabs filled. | Draft |
All cleared.
scripts/generate-icons.py. Text lines are dropped below 32px, where they
would blur, leaving a silhouette that still reads at 16px.manifest.json, this file, README.md,
PRIVACY.md, docs/INSTALLATION.md, and the PDF Producer string.The extension was run against a real video before submission: the transcript resolved via the transcript-panel strategy (255 lines, auto-generated captions), the PDF downloaded, and the print path rendered. Screenshot 1 is a capture from that run.
Worth stating up front to a reviewer, since each could otherwise look like a defect:
?. The built-in PDF
writer uses the standard Helvetica fonts, which are Latin-1 only. This is why
the Print option exists, and it is described in the listing.None — not yet submitted.