A Windows desktop app for cleaning up a Plex library. It lists every movie — and, on a second tab, every TV series — in one sortable, filterable table with its rating, streaming history, age, size and genres, and adds a collection score that estimates how much a title belongs in your library. You pick what to remove and delete it in bulk.
There is no automatic cleanup. The app shows the numbers; you decide what goes.
Two tabs, Filme (movies) and Serien (series), sit side by side. Movies delete a single file; series delete the whole show folder — a series is only ever removed as a whole, never a single episode.
- Two tabs — movies and TV series — each with its own table, filters and bulk delete. The series tab loads the first time you open it.
- One table with everything about each movie: title, IMDb rating, when it was last streamed, play count and how many users watched it, date added, resolution, file size and genres. Every column sorts.
- The same for series: each row is one show, with its seasons/episodes count and the summed size of all episodes in place of the single-file resolution and size. Streaming history is rolled up from every episode, so play count and "last streamed" cover the whole series.
- A collection score from 0 to 100 that combines quality (TMDb rating) with reach (TMDb vote count), so well-known classics rank high and good but obscure titles sit in the middle. It works the same for movies and series (using TMDb's TV data for shows). The cell is colored green (keep), amber (borderline) or red (drop), and a tooltip shows how the number was worked out. See the score below.
- Spreadsheet-style column filters: a funnel icon on each header opens a popup with a search box and a checklist of values. Filters on several columns combine with AND.
- A genre filter that matches on any one genre. Since a film can carry several genres, picking "Horror" shows every horror film, including the ones also tagged as something else.
- Poster preview on hover: move the cursor over a title and its poster shows next to it. Posters load on demand and are cached.
- Bulk delete with a check: select rows, review the count, total size and the real paths, confirm twice, and they are gone. For a series the whole show folder is removed, guarded so the target must sit inside your configured TV folder and can never be the folder root itself.
- Windows 10 or 11
- A running Plex Media Server (URL + token) with a movie library and/or a TV library
- A running Tautulli (URL + API key) with some watch history collected
- A network share where the files live (a Windows UNC path or a mapped drive)
- Optional: a TMDb API key for the collection score
- Movies stored as one flat folder of
.mkvfiles (one file per movie); series stored as one folder per show (seasons and episodes inside)
Download PlexCurator.exe from the latest release and run it. No
Python needed.
The EXE is not signed, so Windows SmartScreen may warn you the first time. Click "More info", then "Run anyway". Some antivirus tools also flag PyInstaller binaries by mistake. If you would rather not trust the binary, build it from source.
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
python -m plexcuratorTo build your own EXE:
pip install pyinstaller
pyinstaller packaging/PlexCurator.spec --distpath dist --workpath build --noconfirmOn first launch, open Settings and fill in:
| Field | Example |
|---|---|
| Plex URL | http://192.168.1.10:32400 |
| Plex token | your X-Plex-Token |
| Library | Movies |
| Tautulli URL | http://192.168.1.10:8181 |
| Tautulli API key | your key |
| TMDb API key (optional) | your TMDb v3 key |
| Plex path prefix | /movies/ |
| Windows path prefix | \\SERVER\Movies\ |
| TV library | TV Shows |
| Plex TV path prefix | /tv/ |
| Windows TV path prefix | \\SERVER\TV\ |
Plex reports paths from its own point of view (for example /movies/Film.mkv or
/tv/Breaking Bad), but the app deletes over your Windows share (for example
\\SERVER\Movies\Film.mkv or \\SERVER\TV\Breaking Bad). The path prefix settings translate
between the two: the Plex prefix is stripped and replaced with the Windows prefix, and the rest
of the path stays the same. The delete confirmation shows the resolved Windows path, so you can
see exactly what will be removed.
Movies and series have their own prefix pair, since Plex usually reports them under different roots. Leave the TV prefixes empty to reuse the movie mapping. If a path can't be resolved, the title is marked as not deletable and left alone.
The collection score answers a different question than the rating does: how much does this film belong in the library? A well-rated but little-known film (say, a niche cult movie) is not the same as a well-known classic, even when both rate highly. So the score mixes two things.
Quality comes from the TMDb rating (0 to 10), scaled to a 0–100 range. Reach comes from the TMDb vote count on a logarithmic scale, since vote counts span orders of magnitude; this is the stable signal for how many people know a film. A small recency bonus comes from TMDb's popularity value, kept small on purpose so a number that moves day to day doesn't swing a decision that should stay put.
The blend leans on reach: 40% quality, 60% reach, because whether a film is worth keeping depends more on how known it is than on its rating alone. Scores of 66 and up show green (keep), 40 to 65 amber (borderline), and below 40 red (drop).
Series are scored the same way, using TMDb's TV data for the show. TMDb data is cached locally for 30 days, so only the first load makes TMDb requests. Without a TMDb key the score column stays blank and the rest of the app works as usual.
Does it delete files immediately? Yes. There is no trash or recycle step, by design. Before anything is removed you get a two-step confirmation showing the count, total size and the real file paths.
What exactly gets deleted?
For a movie, the single .mkv file (the app assumes a flat folder of .mkv files). For a
series, the entire show folder with every season and episode inside — a series goes as a whole
or not at all. The folder deletion is guarded: the target must sit inside your configured TV
folder and can never be that folder root itself, so a misconfigured prefix can't wipe the whole
library.
Do I need Plex write access? No. The app only reads from Plex, Tautulli and TMDb, and writes to the file system. Plex notices the removed files on its next scan.
A movie has no score, or no path. No TMDb match means a blank score. If the prefix mapping doesn't match a file's path, that movie is left alone and can't be deleted.
Can I try the UI without a server?
Yes. Run it with --demo (or set PLEXCURATOR_DEMO=1) to load fake sample data. That is how
the screenshots here were made.
Issues and pull requests are welcome. To set up for development:
pip install -e ".[dev]" # ruff + pytest
ruff check src tests
pytest -qThe core logic (path mapping, scoring, config, models, filtering) has unit tests. Network and GUI code is checked by hand.
I built PlexCurator to solve my own "what do I actually keep?" problem. It was developed with the help of AI tools.
MIT © 2026 Tim Semcken


