A web app for diagnosing and fixing issues with your Plex media library, styled with the Emberline terminal-inspired design system.
Current features:
- 🎬 Movie Duration Check — flags movies whose actual Plex duration differs from the expected runtime in Radarr by more than a configurable percentage tolerance and minimum minute difference.
- 🎥 Video Quality Check — flags movies that are below or above a configurable per-library resolution target, with bulk actions to re-search better or smaller replacements in Radarr.
- 🔍 Unmanaged Movies — finds movies in Plex that have no matching entry in Radarr, so they won't receive quality upgrades or monitoring.
- 📺 Unmonitored Episodes — finds shows in Sonarr with unmonitored seasons or episodes. Enable monitoring directly from the results.
- ⏱️ Episode Duration Check — flags TV episodes whose actual Plex duration differs from the expected runtime in Sonarr by more than a configurable percentage tolerance and minimum minute difference.
- Docker & Docker Compose
- A running Plex Media Server
- A running Radarr instance
- A running Sonarr instance (for the Unmonitored Episodes and Episode Duration Check tools)
git clone https://github.com/cbulock/plex-issue-finder
cd plex-issue-finder
docker compose up -dThen open http://<your-server-ip>:8756 in your browser.
The pre-built image (
ghcr.io/cbulock/plex-issue-finder:latest) is a single container that includes both the frontend and backend. It is pulled automatically from the GitHub Container Registry — no local build required.
All settings can be configured through the Settings page in the UI. They are persisted in a Docker volume so they survive container restarts.
Alternatively, you can pre-seed credentials via environment variables in docker-compose.yml:
| Variable | Description |
|---|---|
PLEX_URL |
Plex server URL (e.g. http://192.168.1.50:32400) |
PLEX_TOKEN |
Plex authentication token |
RADARR_URL |
Radarr URL (e.g. http://192.168.1.50:7878) |
RADARR_API_KEY |
Radarr API key |
SONARR_URL |
Sonarr URL (e.g. http://192.168.1.50:8989) |
SONARR_API_KEY |
Sonarr API key |
See Plex support article.
Go to Radarr → Settings → General → Security → API Key.
Go to Sonarr → Settings → General → Security → API Key.
cd backend
cp ../.env.example .env # fill in your values
npm install
npm run devcd frontend
npm install
npm run devThe frontend dev server proxies /api/* to http://127.0.0.1:3000, so run both simultaneously.
The frontend also installs the shared Emberline design system directly from GitHub via github:cbulock/design-system, which provides the shared fonts, tokens, and base CSS used by the app shell and views.
- Configure Plex and Radarr URLs + credentials in Settings.
- Optionally select which Plex libraries to scan under Plex Libraries in Settings.
- Set your preferred leeway percentage (default: 5%) and movie minimum difference (default: 5 min).
- Navigate to Movie Duration Check and click Run Check.
- Movies are flagged only when the runtime difference is greater than both the percentage threshold and the minimum difference, i.e.
|actual - expected| > max(expected * leeway%, min_diff_minutes). - Radarr runtimes are cached in SQLite. Use Force Refresh Cache to re-fetch.
- Select flagged movies and click Redownload to delete the existing file in Radarr and trigger a new automatic search.
- Configure Plex and Radarr URLs + credentials in Settings.
- Under Plex Libraries in Settings, select the libraries to scan and set a minimum resolution threshold per library (default: 1080p).
- Navigate to Video Quality Check and click Run Check.
- Movies below their library's threshold are listed separately from movies above it, showing resolution, codec, and audio details for each.
- Select movies in the Below Threshold list and click Upgrade to delete the current file in Radarr and queue a replacement search.
- Select movies in the Above Threshold list and click Downgrade to delete the current file in Radarr and queue a replacement search for a smaller file.
- Radarr still decides the replacement based on that movie's current quality profile, so a downgrade will only happen if the Radarr profile allows a lower-quality result.
- Configure Plex and Radarr URLs + credentials in Settings.
- Optionally select which Plex libraries to scan under Plex Libraries in Settings.
- Navigate to Unmanaged Movies and click Run Check.
- Movies present in Plex but with no matching TMDB entry in Radarr are listed. These movies won't receive automatic quality upgrades or monitoring.
- Configure your Sonarr URL and API key in Settings.
- Navigate to Unmonitored Episodes and click Run Check.
- The tool scans all monitored series in Sonarr and identifies unmonitored seasons and individually unmonitored episodes.
- Expand a row to see season and episode details.
- Select series and click Monitor All Selected to enable monitoring for all unmonitored content in those series.
- Configure Plex and Sonarr URLs + credentials in Settings.
- Set your preferred leeway percentage (default: 5%) and episode minimum difference (default: 3 min) under Duration Tolerance in Settings.
- Navigate to Episode Duration Check and click Run Check.
- Only episodes from shows managed by Sonarr (matched by TVDB ID) are compared. Episodes are flagged only when the runtime difference is greater than both the percentage threshold and the minimum difference, i.e.
|actual - expected| > max(expected * leeway%, min_diff_minutes). - Select flagged episodes and click Redownload to delete the existing file in Sonarr and trigger a new automatic episode search.
All settings and cache are stored in a SQLite database at /data/plex-issue-finder.db inside the container, mounted as a Docker named volume (plex-issue-finder-data).