Rules engine
28 condition fields across quality, ratings, watch history, collections and metadata. Build with templates, natural language, or a nested condition editor with live preview.
Prunerr connects to Plex, Sonarr and Radarr and removes media nobody watches — using rules you control, with a queue, grace periods, and Discord notifications before anything is deleted.
The problem
If you run a Plex server you know the drill: disks fill up, request bots add more, and finding what to remove means digging through hundreds of folders. Manual cleanup is unwinnable. Existing tools either delete on a single condition or expect you to write code.
Prunerr sits between Plex and your *arr apps and answers "what should go?" with rules you can actually express — across watch history, ratings, file size, age and metadata.
Features
Built for self-hosted media servers. No cloud account, no vendor lock-in, no surprises.
28 condition fields across quality, ratings, watch history, collections and metadata. Build with templates, natural language, or a nested condition editor with live preview.
Nothing leaves disk without a stop in the queue first. Grace periods, four deletion actions, and the ability to protect items individually or by collection.
Pulls movie collections from Radarr. Protect entire franchises with one click, or queue them for bulk deletion when you want a clean break.
Tautulli or Tracearr integration tracks who watched what. Build rules around individual users — "delete if nobody but the kids has watched it in 6 months".
Batched embeds when items are queued, when grace periods expire, and when files are actually removed — with titles, sizes, and the rule that matched.
Key-authenticated REST API for scripts, automation, and mobile apps like nzb360. Drive Prunerr from anywhere you can make an HTTP request.
How it works
Point Prunerr at your Plex, Sonarr and Radarr. Optionally Tautulli/Tracearr for per-user watch history, Overseerr for request resets, and Discord for notifications.
Pick a template ("delete movies nobody watched in 6 months over 20GB") or build from scratch. Live preview shows you exactly which items would match before you save.
Scheduled scans add matches to a queue. You get a Discord embed with everything that matched and what rule caught it. Protect anything you want to keep.
After your grace period, Prunerr fires the deletion through Sonarr/Radarr — file removal, unmonitor, or full removal — and resets Overseerr requests if configured.
Integrations
Media server & watch status
TV show management
Movie management & collections
Per-user watch history
Per-user watch history (alt)
Request management
Server monitoring
Notifications
Install
Single Docker container. Multi-arch image — runs on amd64 and arm64.
docker run -d \ --name prunerr \ -p 3000:3000 \ -v /path/to/data:/app/data \ -e PLEX_URL=http://your-plex:32400 \ -e PLEX_TOKEN=your-plex-token \ -e SONARR_URL=http://your-sonarr:8989 \ -e SONARR_API_KEY=your-sonarr-api-key \ -e RADARR_URL=http://your-radarr:7878 \ -e RADARR_API_KEY=your-radarr-api-key \ helliott20/prunerr:latest
services:
prunerr:
image: helliott20/prunerr:latest
container_name: prunerr
ports:
- "3000:3000"
volumes:
- ./data:/app/data
environment:
PLEX_URL: http://plex:32400
PLEX_TOKEN: ${PLEX_TOKEN}
SONARR_URL: http://sonarr:8989
SONARR_API_KEY: ${SONARR_API_KEY}
RADARR_URL: http://radarr:7878
RADARR_API_KEY: ${RADARR_API_KEY}
restart: unless-stopped Self-hosted, free, MIT licensed. One container, one config file, your rules.