Personalized “watch next” rows in every Plex user's own account, chosen by a local LLM from titles you already own.
$ git clone https://github.com/JamesClayPatton/playlisterr$ cd playlisterr && docker compose up -d
On a schedule, Playlisterr reads each Plex user's watch history, works out what they actually like, and asks a language model to pick about fifteen unwatched titles from the library you already have, each with a one-line reason.
The picks land in that person's own Plex as private rows, one per library. There's no website to visit and nothing to request. The recommendations are just waiting the next time someone hits play.
It only ever arranges what you own. It never downloads, never requests, and never touches a row it didn't create.

Every step is ordinary, deterministic Python except one. The model sees a taste profile and a numbered list of owned titles, and returns numbers. Every answer is checked against that list, so a hallucinated title becomes a dropped pick, never a recommendation for something nobody owns.
Because in Movies you've been watching The Long Ferry, Glass Orchard and The Quiet Engine, and you tend to go for drama and mystery, we thought these might be a good match.
Picked for you on 12 Aug 2026 · refreshed nightly by Playlisterr.

The same text, written straight into the playlist description in Plex. Each person sees only their own rows, the server owner included.




No pip packages, ever. Dependencies are a tax on everyone who self-hosts, so the whole app is plain Python 3.11+ plus a vanilla-JS UI.
Structured output where the endpoint supports it, validation against the candidate list regardless, and reasons checked for invented viewing history.
Plex playlists belong to an account, so nobody sees anyone else’s picks. With a local Ollama, watch history never leaves your network.
A nightly schedule, webhooks on success and failure, and a health panel so a dead model shows up now, not at 3am.
Everything it creates carries its own label, and nothing without that label is ever touched. A plain run is a dry run.
Every checkout ships a fictional sample library, so the whole UI and pipeline run in demo mode with nothing real contacted.
Playlisterr went public finished and working, and it has run on my own server every night since. The repo ships with the documents that make an open-source project easy to trust and easy to join.
Bug reports, feature ideas, or just “it works on my setup” all help decide what goes into the next release.