Return YouTube Stars
YouTube's five-star rating, back on the watch page.
No ads, no tracking. Help pay for the server.
Install
Firefox 115 or later. There is no Chromium build.
From Mozilla Add-ons
The route to prefer. Updates arrive on their own and Mozilla has reviewed the code.
Add to Firefox
It launched just after sunrise on September 2, 2026. The Mozilla listing is not up yet, so until review clears, the source below is the way in.
Developer install
There is no signed build yet, so there is no permanent install. What exists is the source, and Firefox will load it temporarily.
Clone it, run node tools/package.js, then open about:debugging → This Firefox → Load Temporary Add-on and pick the built file.
A temporary add-on is removed when Firefox restarts. That is Firefox’s rule for unsigned code, not ours, and it lifts once signing is in hand.
Build it yourself
MIT licensed. No dependencies, no lockfile, no network access during the build. Node 22 and nothing else.
node tools/package.js
sha256sum dist/return-youtube-stars-*.xpi
Reproducible to the byte: ZIP timestamps are pinned, so the same source always gives the same file. Compare the hash against a download — if they differ, we want to hear about it.
Firefox will not permanently install an unsigned build, so a self-built copy is for reading and checking. Load it through about:debugging.
Other platforms
Firefox for Android can run extensions, but m.youtube.com is a different DOM and needs its own layout work, not a flag. It is on the list. A userscript for other browsers is planned and not yet written.
How the data moves
A privacy policy that says "we make four requests" is worth more if you can see what the four requests are.
Not a public API. These endpoints serve the extension, carry no compatibility promise, and there is no key to request. If you want the data, write and ask before scraping. The answer is probably yes.
The shape of it
The obvious design — ask the server about a video when you open it — tells the server every video you watch. That rules it out.
So ratings ship in bulk and the lookup happens locally: a base bundle, a small daily overlay for what changed, and a bloom filter to answer "is it in the set at all" first. Popular videos cost no request.
That leaves a long tail of rarely-rated videos, too many to ship to everyone. Those are fetched in buckets keyed by a hash prefix, so a request names a group, not a video.
GET /a/manifest.json
The only mutable document: the current version of each artifact, where to fetch it, and the long-tail geometry. Everything it points to is content-addressed and cached immutably. Refreshed on a daily alarm, jittered across twelve hours so a hundred thousand clients do not arrive at once.
GET the base, overlay and filter
Binary, identical for every user, addressed by content hash. The base is a minimal perfect hash over video ids with a quantised rating each, refetched only when its version changes. The overlay is the daily delta.
The URL comes from the manifest and its shape is checked against a closed set of known forms first — otherwise whoever served the manifest could point a privileged client anywhere, which is a request-forgery primitive for free.
GET /t/<version>/<prefix>
One long-tail bucket. The prefix is 12 to 24 bits of a hash of the video id, so the bucket holds a crowd and the request does not name the video.
It comes from the background page, so it does not carry YouTube's origin, and responses are cached.
POST /v
The only request carrying anything you did.
{ "uid": "<32 hex characters>",
"votes": [ { "v": "<video id>", "s": 4, "t": 1756200000000 } ] }
The entire body. No URL, referrer, session, device, locale or watch position; adding one would be a change to this page as much as to the code. Ratings go up in batches, and the identifier is stored only as a salted hash with the salt held server-side.
The server
Written in C, no dynamic allocation after startup, request path held to a fixed instruction budget CI enforces. More austerity than a rating service needs, and the reason is money: it has to survive on one small box.
Troubleshooting
Most reports land in one of these. If yours does not, tell us the video and your Firefox version.
The stars never appear
Check about:addons and confirm the extension is enabled. Patronising, and right often enough to be worth ten seconds.
Otherwise suspect another extension — a few replace YouTube's whole button row after we have rendered into it. Turn them off one at a time and reload.
One case is deliberate: if the like and dislike counts become unreadable, the original buttons come back. A row with a hole in it is worse than no row.
I see both the stars and the old buttons
Briefly on the first load in a fresh profile, expected — it does not yet know whether you run Return YouTube Dislike, and waits rather than hiding a row you wanted.
If both rows stay permanently, that is a bug. Report it with your other YouTube extensions listed.
The count is not going up
Ratings gather into a bundle that refreshes daily, so an hour-old rating is not in anyone else's average yet. Yours shows immediately; the community number moves on the next rebuild. A fresh number per video would mean asking the server about everything you watch.
The number looks wrong
Read the caption under the stars. If it mentions likes and dislikes you are looking at an estimate, not an average of real ratings, and the FAQ explains how it is computed.
If it names a small number, the average really is over that many people. Three ratings can average 4.67, and it prints that.
It says ratings are off
The creator turned ratings off for that video on YouTube's side. Like and Dislike are left alone. Your star rating is still recorded and still shared.
My rating vanished
Ratings live in your browser's storage, so clearing site data or reinstalling takes them with it. Nothing server-side is tied to you that could restore them — the design that makes the identifier unlinkable is what makes this unrecoverable.
It liked a video I did not want to like
Four and five stars press Like by default. Open the extension's options and tick Don't touch my YouTube account; your ratings keep working.
To undo one, click the same star again. That removes the rating and un-presses the Like.
Reporting something
Useful: the video URL, your Firefox version, your other YouTube extensions, and what the caption under the stars said. A screenshot of the button row saves a lot of back and forth.
Frequently asked questions
How the ratings are computed, what leaves your machine, and why this is Firefox only.
Where do the ratings come from?
From people using the extension. Your rating goes to our server and counts toward that video's average for everyone else.
The old YouTube star data was never released, so these numbers are being rebuilt from scratch. Early on you will hit videos with three ratings. Those say "3 ratings" and leave you to judge.
Why bring back five stars?
YouTube dropped them in 2010 because almost everyone picked five, so the scale was doing no work. Fair reading of their own data.
Then in 2021 they hid the dislike count, leaving something worse: a like count with no denominator. Forty thousand likes out of how many? A rating needs a scale and a sample size, and the watch page now gives you neither.
So this puts both back, with the sample size always visible.
Why does a video have a rating when nobody has rated it?
Because the like and dislike counts already on the page carry information, and discarding it would leave almost every video blank for a long time.
The conversion is stars = 1 + 4r, where r is the share of votes that are likes. Equal likes and dislikes lands on exactly 3.00. The ratio is shrunk toward the middle first, so four likes and no dislikes does not jump straight to five stars.
Two rules keep it honest: an estimate always carries a caption saying so, and its weight is capped at 26 real ratings, so it fades as real ratings arrive and is outvoted within a few dozen. No like data means no estimate — you get the empty state, not an invented number.
Is the average real or estimated?
The caption under the stars says so every time, and names the population. No branch anywhere prints an average without printing what it was computed over.
What do you collect?
Your ratings and nothing else: the video id, the star value, the time, under a random 16-byte number your browser generates once.
Not your YouTube or Google account, and not derived from anything about you. The server stores only a salted hash. Clear storage and you get a fresh one with no link to the old.
No analytics, no telemetry, no error reporting. The privacy policy lists the four places in the source that make a network request, and there is no fifth.
Does it know which videos I watch?
Not for most. Popular videos ship to your machine in a bundle, so the lookup is local and touches the network at no point.
Rare videos are fetched a bucket at a time, keyed by a hash prefix — a group, not the video you are on. Not quite anonymous: it says you are watching one of the videos in a bucket. Buckets are cached.
Does this work with Return YouTube Dislike?
Yes, deliberately. If RYD is installed its counts appear beside the stars instead of the two extensions fighting over the row.
It never calls RYD's API — where it uses their numbers, it reads what their extension already drew on the page. Their servers see nothing from us.
Can I stop it touching my YouTube account?
Yes, and your stars keep counting.
By default 4 and 5 press Like, 1 and 2 press Dislike, 3 presses nothing. One checkbox in the options stops all of it; your rating is still saved and shared, and nothing reaches your Liked Videos playlist. There is also a stricter mode where only 5 likes and only 1 dislikes.
Asymmetry is not offered — 4 likes but 2 doing nothing would nudge the like ratio upward on every rating. Changes apply to new ratings only.
Can I remove a rating?
Click the same star again. The rating comes off, and if it pressed Like on the way in, the removal un-presses it. It will not dislike anything on the way out.
Why Firefox only?
It was built against Firefox, not ported to it: event pages, the browser.* promise API, and tests that drive a real Firefox.
A port is not a recompile: service workers have a different lifecycle and storage behaves differently, and each difference is somewhere new for a bug to live. A userscript is planned, not written.
YouTube said five stars didn't work. Weren't they right?
About the distribution, yes: almost everyone picked 5, some picked 1, and 2 through 4 were nearly empty.
Whether it was useful is a separate question. A skewed distribution you can see beats a like count with the denominator hidden.
Who pays for this, and what's the catch?
No ads, no premium tier, nothing being sold. Also no funding, which is the honest answer and not a comfortable one.
Something else
If the widget is misbehaving, troubleshooting covers the common cases. Anything else: support@returnyoutubestars.com.
Donate
The extension is free. The server that stores every rating is not.
One address, on-chain. There is no subscription and no payment processor.
Bitcoin
One address, on-chain, no processor in between. Check it against a second source before you send anything — a mistyped address sends funds to nobody and the transaction still confirms.
bc1qj8uv3am6qcwywh76al64y4kn0h8yrx4t6jyl2l
What it pays for
Bandwidth and a machine. Nobody draws a salary and there is nothing to sell you. Paying changes nothing about what the extension does or stores, and the privacy policy is the same either way.
Privacy policy
Last updated 26 August 2026. Applies to version 1.0.0 and later.
Written from the code. Every claim names the file behind it; if the two disagree, the code is what runs and this page is the bug.
1. The short version
Your ratings live on your machine. Each also goes to our server — video id, star value, time — under a random number tied to no account, email or identity we keep.
One server, ours. No third party at all, Return YouTube Dislike included. No analytics, telemetry, error reporting or usage counters.
The part you would not guess: 4 or 5 stars presses YouTube's own Like button, 1 or 2 presses Dislike. That changes your real YouTube account. Section 6 has the off switch.
2. What stays on your machine
In IndexedDB and storage.local, under the extension's own origin:
- Your rating of each video — id, stars, timestamp, community average at the time.
lib/store.js. - Your settings, and whether you have seen the first-run notice.
- The random identifier from section 4, under the key
uid. - The downloaded ratings data: base artifact, daily overlay, bloom filter.
- Cached long-tail rows, in memory only.
No export, no sync, no server-side backup. Uninstalling takes the lot.
3. Everything that leaves your machine
Four requests exist in the source and no others, all to the single origin set at build time.
GET /a/manifest.json—event-page.js:470. Reveals that some installation asked for the current data version.GETbase, overlay, bloom filter —event-page.js:443. Content-addressed, identical for every user.GET /t/<version>/<hex>—event-page.js:1111. A hash prefix, never the video id. Section 5.POST /v—event-page.js:645. Your ratings. The only one carrying anything you did.
That last body, in full:
{ "uid": "<32 hex characters>",
"votes": [ { "v": "<video id>", "s": 4, "t": 1756200000000 } ] }
No page URL, referrer, user agent we add, session, device, locale, channel or watch position. Ratings post in batches, so arrival time says little about when you watched.
Outside our control: any HTTP request discloses your IP to us and to your network provider.
You can check the third-party claim yourself. The only other URL in the source is the SVG XML namespace, never requested. No XMLHttpRequest, sendBeacon, WebSocket, EventSource or remote scripts. Where it uses RYD's numbers it reads what their extension already drew on the page.
4. The identifier
Sixteen random bytes from crypto.getRandomValues, taken before the first rating goes out. lib/store.js.
- Not derived from anything about you, your hardware, your browser or your account.
- Not your YouTube or Google id — the extension never reads your account identity and asks for no permission that would let it.
- It exists so a new rating replaces an old one instead of counting twice.
- The server keeps only a salted hash of it. The client never has the salt; a salt the client holds is not a secret.
Clear storage or reinstall and you get a new identifier with no link to the old. Ratings already sent stay in the averages and can no longer be traced to you.
5. Looking up a video usually tells us nothing
Popular videos cost no request — their ratings are already on your machine.
Rare videos are fetched a bucket at a time, keyed by 12 to 24 bits of a hash prefix (lib/tail.js), never the id. A 12-bit prefix covers roughly a four-thousandth of the id space.
Calling that anonymous would be overselling it: the request says you are watching one of the videos in a bucket, and a narrower geometry means a smaller bucket. It comes from the background page, so it does not carry YouTube's origin, and buckets are cached so a video does not announce itself twice.
6. What a star does to your YouTube account
The notice shown before your first rating:
Rating 4 or 5 stars presses YouTube's Like button, which adds the video to your public Liked Videos playlist and feeds your recommendations. Rating 1 or 2 stars presses Dislike. Rating 3 presses nothing. Your star rating is always saved and shared with the community either way.
Liked Videos is public by default, so this can make a rating visible on YouTube's side. Nothing this extension publishes does that.
It works by clicking the real button, exactly as you would. The extension holds no YouTube credentials and sends nothing to YouTube.
Don't touch my YouTube account in the options switches it off entirely; your stars still count and still reach everyone else. A stricter setting makes only 5 like and only 1 dislike. Neither is retroactive.
7. Permissions
storage— the ratings and settings in section 2.alarms— the daily data refresh while the background page sleeps.*://www.youtube.com/*— to draw the widget and read the like and dislike counts already shown.- The API origin, for section 3.
It deliberately skips webNavigation, which would be convenient but triggers an "access your browsing history" prompt and grants more than this needs. It watches for navigation from inside the YouTube page instead.
No access to any site but YouTube and its own API. It cannot read your history, bookmarks, cookies, other tabs, or any other website.
8. What we do not collect
Spelled out, because "we only collect what we need" is not checkable and this is. No name, email, account id, password, payment details, contacts, location, advertising id, device fingerprint, browsing history, search queries, page content, keystrokes or screenshots. No watch history beyond the videos you rate. No analytics or crash telemetry.
9. Sharing, retention, choices
What gets published is the aggregate: the average and how many people it came from. Individual ratings and the identifier are never published, sold, rented or shared. There are no advertisers, analytics vendors or data brokers, because there is no code that could reach one.
A submitted rating stays in the aggregate for as long as the service runs; the salted hash means the server cannot connect it back to you.
Your choices: rate nothing and nothing is sent, since watching transmits nothing. Turn off the account presses and keep rating. Remove a rating. Or clear storage and uninstall, which erases section 2 and cuts the identifier permanently.
Not aimed at children, and collects nothing that would identify one.
10. Contact and changes
Questions: support@returnyoutubestars.com, the same address as the support contact on Mozilla Add-ons.
If what leaves your machine changes, section 3 changes, so that is the section to reread.