Letterboxd: context-aware recommendations

role

Product Manager

timeline

Oct 2026

context

Personal project

key skills

  • AI Product Design
  • Assumption Mapping
  • Edge Case Design
  • Experiment Design

overview

Letterboxd is a social platform where film fans log, rate, and review what they watch, and save films they want to see to a watchlist. As a personal project, I designed Help me pick a film, a feature that reads a user's watchlist alongside the context of the moment they are in, then returns the few films that actually fit. I scoped it end to end: defining the customer and the problem, writing down the assumptions the feature rests on, designing the flow and its edge cases, and setting the metrics that would show whether it worked.

problem

Users save films to a watchlist with every intention of watching them, then face a list of hundreds when the moment comes. Finding one that fits means manually evaluating many options across several sources: scrolling the watchlist, comparing films, reading reviews, checking runtimes, and looking up streaming availability. That work often ends in no decision at all, with users running out of time or energy before they choose. The pattern is common enough that users describe it themselves in the Letterboxd community:

A Reddit post in r/Letterboxd titled My watchlist is so overwhelming, describing the paradox of choice and a growing pile of shortlists
Evidence: users build shortlists on top of shortlists and still cannot choose, a post with 196 upvotes and 76 comments.
A Reddit post in r/Letterboxd titled Does anyone else have paralysis choosing a movie, describing browsing a 400-film watchlist for an hour
Evidence: a user browses a 400-film watchlist for an hour, then runs out of time to watch anything, with 200 upvotes and 64 comments.

target users

I scoped the feature to active Letterboxd users who review films, maintain a watchlist, and already use the platform to decide what to watch. The moment I designed for is narrow on purpose. They are ready to watch something now and want to choose from films they have already saved, rather than discover something new from the full catalog.

pain points

When these users decide what to watch, they browse the watchlist, compare films, and read reviews while weighing six factors at once: their current mood, the time they have, who they are watching with, the viewing experience they want, ratings, and streaming availability. Letterboxd supports none of those factors directly. Sorting and filtering work on fixed attributes like release year and runtime, so everything about the moment itself stays in the user's head and has to be re-applied to every film they consider.

why Letterboxd

Letterboxd already holds both halves of the solution, which is what makes this a scoping problem rather than a data problem:

Existing data

Watchlists, ratings and likes, viewing history, and film metadata already live on the platform for every active user.

Existing functionality

Sorting, filtering, and recommendations based on watched and liked films are already built, and Letterboxd describes the platform itself as one large organic recommendation engine without a section labeled as such.

The opportunity is to combine these existing preference signals with real-time context to recommend relevant films.

assumptions

Before designing anything, I wrote down the three assumptions this feature depends on, so the experiment could be built to test them rather than to confirm them:

1. The problem is widespread

A meaningful segment of active watchlist users have difficulty selecting a movie to watch.

2. Letterboxd is where they decide

Users turn to Letterboxd at the moment they are trying to make a decision, rather than deciding elsewhere and logging it after.

3. Context is the missing input

Context-aware recommendations would improve selection confidence, reduce decision time, or both.

solution

I placed a single entry point at the top of the watchlist, so the feature sits exactly where the decision already happens and nothing else about the page changes:

The current Letterboxd watchlist, a grid of film posters with no recommendation entry point
Before: the watchlist opens as a wall of posters, leaving the user to scan and compare on their own.
The same watchlist with a Help me pick a film button added above the poster grid
After: one Help me pick a film button sits above the grid, and the rest of the page is untouched.

capturing preferences

The feature asks two questions and offers one open field, which is the smallest input that still captures the context behind a decision. Keeping it short matters, since a long questionnaire would recreate the work the feature is meant to remove:

What kind of film are you in the mood for?

Captures the experience someone wants from watching a movie at that particular moment. Users pick up to two options, or choose Surprise me to clear the selections.

How much time do you have?

Makes sure recommendations fit the user's real time constraints, with Any length available when there are none.

Anything else?

An optional free-text field lets users name specific preferences that preset options would miss, such as watching with friends or avoiding horror.

The Help me pick a film sheet, showing mood chips, time options, and an optional free-text field
Input: mood and time are preset chips so the common cases take two taps, with free text for everything else.
Your picks for tonight, showing three recommended films each with a Why this fits explanation
Output: each pick carries its runtime, genre, rating, and a Why this fits line, so the user can accept or reject it without opening the film.

the tradeoff I made

Recommending only from the watchlist was the central product decision, and it costs something real, so I designed the mitigation alongside it:

Prioritized

Existing user intent. Every recommendation comes from films the user already chose to save, which makes each pick easier to trust.

Sacrificed

Recommendation breadth. A film that would fit perfectly but was never saved will not be surfaced.

Mitigated

Users can adjust their preferences in place, and every result state offers a path to explore films beyond the watchlist.

how a match is scored

To keep the recommendations defensible rather than opaque, I proposed an explicit scoring model and the thresholds that decide what gets shown. The weights lean on the moment first and on history second, since historical taste alone is what Letterboxd already does:

Match Score = 0.5M + 0.3T + 0.2P

  • 50% (M) desired viewing experience
  • 30% (T) historical taste, from ratings, likes, and viewing history
  • 20% (P) additional preferences, if the user provided any

Each factor is scored 0 to 100. These are proposed initial weights, subject to validation. When no additional preferences are given, that weight is redistributed across viewing experience and historical taste.

ClassificationProposed criteria
Top matchMeets all hard constraints and scores 80 or above
Close matchScores 60 to 79, or narrowly misses a flexible constraint
No suitable matchLow relevance, or violates a non-negotiable constraint
A result screen showing one top match and one close match, with an explanation of why each fits
Scoring in the UI: a top match and a close match are labeled separately, and the close match explains exactly which constraint it misses and by how much.

edge cases

Most of the design work went into what happens when the ideal case does not hold, since a recommendation feature that only works on a full watchlist with perfect matches would fail quietly. I defined a distinct state for each case, and each one explains what the system looked for before offering a way forward:

Only 1 to 2 strong matches

Show only those matches instead of padding the list to three, and say how many of the watchlist's films fit everything the user asked for.

No strong matches

Name the preferences that were used, then offer two paths: adjust mood or available time, or explore films based on past likes.

Empty watchlist

Skip the recommendation attempt and offer to add films or browse the broader catalog, so a new user never hits a dead end.

A result screen showing two matches with a note that 2 of 20 films fit everything asked for
1 to 2 matches Two picks, with the count stated plainly.
A no close matches screen listing the preferences used and offering to adjust preferences or explore films
No matches What was searched, then two ways forward.
An empty watchlist screen offering to add films or explore films based on likes
Empty watchlist An invitation instead of an error.

how I would know it worked

I would evaluate the feature with an A/B test comparing the existing watchlist against the AI-assisted experience, measuring whether users actually watch what they pick rather than whether they engage with the feature:

Primary metric

The share of recommendation sessions that result in a recommended film being logged within 7 days.

Secondary metrics

The share of sessions where a user taps View Film on a recommendation, and median time to film selection, targeting a 20% reduction against control without reducing selection satisfaction.

Guardrail

The share of sessions where at least one recommendation violates an explicit user constraint, which protects the trust the Why this fits explanations are built on.

back to projects