YouTube now answers the InnerTube `player` endpoint with LOGIN_REQUIRED for requests that carry no session, and the extension deliberately sends none. `videoDetails` therefore returned nothing for almost every video, which broke two things at once: cards on channel pages, where YouTube omits the channel link because you are already on the channel, and the watch page panel, which starts every render with that same call. `next` returns the channel id and the exact view count without a session, so videoDetails reads from there instead. A live stream reports "watching now" in the same field, so that text is filtered out rather than read as a view count. Channel pages no longer need the fallback at all: the cards belong to the channel in the address bar, so pageChannel() reads it from the URL. That also drops one request per card. The panel took the video length from the player response to tell Shorts apart; `next` does not carry it, so it comes from the page's own player element. test/check.js probed videoDetails with dQw4w9WgXcQ, which keeps answering even on the broken endpoint and kept the suite green through all of this. It now probes a current video from the channel it just listed, and asserts the view count as well as the channel id.
Outlier Badge
A Firefox extension that puts an outlier score on the corner of every YouTube thumbnail. Score = the video's views divided by the median views of its channel's last N videos. The median is a deliberate choice: a single viral video would drag a mean upward and make everything else on that channel look like it never outperformed. Shorts are scored against the channel's Shorts, regular videos against regular videos, and live streams enter no pool at all. The watch page also gets a panel with the score's details and the channel's recent view distribution.
No server, no API key, no account: the extension calls YouTube's own internal
(InnerTube) endpoint from inside youtube.com, without session credentials. One
request per channel, cached in storage.local for 24 hours by default, and cards
are only processed once they scroll into view.
Installing
Get it from addons.mozilla.org.
To run this checkout instead: about:debugging#/runtime/this-firefox → Load
Temporary Add-on → the manifest.json here, which disappears when Firefox
closes.
Using it
The toolbar icon opens the settings: turn badges off, skip Shorts, pick the baseline size (last 15/30/60/90 videos), hide scores below a threshold, set the cache lifetime, choose the interface language, and clear the cache. The same popup reports how many cards were scanned and scored in that tab, which is where you look first when a badge fails to appear. The interface is available in English and Turkish, following the browser's language by default.
To exercise the parsing and scoring logic without opening a browser, run
node test/check.js (it makes one real channel call too).
Known limits
- YouTube hands out rounded view counts ("1.2M views"), so the score is an approximate ratio rather than an exact one.
- Videos under 7 days old have not gathered their views yet and score lower than they deserve. The dot next to the badge marks them.
- The baseline is the channel's last N videos, not its whole history. On a growing channel an old video scores higher than it should.
- Members-only videos never expose their view counts, so they neither join a baseline nor get a score.
- With fewer than 3 videos left in the pool no score is computed and no badge appears.
- InnerTube is an unofficial interface. If YouTube renames its fields the badges disappear; the page itself keeps working.
License
GPL-3.0-only. See LICENSE.

