Every value below is copy-paste ready from CHROMEWEBSTORE.md. Work through this in order; the dashboard will not let you submit until every required field is filled.
Budget about 45 minutes for a first submission, most of it the one-time account setup. Review then takes anywhere from a few hours to a couple of weeks.
This cannot be automated. Chrome blocks all scripting of the extensions gallery origin — both
chrome.google.com/webstore/*andchromewebstore.google.comreturn “The extensions gallery cannot be scripted” to any extension that tries, including browser-automation tools. That protection exists precisely so an extension cannot publish or install things on your behalf, so there is no flag or permission that lifts it. Every step below is done by hand.
You need:
cd /Users/mitch/dev/youtube-transcript-to-pdf
git pull
npm run check
Expect: manifest OK, 31 tests passing, doc indexes OK.
Then reload the unpacked extension at chrome://extensions and run it once
against a real video. The packaged build is the same code, so if the unpacked
one works, the zip works.
Confirm the privacy policy is live — a dead URL is an automatic rejection:
curl -sI https://mithudso.github.io/youtube-transcript-to-pdf/PRIVACY.html | head -1
Expect HTTP/2 200.
npm run build
unzip -l dist/youtube-transcript-to-pdf-1.0.0.zip
Expect 24 files: manifest.json, icons/, src/, LICENSE. If you see
docs/, test/, scripts/, or store-assets/, stop — something changed in
the packaging script.
The file you will upload is:
dist/youtube-transcript-to-pdf-1.0.0.zip
Mitchell Hudson and
your Contact email to mitch@tsiser.net, then verify the email. Google
sends takedown and policy notices there, so it has to stay monitored.Publishing is blocked until the contact email is verified.
dist/youtube-transcript-to-pdf-1.0.0.zip.manifest.json, so the name and
version populate themselves.If it rejects the upload, the message names the manifest field at fault.
| Field | Value |
|---|---|
| Name | Transcript to PDF for YouTube (already filled from the manifest) |
| Short description | The 117-character line under Short Description in CHROMEWEBSTORE.md |
| Detailed description | The whole Detailed Description block. Paste as plain text — the store strips markdown, which is why it is already written without bullets |
| Category | Productivity |
| Language | English |
Graphics, all from store-assets/:
| Slot | File |
|---|---|
| Store icon (128×128) | icons/icon-128.png |
| Screenshot 1 | store-assets/screenshot-1-popup.png |
| Screenshot 2 | store-assets/screenshot-2-pdf.png |
| Screenshot 3 | store-assets/screenshot-3-viewer.png |
| Small promo tile (440×280) | store-assets/promo-tile-small.png |
Leave the marquee tile empty; it is only used for featured placements.
Additional fields:
https://github.com/mithudso/youtube-transcript-to-pdfhttps://github.com/mithudso/youtube-transcript-to-pdf/issuesThis is where submissions usually fail. Take it slowly.
Single purpose — one sentence:
Exports the transcript of a YouTube video as a PDF file.
Permission justifications — one box per permission. Paste from the Permissions Justification table in CHROMEWEBSTORE.md. Every box needs a specific reason; “required for functionality” is rejected. The six are:
tabs, scripting, storage, downloads, and host access to
https://www.youtube.com/* and https://m.youtube.com/*.
Are you using remote code? → No, I am not using remote code.
Everything the extension runs is in the package. There are no dependencies, no
CDN scripts, and no eval.
Data usage — leave every checkbox unchecked. The extension collects nothing. Then tick all three certifications:
Privacy policy URL:
https://mithudso.github.io/youtube-transcript-to-pdf/PRIVACY.html
The policy text and these checkboxes must agree. Both say “nothing is collected”, so they do.
The item moves to Pending review.
The rejection email names a policy section. Common causes for an extension shaped like this one, and what to do:
| Rejection | Fix |
|---|---|
| Trademark / brand confusion | Already mitigated: the name is “for YouTube” rather than leading with it, and the icon is a document rather than a play triangle. If it still trips, the next lever is dropping “YouTube” from the name entirely. |
| Permission not justified | Expand the specific box the email names. Say which user-visible feature breaks without it. |
| Privacy policy mismatch | Re-read PRIVACY.md against the data-usage checkboxes. They must say the same thing. |
| Screenshots do not show the product | Screenshot 1 is a capture of the running extension. If they want more, add a second live capture showing the saved PDF. |
| Single purpose too broad | The stated purpose is already one sentence and narrow. Do not broaden it. |
Fix, bump the version in both manifest.json and package.json, rebuild,
and upload again. Record the rejection and the fix in the Rejection History
table in CHROMEWEBSTORE.md.
manifest.json and package.json.npm run check && npm run buildThe version must be strictly higher than the published one, or the upload is rejected.