Skip to content

Latest commit

 

History

1,015 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Reaper

CI Coverage Translation status License: AGPL-3.0-or-later Python 3.13 React 19

Grave decisions, clearly explained.

Reaper finds media nobody watches: things requested and never played, shows whose old seasons no one returns to, and low-rated files quietly eating disk. It explains why it thinks each item is expendable, and removes it safely through Sonarr and Radarr. It reads watch history from Tautulli, requests from Seerr, and refreshes Plex when it is done.

📖 Read the manual for install, configuration, policy tuning, and the safety model in full.

Status: in development. Deletion is implemented and tested, but it ships off: a new install can only scan, score and explain until you deliberately arm it. Expect rough edges, and read the install guide before you point it at a library you care about.

Current features

  • Per-season TV decisions, never a whole show in one action. It keeps the newest seasons, the first season, specials, and the season each viewer is partway through, moving that hold forward the moment they finish one. Ask it to also keep N seasons ahead and every binge carries a cushion in front of it, so someone on season 1 keeps what they are about to reach.
  • A score that shows its work. Not just which rules matched, but every protection that was checked and didn't fire, with the actual numbers: ✓ Unwatched for 5 years, 7 months, past the 3 years Reaper waits. It explains the keeps as well as the deletes.
  • Curated lists as protection. Never reap anything in the IMDb Top 250.
  • Keep tags in Sonarr and Radarr, or a Plex collection you curate from your phone.
  • A countdown your users can see, surfaced as a Leaving Soon collection and label in Plex. Watching a title keeps it, and so does sparing it by hand.
  • A simulator that re-decides your last scan under a draft policy with no calls to your services, so you can move a number and watch the outcome change.
  • A test file first. The smallest item goes alone and is verified before anything else is touched. If it misbehaves, the run halts.
  • Sensible defaults, and deletion logic pinned by tests. Every shipped default errs toward keeping. The scoring and the protections are pinned by tests that fail the moment a verdict changes, and the season rules, the caps and the live checks each have their own.
  • Installs as a container, a desktop app, or a snap, with no access to your media and one small data folder.

What makes it different covers these in full, including the ones that ship switched off.

Getting started

Read the documentation to install and run Reaper:

https://docs.scythelabs.dev/getting-started/install

Preview

Reaper's review queue: scored titles on the left, each showing how long it has gone unwatched, and a panel on the right breaking down why one of them scored 90

Safety

Reaper deletes irreplaceable data from a server other people depend on. Every ambiguity resolves toward keeping the file.

  • Off until you turn it on. A new install starts read-only. It can scan, score and explain, and nothing else. The refusal lives at the HTTP transport. While deletion is off, a mutating request is blocked before it is sent, whatever the calling code believes it is doing.
  • Unknown never condemns. A missing rating, an unmappable user, or a degraded data source can only ever protect an item. This is enforced by the type system.
  • Nothing is deleted while it is being streamed. The active-session veto is re-checked immediately before every single delete.
  • Reaper only acts through Sonarr and Radarr. It has no filesystem delete path. Media that no *arr manages cannot be deleted, only reported.

The Plex token Reaper stores grants full administrative control of your Plex account, including permanent deletion. Treat Reaper's database as equivalent to your Plex password. It's encrypted at rest and redacted from logs.

How a delete is kept safe walks the whole path through.

How Reaper is built

This is a hobby project. Know that before you point it at a library you care about.

I work in tech and I've been writing Python for over ten years. Software engineering isn't my job title. Reaper exists because I wanted it and had the evenings to build it.

A lot of this codebase was written with AI assistance. I steer the work, read what comes back, and decide what ships. The architecture, the safety model, and the bar for what's good enough are all mine.

You're trusting this program with files you can't get back. Safety comes first here, and the design choices that follow from that are on purpose. If you think one of them is wrong or you see a better way, tell me. I'd rather hear it so we can make Reaper better.

Contributing

Setup instructions, the verification gates, commit conventions, and the AI policy are in CONTRIBUTING.md.

Translations happen on Weblate, which opens the pull requests here. No git needed.

Bug reports and questions are welcome: open an issue or start a discussion. Security problems go through SECURITY.md, which opens a private report.

The manual's pages live in manual/; the ones under Policy and Safety are generated from the app's own help pages, so edit those in frontend/src/docs/content/ and run npm --prefix frontend run gen-manual.

License

AGPL-3.0-or-later.

About

Explainable media library pruning for Plex, Sonarr, Radarr, Seerr and Tautulli. Finds media nobody watches, explains why each item is expendable, and removes it safely.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages