What goes in a row

Where candidate titles come from, how often a row changes, how to override any of it per row or per person, and how to stop one watch skewing someone's picks.

Recommendation sources

Settings → Finding titles controls where candidate titles come from. Shortlist pools every source you enable, keeps only what’s already in your library, then ranks them with a simple no-AI score and writes each pick’s “why” in code. More sources means wider reach. Available today:

Each row also chooses which libraries it builds in, using the row editor’s Libraries picker. A Plex collection lives in one library, so a row builds one collection per library you tick. Leave them all ticked, the default, to cover every library, or point a row at just one such as “4K Movies” on a server with several libraries of a type. What the row recommends, movies or shows or both, follows the libraries you pick.

How often rows rebuild, already-watched, and cost

Settings → Finding titles has four more dials, each of which a row can override:

This is rare, because Shortlist reads each person’s complete watched set from Plex every run, including titles they only marked watched, whether ticked off individually or a whole season at once, rather than played.

It reads the library as that user, with the per-user server token Plex mints for every share, and viewCount > 0 covers both plays and marks at any depth. There is nothing to configure, and it works whether or not Shortlist runs on the same machine as Plex. This replaced an older playback-history read that saw plays only and capped at around 200. On one real server that hid 13,201 of a user’s watched titles behind the roughly 1,000 the API reported.

When it does happen, it is almost always timing. The read is per-run, so a title you mark watched after the last run stays eligible until the next one. To fix it immediately without waiting for a scheduled run, go to Jobs → Sync history. That re-reads every user’s watched set right now, writes nothing to Plex, and updates what Shortlist knows, including the “N titles watched” count on the Users page. Any run after that leaves the title out.

Any row can override all of this

Settings → Finding titles sets what a row uses unless the row says otherwise. Open any row (Rows → Edit) and it defines its own recipe:

In the row editor What it overrides
Recommendation sources Switch to “Choose for this row” and tick its own sources
Libraries Which Plex libraries it builds in, which also sets what it recommends
How often it changes, Already-watched titles How often it refreshes, and how much already-watched it allows
Recent releases How much release date counts for this row — a “new and notable” shelf, or one that digs up older films
Row size, Audience How many titles, and who gets it
Watches the AI web search looks up How many recent watches AI web search looks up for this row (shown only on rows using it)
Request tag The Radarr or Sonarr tag on titles requested for this row’s audience

So a “What to watch next” row can be Trakt-only, a “Hidden gems” row can use AI web search alone pointed at just your 4K library with Recent releases turned all the way down, a “New & notable” row can turn the same dial all the way up, and your default “Picked for You” can stay on the global settings. All on the same server, all at once. The Rows list shows each row’s overrides on its card, so you can see at a glance which rows differ.

A row left on “Use global default” stays in sync with Settings → Finding titles.

You can go one step finer, per person. Row size and recent-watches depth can also be set for a single person on a single row. Open that person (Users → click them), find the row, and use Customize for this person. Their value wins over the row’s, which wins over the global default. Leave a customization on “default” and that person follows the row like everyone else.

There is one exception, the seeded “Picked for You” row. Its name and size always follow the global Settings under Row defaults so they stay in sync everywhere, and the row editor points you there instead of offering its own. Its sources, libraries and audience are its own, exactly like any other row.

Changes clean up Plex right away. You don’t have to wait for a run:

Blocking a seed

A seed is one of a person’s recent watches that Shortlist searches from. When a watch isn’t really them, such as a film they put on for someone else or a genre they don’t want more of, block it. The watch stays in their history, it just stops shaping their picks.

The natural place to do it is a run’s How we picked page, on the seeds list, since a bad seed is usually what you noticed in the first place. There is also a search box on a person’s detail page (Users → someone → Settings → Blocked seeds) for a title you remember but can’t find a run for.

Blocks are personal. A shared row is public, so one person’s block does not reshape what everyone else sees. Otherwise an individual preference would become a server-wide edit nobody else can see or undo. Shared rows use their own server-wide list, recommendations.blocked_shared_seeds.

Letting people block their own

Blocking is something only you can do, which means anyone who wants a bad seed gone has to message you about it. Respect Plex ratings (Settings → Finding titles) closes that gap: when someone rates a title 1 star or gives it a thumbs-down in Plex, it stops being used to find similar things for them, exactly as if you had blocked it.

Nothing changes for them. They rate it in Plex, on the screen they just finished watching on. There is no Shortlist account, no login, and nothing for you to do per person.

A few things worth knowing:

You can see all of this on Users → someone → Watch history: what they rated each title, and which ones have stopped seeding as a result.

Per run, it’s in the trace. Open a run, then How we picked for a person: the “Watched recently” step says in one line what ratings did on that run — off, on but nothing rated low enough, on but the account’s ratings were ignored as tool-written, or how many titles a rating dropped — and lists the ones it dropped. That line reports the setting as it was when the run happened, so changing it later doesn’t rewrite the history of a run you’re reading a fortnight after the fact. Runs from before v1.2.1 don’t carry it and show only the dropped titles, as they always did.

Edit this page on GitHub