The pages of this site
- Home — the short explanation and the two choices.
- Movies & TV shows — score the movies and TV shows you have seen and get ten suggestions from a catalog of 144,069 titles. The search box covers all of them, so anything you remember is in there. Keeps named reference lists and a to-watch list.
- YouTube channels — the same idea for channels. This one asks the YouTube Data API live, so it uses a quota (see below).
- Support this site — a tip jar, a monthly option and the community chat, for anyone who wants to put something back. Nothing on it is required and nothing on it is tracked.
Both tools compute the estimate with a plain script in your browser. No server scores your taste, and there is no AI at all unless you switch the optional AI re-ranking on (see below) — which is for signed-in accounts and runs on your own API key.
Where the data comes from
- The catalog comes from Wikidata (CC0) and Wikimedia pageviews, with the Wikipedia Action API in between to link a page to its Wikidata item. For the movie/TV catalog that is all this site uses. The music catalog is the exception described in the next bullet. The YouTube page uses the official YouTube Data API v3.
- The music catalog is built from MusicBrainz's core data (CC0 — name, type and aliases) and from Wikidata (CC0 — genres, country and the popularity prior). It holds every artist MusicBrainz and Wikidata both know that has at least one Wikipedia page, and also the ones Wikidata has no genre for yet — those are labelled “genre not known yet” and score on era, kind and country only. The artist search box reaches further still: the acts that only MusicBrainz knows, with at least ten songs or two albums, come from its monthly core data dump (also CC0) and can be found and scored the same way, with the same “genre not known yet” label until a genre is added. MusicBrainz's tags, including its artist genres, and its ratings are supplementary data under CC BY-NC-SA 3.0: they may not be used commercially, so this site does not use them.
- IMDb data is deliberately not used — IMDb forbids scraping and reuse of its content, so there is none to license or strip out later.
- Wikipedia text is CC BY-SA 4.0 and Wikidata's structured data is CC0. Both are used through their official APIs, only facts are pulled (title, year, genre, …), and the sources are credited in the footer.
- The catalog is a snapshot: built from Wikipedia pageviews and Wikidata and then committed as a file, so it does not change between visits. The build date is in the footer of the movies page. A repeated search therefore mostly reflects your own edits — plus a genuinely fresher set of titles whenever the catalog is rebuilt. (The pageview API only gives the 1000 most-read articles per window, so “all of Wikipedia” is not something this can promise; the README explains how far it can be pushed.) The YouTube page is the exception: it asks YouTube live on every run, which is exactly why new channels show up there.
- No third-party movie or TV database is involved. The catalog is built from Wikimedia sources only, so there is no poster service, no external rating and no age rating to license, attribute or strip out later.
Accounts and what is stored
- Without an account everything stays in this browser (localStorage). You can score up to 10 titles in one list — everything else already works: the to-watch list, blocking titles, genre opinions, filters and the run history. The only guest limits are the size of that one list and that there is one of them. Clearing your browser data removes it, and another device starts empty.
- With an account you keep up to five named lists of 25 titles each, and all of the above — to-watch list, blocked titles, genre opinions, filters, run history — travels with the account: there again on your next visit and on every device you sign in on. You stay signed in on the device you used: the session is renewed quietly, and a temporary network problem never signs you out.
- Your runs are remembered too. Every time you ask for suggestions the app notes when it ran and which titles or channels came out (the last 24 runs per list, nothing older than about a year). That is what lets the next run say “3 of these 10 are new since your previous run” and mark a suggestion as NEW. It is part of your profile, so it follows your account — and it works in guest mode too. Clear run history wipes it.
- Only your e-mail address and those lists are stored. Passwords are hashed by the account provider (Supabase) and never stored in plain text; the database refuses to hand a profile to anyone but its owner (row level security).
- You can export or delete everything at any time — both are buttons in the page header on the movies page.
- Nothing is shared with third parties. One exception: the optional AI re-ranking is for signed-in accounts, and if you switch it on your list and the thirty strongest candidates go from your browser to OpenAI or DeepSeek with your own API key. You pay that provider for the tokens the run uses; this site never sees the key. Leave it off and nothing leaves your browser.
- The YouTube page uses the same account as the movies page: its reference, saved and hidden channels are part of the same profile. Your API key and the shared-key budget stay in this browser either way — Google's daily quota is spent per browser, not per account.
- Are accounts switched on for this copy of the site? If the Sign in / Create
account dialog says they are not set up yet, this copy runs in guest mode: it needs a free
Supabase project. Put its
Project URL and anon public key in
static/config.js, runsupabase/schema.sqlonce in that project's SQL editor, and the buttons start working — no other changes. Section 3 of the README walks through it.
Cookies & trackers
This site sets no cookies at all — not its own and not anyone else's. There is no analytics script, no advertising script and no social button that quietly phones home; even the typeface comes from your own computer instead of a font service. Nothing here can follow you to another site, because nothing here identifies you.
What the site remembers lives in your browser's own localStorage: your lists, your
scores, your filters, the theme you picked, and — only on the channels page — the API key you
pasted. None of it is sent anywhere. Storage that is needed for the thing you just asked for is
strictly necessary under the ePrivacy rules, so it needs no consent; clearing your browser
data wipes it.
That is why there is no cookie popup on this site. A banner here would be a lie: there is no tracking to accept, nothing to switch off, and asking anyway would only teach visitors to click “OK” without reading — the habit that makes real consent worthless. If personalised ads or analytics were ever added, that would change: consent would then be required before anything ran, and this page would say so, with a real consent tool behind the button.
One honest exception: on the channels page your browser talks to Google (the YouTube Data API and the channel avatars), so Google sees your IP address there. No cookie comes back and nothing is stored by them; the movies page works without any of it.
YouTube: why a key, the quota and your own key
- Why a key at all? The movies page ships with a catalog file; the channels page has none. The channels you might like are found through the YouTube Data API: your reference channels become a handful of searches, and everything they return is read once to compare it with your list. Google only serves that API with a key, and every call spends from a daily quota — that is why the page needs one.
- The channels page can ship with a shared API key, so you can use it straight away: no setup, no account. When the site does not provide one, paste your own key in the “API key & quota” panel near the bottom of that page — an own key is always used first.
- Google gives every project two daily allowances for the YouTube Data API: a separate bucket of 100 searches, and a shared pool for everything else (the channel and upload lookups). They reset at midnight Pacific time — 07:00 UTC in summer, 08:00 UTC in winter. One run with the default four searches uses four of the searches and only a small part of the pool.
- The shared key keeps a safety margin in that local meter, so the rest of the day stays free for other uses of the same project. When the meter is empty the page switches the shared key off for the day and asks for your own key.
- The meter in that panel counts in this browser. It cannot see other visitors or other tools using the same key, so treat it as an estimate — the quota in Google's Cloud console is the truth. If Google itself reports that the shared key is out, an orange notice at the top of the page says so and points to the key panel.
- A key in a static page is public: every visitor can read it. The owner must restrict it (HTTP referrers + API restrictions) in the Google Cloud console. Your own key is stored in this browser only and every call goes straight from your browser to Google.
- Stored channel statistics are kept for 30 days at most. YouTube's API policies do not allow an app to keep data like a subscriber count without the channel owner's authorization for longer (Developer Policies III.E.4.d), so a reference channel whose stored snapshot is older is read again before it is used — the page tells you when that is about to happen, and it costs one extra call per 50 channels. A refresh that fails (offline, no key) leaves the old snapshot alone and is retried on the next run.
- Your suggestions are filtered on the page: the Filters panel has two independent filters — a minimum/maximum number of subscribers, and a minimum number of uploaded videos. Both are applied to the candidates, so the ten suggestions all fit; the hard minimums of the API client (at least one uploaded video and 100 subscribers) always apply on top.
- Using this page also means agreeing to the YouTube Terms of Service — the link is in the footer of the channels page, together with Google's privacy policy, which the YouTube API Services Terms of Service ask to be linked as well — and this site is not endorsed by or affiliated with YouTube. The channel data is attributed with the official YouTube logo next to it, as the YouTube Branding Guidelines require.
How the estimate is calculated
Both pages use the same deterministic engine — a content-based recommender with no AI involved: your scores become feature weights (genre, creator, decade, country and language on the movies page; topics, tags, title words, size and upload pace on the channels page), every candidate is scored against that profile plus a small popularity prior, and the raw score is squashed into a 0-100% estimate. A mild diversity rule picks the final ten.
The full walkthrough, with the formulas and the constants, is on each page itself: how the percentage is calculated (movies) and the same for channels. The optional AI re-ranking is explained under AI re-ranking.
⚠️ Estimates, not facts. They come from a script: the catalog is limited, genres are broad labels, and taste is more than a list of scores. A hint, not advice.
If this site ever carries ads
- Personalised ads and analytics need consent before they run (GDPR/ePrivacy), normally through a certified consent tool. Without consent only non-personalised ads are allowed.
- Affiliate links must be disclosed (“this site earns a commission from these
links”), and ad networks additionally demand a privacy policy and an
ads.txt. - Income from ads or affiliates is taxable, and in the Netherlands usually means registering with the KVK and dealing with VAT.
- The catalog carries no such condition. It is built from Wikidata (CC0) and Wikipedia pageviews through their official APIs, and no third-party movie or TV database is involved — so no licence forbids ads, affiliates or fees.
- The YouTube API does allow it, with four conditions. The Developer Policies
list an “ad-enabled blog or website that uses YouTube API Services” as a permitted
commercial use (III.G.2.c), but you may not:
- sell advertising, sponsorships or promotions that sit on or within YouTube video content or the player without YouTube's written approval (III.G.1.c) — so no ad overlay on a video, and our cards only show a thumbnail and a name;
- sell ads on a page with YouTube API data unless the other, non-YouTube content on that page offers enough independent value that the ads would still be justified without the YouTube data (III.G.1.d) — the recommender is that content, but a page that was only YouTube data would not qualify;
- charge users to watch a video in an embedded player (III.F.3.a) — so never put playback behind a paywall;
- show disruptive commercial messages or advertisements (III.I.20) — no pop-ups or interstitials.
Details worth knowing
- The catalog is built from popular Wikipedia articles, so it skews to well-known and recent titles; niche and older ones can be missing from the printed lists. A suggestion run therefore scores the complete catalog of ~144,000 movies and TV shows (about 4 MB, loaded once and then cached by the browser) — the set that also sits behind the search box. Titles neither set has can be added by hand, with their genres.
- The movies page works offline once loaded (the catalog is a committed JavaScript file); the complete catalog behind the search box is cached by the browser after its first download. The channels page needs an internet connection and quota for every run.
- Percentages are relative to your own list, not an absolute quality score: 90% for one list is not the same as 90% for another.
- Data in your browser:
whattowatch.profile.v3(your lists and settings, plus awhattowatch.ui.v1for folded lists),whattowatch.session.v1when you are signed in,whattowatch.youtube.v1for the channels page,whattowatch.theme.v1for the light/dark choice andwhattowatch.ai.v1for the optional AI settings — your own API key included, but only while “remember these settings in this browser” is ticked. Deleting those keys (or clearing site data) removes everything the site kept. - What an AI run costs you. The request carries your list and the thirty strongest candidates, and the provider bills you for those tokens plus the answer. The input is the expensive half, so the pool is kept at thirty and the answer is capped; after each run the page shows the tokens the provider reported (“1.234 tokens in, 210 out”) — the number your bill is made of.