Skip to content
primetime43Public

About

Find the movies and TV shows missing from your media library — and fill the gaps in one click.

Topics

Resources

Stars

30 stars

Watchers

4 watching

Forks

Repository files navigation

GAPS 2

Find the movies and TV shows missing from your media library — and fill the gaps in one click.

GAPS 2 connects to your Plex, Jellyfin, or Emby server, looks at what you own, and tells you what's missing from each collection or franchise. Own Alien (1979)? It flags Aliens (1986) and Alien³ (1992). Own Yellowstone? It surfaces 1883 and 1923. Then it can hand those titles straight to Radarr or Sonarr to download.

A modern, full-stack rewrite of the original GAPS (Gaps A Plex Server) — Python/Flask backend, Angular 19 frontend.

Why GAPS 2

  • Discover gaps automatically — point it at a library and it finds every incomplete collection (movies) and franchise (TV) for you
  • Act on them instantly — send missing titles to Radarr/Sonarr to download, without leaving the app
  • Set it and forget it — scheduled scans keep watch and notify you (Discord, Telegram, Email) when new gaps appear
  • Runs anywhere — a single Docker container or local development, all from one port

Features

Find what's missing

  • Multi-server support — Plex (OAuth), Jellyfin, and Emby
  • Find missing movies from TMDB collections, and missing TV shows from TheTVDB's official franchise lists
  • Discover similar movies and TV shows from a title you own, using TMDB recommendations with owned/missing status
  • Unified "Missing" view with a Movies / TV Shows toggle — browse a library, scan it for gaps, or click a single title to check just its collection/franchise
  • Find gaps by actor/actress — search a performer (e.g. Will Smith) on the Actors page and see their full filmography split into what you own and what you're missing

Act on the results

  • Send to Radarr / Sonarr — add missing movies (by TMDB id) and shows (by TheTVDB id) directly from the results
  • Filter & refine — show/hide owned, hide future (unreleased) titles, ignore individual titles or whole collections
  • Export gap lists to CSV/Excel

Automate & stay informed

  • Independent scheduled scans for movies and TV, each with its own cadence
  • Notifications via Discord, Telegram, and Email
  • User preferences — default library, items per page, language, hide owned, and more

Deploy your way

  • Responsive dark-themed UI (Angular 19 + Bootstrap 5)
  • Dockerized deployment with persistent, encrypted configuration
  • Automated Docker releases via GitHub Actions to Docker Hub and GitHub Container Registry
  • Optional in-app switching between Stable, Develop, and a specific release

Quick Start

Docker

Pull from Docker Hub:

docker run -d -p 4277:4277 -v gaps2-data:/app/data primetime43/gaps-2:latest

The same image is also published to the GitHub Container Registry if you prefer to pull from there:

docker run -d -p 4277:4277 -v gaps2-data:/app/data ghcr.io/primetime43/gaps-2:latest

Or use Docker Compose:

docker compose -f docker/docker-compose.yml up -d

The app will be available at http://localhost:4277.

Development builds: unreleased changes on the develop branch are published to both Docker Hub and the GitHub Container Registry on every push. Use these for testing upcoming features — they are not considered stable.

docker pull primetime43/gaps-2:develop
# or
docker pull ghcr.io/primetime43/gaps-2:develop

Persist /app/data. GAPS encrypts saved settings (API keys, tokens, server URLs) in backend/data/config.enc. The encryption key lives next to it as .config.key, so both files must be on a persistent volume — otherwise every container recreation generates a fresh key and the old config becomes unreadable. The docker run example above and the Compose file already mount /app/data; if you write your own command (e.g. an unRAID template), make sure the mount is there. To override the key explicitly — for moving between hosts or sharing a config across replicas — set the GAPS2_CONFIG_KEY environment variable to a Fernet key (output of python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())").

To switch between Stable, Develop, and a specific version from Settings > Updates, see the in-app release switching guide.

Images of v2.8.0

Click to view screenshots of version 2.8.0 Screenshot 2026-06-19 005444 Screenshot 2026-06-19 005343 Screenshot 2026-06-19 005600 Screenshot 2026-06-19 005659 Screenshot 2026-06-19 005723 Screenshot 2026-06-19 010229

Images of v2.1.0

Click to view screenshots of version 2.1.0 image image image image image

Development

See the development guide for prerequisites and local setup.

Usage

  1. Go to Settings > TMDB and enter your TMDB API key (required for movies)
  2. (Optional, for TV) Go to Settings > TheTVDB and enter your free TheTVDB API key
  3. Go to Settings > Plex/Jellyfin/Emby and connect your media server
  4. Go to Missing, choose Movies or TV Shows, pick a library, and click Scan for Gaps — or click a single title to check just its collection/franchise
  5. Go to Actors, search an actor or actress, and see which of their movies you own vs. are missing
  6. (Optional) Configure Radarr and/or Sonarr in Settings to send missing titles straight to your downloaders
  7. (Optional) Configure scheduled scans (separate cadences for movies and TV) and notifications in Settings

Radarr destinations

In Settings > Radarr > Library root folders, map each movie library to the corresponding root folder configured in Radarr. Choose the path as Radarr sees it, even if Plex uses a different Docker mount path. Mappings are saved separately for each media-server type, server name, and library name; update them if you rename a server or library.

For additions from Missing, Actors, and Similar Movies, the destination order is: an explicit Radarr destination selected above the results, then the selected libraries' mapping, then decade routing (if enabled), then the default root folder. If selected libraries have different mappings, or mix mapped and unmapped libraries, choose a destination explicitly. Multiple libraries mapped to the same root can route automatically. A missing or inaccessible mapped folder produces an error rather than sending the movie elsewhere.

Saved scans restored from disk do not retain server identity, so their automatic routing uses decade/default settings. Choose a destination above those results to override it. The result-level destination resets when starting a new lookup or scan. Default tags apply regardless of the destination.

Similar movies and TV shows

In Similar, choose Movies or TV Shows, select the libraries to check, and pick a title you liked. Each mode remembers its library selection. Recommendations come from TMDB; movie rating and vote filters can use either TMDB or IMDb, while TV uses IMDb, with ascending or descending sorting.

TV seeds can have a TMDB, TVDB, or IMDb series ID. GAPS resolves external IDs through TMDB and matches ownership across those IDs and title/year. Send to Sonarr requires a TVDB mapping; shows without one remain visible. Similar TV recommendations use your existing TMDB API key and do not require a separate TheTVDB API key.

Sonarr destinations and tags

In Settings > Sonarr, select Default tags from the tags already defined in Sonarr and map your TV libraries under Library root folders. Tags are applied to every series added from GAPS. Refresh the tag list after creating tags in Sonarr, and use Save Defaults to save your selections.

TV results in Missing, Actors, and Similar include a Sonarr destination selector. The routing order is an explicit destination, then the selected libraries' mapping, then the default root folder. Conflicting or partially mapped library selections require an explicit destination. Mappings are scoped to the media-server type, server name, and library name, and use paths as Sonarr sees them. Missing or inaccessible mapped folders produce an error. Restored scans without server identity use the default unless you choose a destination. Movie and TV destinations are separate and reset on new lookups or media changes.

TheTVDB API key: create a free key on your TheTVDB dashboard. Some keys are tied to the User Subscription funding model and require your subscriber PIN; if so, GAPS will tell you, and you can enter the PIN on the TheTVDB settings page.

License

This project is licensed under the GNU General Public License v3.0. See LICENSE for details.

About

Find the movies and TV shows missing from your media library — and fill the gaps in one click.

Topics

Resources

Stars

30 stars

Watchers

4 watching

Forks

Releases

Used by

Contributors

Languages