A browser extension that tells you whether the media you're browsing is already in your Plex library.
When you visit a movie or TV show page on a supported site, Parrot shows a badge indicating whether it's in your library, what rating it has, and — for movies — which other films in the same collection you're missing. Library items link directly to the content in Plex Web.
Companion to ComPlexionist — ComPlexionist finds gaps in your library; Parrot prevents you from hunting for something you already have.
![]() |
![]() |
| The in-page badge — Plex, rating, resolution, and completeness for collections / series | The popup — library counts, API status, and the current page's metadata |
- Library status badge on 17 supported sites — dark pill with gold/gray Plex chevron
- Resolution display — see media quality (SD, 720p, 1080p, 4K) on badges and the popup dashboard
- Zero-config community proxies — free Radarr and Sonarr proxies provide movie and TV metadata out of the box; no API keys needed for basic functionality, just configure your Plex server
- Media ratings — up to 6 sources for movies (TMDB, IMDb, Rotten Tomatoes, Metacritic, Trakt) and TVDB rating for TV shows
- Deep linking — badges link directly to the item in Plex Web
- Collection gap detection — see which movies from the same collection are in your library and which are missing
- Episode gap detection — on TMDB and TVDB TV show pages, see a season-by-season breakdown of missing episodes
- Multi-server support — configure multiple Plex servers with priority ordering
- Remote access — auto-detects your server's
.plex.directURL so the badge keeps working when you're away from home (requires Plex Remote Access enabled) - Dynamic toolbar icon — gold border when the current page is in your library, gray when it isn't, light gray on unsupported pages
- Built-in update flow — gold "!" badge on the toolbar when a new release is on GitHub, with a one-click download from the options page
- A Plex server with media libraries
- Your Plex authentication token (how to find it)
- (Optional) A TMDB API key — the community proxy handles movie metadata and most ratings; a TMDB key adds TV show ratings and serves as a fallback (get one free)
- (Optional) A TVDB API key — the Sonarr proxy provides episode data; a TVDB key serves as a fallback for episode numbering (get one)
- (Optional) An OMDb API key — the Radarr proxy provides IMDb ratings for movies; an OMDb key serves as a fallback (get one free)
- Download the latest
parrot-X.Y.Z-chrome.zipfrom the Releases page - Unzip it to a folder you'll keep (the extension loads from disk, not from the zip)
- Open
chrome://extensions/, enable Developer Mode, click Load unpacked, and select the unzipped folder
npm install
npm run buildThen load in Chrome:
- Open
chrome://extensions/ - Enable Developer Mode
- Click Load unpacked
- Select the
.output/chrome-mv3/folder
Click the Parrot extension icon in the toolbar. You'll see the setup form:
- Enter your Plex server URL (e.g.
http://192.168.1.100:32400) - Enter your Plex token
- Click Save & Sync — Parrot will index your library
Once the library is indexed, browse to any supported site and the badge will appear next to the title.
The options page gives you full control over Plex servers, API keys, gap detection thresholds, supported sites, and the update flow. Open it via the gear icon in the popup or via chrome://extensions/ → Parrot → Details → Extension options.
- Browse to a supported movie or TV show page
- Parrot extracts the media ID from the page URL or DOM (via URL match, JSON-LD
sameAs, or a link scan) - The ID is checked against an in-memory index of your Plex library (auto-refreshed every 7 days)
- The badge appears next to the title showing library status, rating, and resolution
- For movies in TMDB collections, a gap panel shows which titles you own and which are missing
- For TV shows in your library, an episode gap panel shows missing episodes by season
Fields are separated by · and are added dynamically as data arrives:
| Pill | Meaning |
|---|---|
[Plex] (gray) |
Not in your library |
[Plex] (gold) |
In your library (no extra data yet) |
[Plex · 7.2 · 1080p] |
In your library, with rating + resolution |
[Plex · 7.2 · 1080p · Complete] |
All collection movies / show episodes accounted for |
[Plex · 7.2 · 1080p · Incomplete] |
Some collection movies or show episodes missing |
| Red pill with tooltip | Error reaching Plex or the API |
The Plex part links to Plex Web. The Complete / Incomplete part toggles a floating gap panel anchored to the badge — no page layout shift.
When viewing a movie that belongs to a collection, Parrot shows a panel listing which films in the set are in your library and which aren't. This works even for movies not yet in your library — if the collection is partially complete, the badge upgrades to Incomplete with the full panel.
The check runs against the Radarr community proxy first (no API key required) and falls back to TMDB.
When viewing a TV show that's in your library on TMDB or TVDB, Parrot shows a collapsible season-by-season panel. Contiguous fully-complete or fully-missing seasons are grouped into ranges (e.g. S1 - S12 269/269); partial seasons list the missing episode numbers compactly (e.g. S1 6/10 (e3-5, e10)).
The check works out of the box via the Sonarr community proxy. It falls back to the TMDB or TVDB v4 API when configured.
Click the toolbar icon on any media page to see a summary: library counts, server-link, ratings from every available source, collection info (when applicable), resolution, and show status (returning / ended) for TV.
![]() |
![]() |
| Site | What Parrot reads |
|---|---|
| BBC iPlayer | Title matching from URL slug + DOM title |
| IMDb | IMDb ID from URL |
| JustWatch | Title matching from h1 text |
| KickassTorrents | IMDb link or unlinked IMDb URL in the description, title from release slug |
| Letterboxd | TMDB/IMDb from page links |
| Metacritic | IMDb from JSON-LD sameAs, title matching fallback |
| NZBForYou | IMDb from page links, link scan fallback (TMDB/TVDB/TVMaze) |
| NZBGeek | TMDB/IMDb/TVDB from page links |
| Plex | PlexKey from URL (server items), link scan / title fallback (discover) |
| PSA | Title matching from URL slug |
| RARGB | TMDB/IMDb/TVDB from page links |
| Rotten Tomatoes | Title matching from URL slug |
| TMDB | TMDB ID from URL (movies + TV) |
| Trakt | TMDB/IMDb/TVDB from page links |
| Trakt App | TMDB/IMDb/TVDB from page links |
| TVDB | TVDB ID from page links (series + movies) |
| TVMaze | TVDB/IMDb via TVMaze API (shows only) |
Most things work without any API keys thanks to the Radarr and Sonarr community proxies. Configure user keys only when you want fallbacks or extra data sources.
| Key | What it adds | When to bother |
|---|---|---|
| TMDB | Movie + TV metadata fallback, TV episode counts, ratings | Recommended — fills in gaps from the proxies |
| TVDB | More accurate TV episode numbering for shows that differ between providers | Only if Sonarr proxy data looks off |
| OMDb | IMDb ratings for movies where Radarr lacks them | If you want IMDb scores on niche / new movies |
If you have Plex Remote Access enabled on your server, Parrot can keep working when you're away from home — no VPN, no port forwarding, no Plex Pass needed.
When you save credentials, Parrot calls the official plex.tv/api/v2/resources endpoint and auto-populates the Remote URL field with your server's .plex.direct URL. At runtime, the extension tries the local URL first, falls back to the remote URL on network failure, and remembers the working choice per server for the session.
If a library refresh fails on every configured URL (typically because the server rebooted onto a new IP address), Parrot self-heals: it re-fetches the server's current addresses from plex.tv, updates both URLs, and retries automatically. Only when that also fails does the popup show a red Plex indicator and a "check your Plex server settings" warning.
You can also enter or edit the Remote URL manually — useful if your public IP changes or auto-detection fails. See docs/Remote Access.md for the full design.
Parrot checks GitHub for new releases once a day. When an update is available, a gold "!" appears on the toolbar icon and an Update Parrot button shows up in the About card on the options page:
Clicking it opens the Chrome ZIP asset for the new release directly. After the download finishes, replace your existing unpacked folder with the new contents and click Reload on the Parrot card at chrome://extensions/.
Chrome doesn't allow side-loaded extensions to auto-install — this manual reload step is the trade-off for distributing outside the Chrome Web Store.
npm install # one time
npm run dev # dev mode with hot reload (Chrome)
npm run dev:firefox # dev mode (Firefox)
npm run build # production build
npm run zip # build + zip for release
npm test # run all tests
npm run lint # lintVersion format: Major.A.B (e.g. 1.20.0)
| Segment | Meaning | How it changes |
|---|---|---|
| Major | Major version | Manual edit in package.json |
| A | Commit number | npm run version:commit (resets B to 0) |
| B | Build number | Auto-incremented on every npm run build |
See CLAUDE.md for a tour of the codebase, and docs/Parrot spec.md for the full specification including data flow, message types, and the URL resolution strategy.
- TypeScript (strict mode)
- WXT — Vite-based browser extension framework
- Manifest V3
- Vitest (378 tests as of v1.26.0)
MIT










