Chrome extension that overlays the IMDb user rating on every title card while browsing Netflix, Prime Video, Hulu, HBO Max, Apple TV, Disney+, Paramount+ and Tubi. Each card gets a small badge with the rating. On Netflix, Prime Video and Hulu, hovering a title opens the site’s own preview, which gets an IMDb line with the year and vote count; click that line to open the IMDb page. HBO Max has no preview, so there the badge on the card is the link. A show’s episode list gets a rating next to every episode, season by season (click one to open that season on IMDb). Each site is a small adapter file, so more services can be added.
| Site | Card badge | Hover details / title pages | Episode lists | Notes |
|---|---|---|---|---|
| Netflix | top-right of each tile, also on New & Popular, its “coming soon” rows included (a title not out yet that shares a name with an older film can show that film’s rating until its preview, which has the year, corrects it), and on episode cards (“Hooked from the First Episode”); top-left of the show window’s “More Like This” cards (the running time is top-right) | line under the preview popup’s buttons; in the featured banner, a chip beside Play / More Info; in the full show window, a line under the buttons | in the show window’s episode list, after each title | episode cards and their preview name only the episode: the show is worked out once per episode from Netflix’s own page; the popup’s type and year lines pick the right same-named title and also correct the card |
| Prime Video | top-right of each tile; hidden while the card is expanded | chip in the expanded card’s metadata row; in the top banner, a chip beside the Watch now button; on a title’s own page, a chip in the metadata row after the year | on a series page (one page per season), after each episode heading | season suffixes stripped; movie/series type and, on title pages, the year passed along |
| Hulu | top-right of each tile; top-left of the tall “Because you watched” cards | line under the preview panel’s metadata; also in the top banner; on a series page, a chip after its metadata | on a series page, after each “S2 E1 - …” tile title | movie/series type from the link path; a series page’s year tells a revival from the original |
| HBO Max | bottom-right of each poster | none (HBO Max has no hover preview); the badge tooltip works; in the top banner, a chip beside the Watch button; on a title’s own page, a chip in the My List / Rate / Trailer row | on a show page, after each episode title | title parsed from the tile’s accessibility label; movie/series type from the link path |
| Apple TV | top-right of each poster; Continue Watching tiles get their show’s rating top-left (Apple’s logo is top-right) | none (no hover preview); in a room’s top banner and on a title’s own page, a chip in the metadata line (“TV Show · Drama”, age rating) | on a show page, on each tile’s “EPISODE 3” line; all seasons share one scrolling row, and each tile’s season is worked out from its position and the season picker | movie/series type from the link path, year from the title page |
| Disney+ | top-right of each poster and Continue Watching tile | none (no hover preview); in the home page banner, a chip in the rating / year / genre line; on a title’s own page, a chip under the “1998 – 2005 • 8 Seasons” line | in the Episodes tab, after each episode title | titles from the poster art’s alt text or the tile’s label (badges, “Hulu Original Series” and network names stripped); year from “Released 2006” where the row gives it; live sports, playlists and collections skipped |
| Paramount+ (includes Showtime) | top-right of each tile | none (no hover preview); in the home page banner, a chip under the title; on a show’s own page, a chip under the genre / year / seasons line | on a show page, after each episode’s “41M · Nov 13, 2022” line | movie/series type from the link path (/movies/video/, /shows/); a show page’s year is the first season’s; movies open straight into the player, so they are rated on tiles only; live-game rows, brand and collection tiles skipped |
| Tubi | top-right of each poster, and of each thumbnail in a title page’s “You May Also Like” list | Tubi’s own banner already shows an IMDb score; on a title’s own page, a chip in the “Crime · 2003 · 16 Seasons” line | on a series page, in each episode’s “1 hr 40 min” line | movie/series type from the link path; year passed only for movies (a series’ year is a recent season’s) |
| Letterboxd (optional since 1.3) | top-right of each poster on browse grids, lists, watchlists, diaries and profiles; posters under 60 px wide are left alone | none (Letterboxd’s own hover shows its rating); on a film’s own page, a chip under the credits | none (films only) | films only, so the year on every poster makes the match exact; off until ticked under Sites, which asks the browser to allow letterboxd.com |
chrome://extensions, turn on Developer
mode, click Load unpacked and pick the show-imdb-ratings folder.)www.amazon.co.uk/gp/video, say, with Prime Video picked as the
site whose pages it serves): the browser asks to allow that address,
and it gets a row and a tick of its own. Changes apply to open tabs at
once; a site just allowed needs its tab reloaded.IMDb publishes its ratings as daily data dumps, licensed for each person’s own non-commercial use. The extension builds its database from them in your browser: it downloads about 280 MB from IMDb, keeps films and series with at least 25 votes (about 420,000 titles; films include TV films, TV specials, direct-to-video releases and shorts, shorts only from 100 votes) and the episodes of those series, and stores the result in the browser’s IndexedDB. Lookups then happen locally, with no requests to anyone.
Nothing downloads until you click Update now on the settings panel the first time. That first build lands in two stages: the titles go live as soon as the title list has been read, so badges start showing while the episode list is still downloading.
Titles in other languages (off by default). The streaming sites show titles in your profile’s language (“Zadzwoń do Saula” for Better Call Saul), and IMDb’s title list has only the English and original names, so with a profile in another language the translated titles get no rating. Tick Match titles in other languages on the panel, tick the languages you use in the list that appears (your browser’s language and any seen on a streaming page come pre-ticked), and click Get titles (ticked before the first build, they come with it, no extra click). The extension streams IMDb’s list of titles by country once (520 MB pass through, the biggest of the files; nothing is saved as a file) and keeps the useful part, the names of the database’s titles in every supported language, about 50 MB in the browser’s database. The languages you ticked are then keyed from that as extra names for the same ratings, and ticking another language later takes seconds, with no download. The full rebuild fetches a fresh list once the kept one is three months old. An English browser on English pages has no use for any of this, which is why it is off. Unticking the option stops the matching but keeps the list, so turning it back on costs no download; Delete database removes it. The languages written in the Latin alphabet (Polish, German, French, Spanish, Portuguese, Italian, Dutch, the Nordic and most Central European languages, Turkish, Indonesian, Vietnamese) are covered, and since 1.2.2 so are Korean, Japanese, Chinese, Russian, Ukrainian, Bulgarian, Greek, Hebrew, Arabic, Thai and Hindi: titles in those scripts are matched character for character after case and compatibility folding. How far each goes is set by IMDb’s data, which names nearly every title in Japanese and Hindi, about 150,000 in Cyrillic, 71,000 in Chinese, 43,000 in Greek and under 6,000 in Korean (Ozark, Stranger Things and Squid Game have a Korean name; Breaking Bad and Better Call Saul are listed for Korea in English). On Netflix that gap is closed another way: a card named in another script also gets its English name from Netflix’s public page of the title, read once, signed out, as episode cards already do to find their show, and that name is looked up first. Other sites have no such page, so there a Korean profile gets what IMDb names in Korean. Arabic (2,400 names), Hebrew and Thai (500 each) are listed for those other sites’ sake. Someone who set languages up before 1.2.2 and ticks one of these sees Get titles instead of Apply once, since the kept list from before has no rows for them. Netflix’s own labels (a show’s “5 Seasons”, the season dropdown, “Show” or “Movie”) are read in English, Polish, German, French, Spanish, Portuguese, Italian and Dutch; in other languages titles still match, but the hints that tell a 2026 series from a same-named 1955 film are lost.
After that the refresh is sized to what changes. Once a week only the
ratings file (about 9 MB) is re-read and every stored rating updated in
place; it also counts the titles that have been rated since the last full
build. The full rebuild (all three files, about 280 MB) runs monthly, and
sooner once that count of waiting titles is large. Both intervals can be
changed under Advanced on the panel: the ratings weekly, every two weeks
or monthly; the full rebuild monthly, every two or every three months,
which costs little with a working OMDb key covering new titles meanwhile,
or only when you click Update now, for a capped connection that can take
the 9 MB but not the 280. The panel shows the
title count, the dates of the last full build and ratings update, the next
refresh with its size and due date, and progress; Update now is always
a full rebuild, and Update ratings only under Advanced runs the 9 MB
ratings pass by hand. Cancel, next to the progress bar, stops a build where
it is: nothing changes until the new titles are switched live, which happens
in one step; after that they stay, with the episodes left to the next full
rebuild. The automatic refresh can be
switched off there, which is the thing to do on a metered connection. A failed
build (offline, say) is retried a day later, and so is one that was cancelled. An update that changes how the database is stored
(FORMAT in db.js) also rebuilds it once, whatever its age; with the
automatic refresh off, the panel asks for Update now instead.
OMDb only. With an OMDb key the database can be skipped: choose OMDb only under “Ratings from” at the top of the Ratings database section. Every lookup then goes to OMDb (1,000 a day, each answer remembered for 30 days), and no database is built, refreshed or consulted. Chosen before a key has passed Test, the cursor lands in the key field and the status line says no ratings show until one does. One that exists is kept, unused, so switching back costs no download (Delete database under Advanced frees its space); without one, choosing Local database again brings Update now back, and nothing downloads until it is clicked.
No ratings data ships with the extension and none is in this repository: the data is IMDb’s, and their licence covers your own copy, not redistribution.
Lookups go: stored answers, then the local database, then OMDb for titles the database doesn’t have (brand-new releases, titles under 25 votes), if a key is set. The Use OMDb box on the settings panel switches all OMDb traffic off, the extra scores included; under OMDb only it stays on. An OMDb answer that names an IMDb ID is kept for good: from then on the title’s rating comes from the local database by that ID (the weekly ratings file includes titles the database has no name for yet), falling back to OMDb’s copy, and the title is never sent to OMDb again. A name the full rebuild learns later still wins.
| File | Role |
|---|---|
manifest.json |
Manifest V3. One content-script entry per required site, each loading that site’s adapter and then content.js; host permissions for datasets.imdbws.com (the dumps) and omdbapi.com; optional host permissions for the optional sites and a catch-all for addresses the user adds. |
sites-list.js |
The table of sites: adapter name, label, addresses, required or optional. Shared by the background (registrations), the settings page (the Sites list) and the tests (which check the manifest against it); also the address checks for the add row. |
sites/netflix.js, sites/primevideo.js, sites/hulu.js, sites/hbomax.js, sites/appletv.js, sites/disneyplus.js, sites/paramountplus.js, sites/tubi.js, sites/letterboxd.js |
Site adapters: which elements are title cards and hover previews, how to read the title (and movie/series type where available), and where the badge goes. |
content.js |
Generic: watches the page, looks up titles as cards come near the viewport, draws badges, refreshes stale ones in the background. |
background.js |
The background’s shell (a service worker; an event page in Firefox, see below): the event listeners, the message router for the content scripts and the settings page, the settings window, the status report, and the content-script registrations for optional sites and added addresses while the browser grants them. |
lookup.js, omdb.js |
Answering the content scripts: remembered answers in chrome.storage.local first, then the local database, then OMDb (with a concurrency limit, a daily request count and a pause after a limit error). |
refresh.js, languages.js, build.js |
The automatic refresh (what is due and when), the languages chosen for titles in other languages, and the database build as the background drives it (its state, the hidden page, cancel). |
db.js |
The local ratings database in IndexedDB, shared by the service worker (lookups), the build (writes) and the settings (status). Ratings live in a table by IMDb ID that the weekly pass rewrites. |
builder.js, build-worker.js |
Build the database from IMDb’s data dumps in a web worker: the full build in two stages (titles, then episodes) and the weekly ratings-only pass. |
offscreen.html/js |
Hidden page that hosts the build worker, since the service worker can’t run minutes of work itself. |
store/ |
Store listing text, screenshots and the scripts that build the store ZIPs and the icons. Not part of the extension. |
badge.css |
Badge styling, including per-site placement tweaks. |
options.html, options.js, options-text.js, options-languages.js |
The settings page: database build and status, per-site on/off, badge options, OMDb key entry and test, usage counter, clearing remembered ratings, deleting the database; its texts and its languages section in the two smaller files. |
The same code runs in Firefox 140 or later. manifest.json is Chrome’s;
store/build-zip.ps1 builds both store ZIPs, and the Firefox
one gets a manifest generated by store/firefox-manifest.mjs.
What differs:
background.js as an event page (with
the other background scripts listed before it) instead of a service worker, and has no
offscreen documents, so the database build page (offscreen.html) goes
in a hidden frame of the background page. Firefox unloads an idle event
page after about 30 seconds, but every message it receives resets that,
and the build page reports progress several times a second plus a
heartbeat every 10 seconds.To try it without the store: build the ZIPs, open about:debugging, click
This Firefox → Load Temporary Add-on… and pick
dist/imdb-ratings-v<version>-firefox.zip. It stays until Firefox
restarts.
Create sites/<name>.js defining window.IMDBEXT_SITE in the same shape as
the existing adapters: a targets list where each entry has a kind
(card or detail), a selector, titleOf(el) (a title, or a list of
candidates tried in order), host(el), and
optionally typeOf(el) (returns movie or series), yearOf(el) (a
four-digit release year) and place(host, badge). Add the site to the
table in sites-list.js as an optional one, with its addresses, and its
match patterns under optional_host_permissions in the manifest (the
tests check the two agree). No content-script entry: the eight required
sites keep theirs, and every site since is optional, so that an update
never makes Chrome switch the extension off for its users to accept a new
site. Put any site-specific badge positioning in badge.css. The
existing adapters’ header comments record what each site’s markup looks
like.
Or point Claude Code at this folder, paste the site’s URL, and say “add this one.”
n/a. OMDb’s title search is loose, so an answer
whose title isn’t the one asked for (ignoring case, punctuation and a
leading “The”) is treated as a miss rather than shown; the badge tooltip
says what OMDb offered. Misses are re-checked after three days, and the
full database rebuild picks new titles up once they have 25 votes.Built with Claude Code (Anthropic’s AI coding assistant), which wrote the code; I designed it, tested it on the streaming sites and published it.
Information courtesy of IMDb (https://www.imdb.com). Used with permission. The ratings come from IMDb’s non-commercial datasets, which IMDb allows for personal and non-commercial use with this attribution.