Automatic poster management for Plex. Scans your libraries, scores available poster options, and applies the best one — so you don't have to manually pick posters one by one.
I just wanted to fix broken and ugly posters across my Plex libraries without clicking through every single item. Most Plex metadata managers are way overcomplicated for this — they try to do everything, rely on local file scanning and matching, and most don't even set posters directly in Plex. PosterPilot does one thing well: it connects straight to your Plex server through the API, finds items with better poster options available, and lets you apply them. No external databases, no file matching, no YAML configs. Just sign in, scan, review, and apply.
- Automatic poster scoring — ranks posters by provider, resolution, and aspect ratio
- Preview before applying — see current vs. recommended posters side by side
- Plex OAuth sign-in — sign in with your Plex account, no need to find your token
- Batch processing — scan and update entire libraries at once
- Parallel scanning & applying — 8 concurrent workers for scanning, 4 for applying
- Dry-run mode — see what would change before applying anything
- Live progress — background scanning and applying with real-time progress bars
- Diff-based rescanning — skip unchanged items when re-scanning a library
- Thumbnail caching — optional local cache for poster thumbnails to reduce Plex API load
- Ignore list — permanently skip specific items from future scans
- Configurable — adjust scoring weights, provider priority, library filters, and more from the UI
- Encrypted secrets — Plex tokens and server URLs are stored encrypted on disk, never in plaintext
- Dark & light themes
git clone https://github.com/primetime43/PosterPilot.git
cd PosterPilot
python -m venv .venv
.venv\Scripts\activate # Windows
pip install -r requirements.txt
python run.pyOpens at http://127.0.0.1:8888. On Windows you can also just double-click start.bat.
Available on Docker Hub.
services:
posterpilot:
image: primetime43/posterpilot:latest
container_name: posterpilot
ports:
- "8888:8888"
volumes:
- ./data:/app/data
environment:
- PLEX_URL= # optional
- PLEX_TOKEN= # optional
restart: unless-stoppedOr build locally:
docker compose up -dAccess at http://localhost:8888.
Download the latest PosterPilot-x.x.x.exe from Releases. The EXE launches the web server and opens your browser automatically.
To build yourself, run build.bat or pyinstaller posterpilot.spec.
- Open PosterPilot in your browser
- Click Sign in with Plex (or use manual token entry)
- Select your Plex server
- Pick a library and click Scan
- Review results — current poster vs. recommended, side by side
- Filter by Changes / Skipped / Locked / etc.
- Click Apply All Changes or select individual items to apply
All settings are configurable from the Settings page in the UI, organized into tabs:
| Tab | What it controls |
|---|---|
| Connection | Plex server URL, token, timeout |
| General | Host, port, log level, dry run, skip locked, scan retention |
| Scoring | Weights, provider priority, aspect ratio, landscape penalty |
| Libraries | Whitelist and blacklist library filters |
| Cache | Thumbnail caching toggle and expiry |
| Ignore List | Items to permanently skip during scans |
Non-sensitive settings are saved to data/config.toml. Sensitive data (Plex token, server URL) is encrypted using Fernet (AES-128-CBC + HMAC-SHA256) and stored in data/config.enc. The encryption key is derived from your machine's identity — no key files to manage.
For Docker deployments, you can override settings with environment variables:
| Variable | Description | Default |
|---|---|---|
PLEX_URL |
Plex server URL | (empty) |
PLEX_TOKEN |
Plex token | (empty) |
PLEX_TIMEOUT |
API timeout in seconds | 30 |
POSTERPILOT_HOST |
Bind address | 0.0.0.0 |
POSTERPILOT_PORT |
Web server port | 8888 |
POSTERPILOT_DRY_RUN |
Dry run mode | true |
POSTERPILOT_LOG_LEVEL |
Log level | INFO |
POSTERPILOT_DATA_DIR |
Data directory path | ./data |
Posters are ranked automatically using:
- Provider priority — TMDB > TVDB > Gracenote > Local > Upload (configurable)
- Aspect ratio — prefers standard 2:3 poster ratio, penalizes landscape images
- Resolution — higher resolution scores better
- Stability bonus — slight preference for the current poster to avoid unnecessary changes
A change is only recommended when the best candidate scores meaningfully higher than the current poster. All scoring weights are adjustable in Settings.
- Plex has no batch API for posters — each item requires its own API call, so large libraries take time to scan. Scans run in parallel (8 concurrent) to help.
- Poster image dimensions aren't in Plex metadata, so scoring relies primarily on provider and aspect ratio rather than exact resolution.
- Some poster URLs from Plex may be inaccessible (relay/auth issues). These are filtered out automatically.
- Smarter image scoring (watermarks, text overlay detection)
- Scheduled automatic scans
- TV show season/episode poster support
- Undo/rollback poster changes
- TMDB/TVDB direct API integration for more poster sources


