Skip to content

product

How the Filmatic recommendation algorithm matches movies to you

Leads the technical side. The Filmatic app was his idea, and he created the algorithm and the framework the app runs on.

5 min read

“AI-powered” appears on roughly every product page in this category and tells you nothing. So here is the actual mechanism, in enough detail to judge it.

Step one: describe every movie as a list of numbers

Each movie in the catalogue gets an embedding, a few thousand numbers derived from text about it: synopsis, genre, keywords, the descriptive metadata. The useful property is that movies occupying similar conceptual territory end up numerically close together, even when no shared tag says so.

This is why embeddings beat genre filters. Genre says Arrival and Independence Day are both science fiction. An embedding notices that Arrival sits nearer to Story of Your Life-shaped grief, non-linear structure and quiet awe than it does to an alien invasion picture, because the text around it talks about different things.

Worth being clear about what goes where: we embed text about movies, not anything about you. The movie descriptions go out to an embeddings API. Your swipes never do. We compute your taste vector inside our own database and it never leaves, and the privacy policy says so in language a regulator could hold us to.

Step two: describe your taste in the same space

Your taste is a vector in the same space as the movies. It starts at nothing. Every swipe moves it:

  • Liked. Pulls toward that movie’s position.
  • Seen. You have watched it. This tells us about your history, and it stops us suggesting the movie again.
  • Save. Interested, not tonight. A weaker pull.
  • Skip. Pushes away from that region.

The skip is the underrated one. Most systems infer preference from what you watched, which cannot distinguish “loved it” from “finished it” from “it was on”. A deliberate no gives a clean negative signal, and negatives shape a model at least as much as positives do. Twenty skips tell us more than twenty completed movies would.

Step three: rank and filter

Recommending is then mostly geometry. Find movies near your taste vector, drop the ones you have seen or skipped, and apply the practical filters: does it stream on a service you actually pay for, in your country, and is the runtime plausible for a weeknight.

Then we truncate the list deliberately. Three to five movies, not fifty. A long list is a browsing session, and browsing sessions are the thing we are trying to eliminate.

What this approach is bad at

Every recommender has failure modes, and pretending otherwise is how you lose trust the first time one bites.

A cold start is genuinely cold. With no swipes there is no vector, so the first session shows broadly-liked movies rather than anything insightful. It takes a few dozen swipes to become useful. That is the honest cost of not tracking you.

It over-weights recent swipes. A run of horror movies drags the vector toward horror. That is correct in the short term and wrong if you were just in a mood. Resetting or steadily swiping outward fixes it.

Text describes movies imperfectly. An embedding built from a synopsis knows what a movie is about and only indirectly how it feels. Tone, pace and craft barely register. A movie with a dull synopsis and extraordinary execution is one we will underrate.

It cannot surprise you the way a person can. A friend recommending something wildly outside your pattern does something a similarity model structurally cannot. This is a real limitation, not a temporary one, and it is why Letterboxd’s community lists remain genuinely valuable.

Popular movies have better text. People write more about them, so their embeddings are richer. We correct for this, imperfectly, which leaves obscure movies harder to place accurately.

Why not just ask a chatbot

A general assistant is decent at “movies like Arrival” and poor at knowing you, because each conversation starts fresh. The value of a taste model is not that any single answer is smarter. It is that the model accumulates. The fiftieth swipe makes every future answer better, and a conversation cannot carry that.

What we will not do

No engagement optimisation. The objective is that you watch something you are glad you watched, not that you spend longer in the app. Those goals diverge, and every unpleasant recommender on the internet shows you what the divergence looks like when you pick the second one.

No selling data that identifies you. Your ratings are the most personal thing here. We do build aggregated statistics from usage across the service, and those cannot be traced back to anyone, which is the line the privacy policy draws.

That is the whole mechanism. Not magic. A similarity space, an accumulating preference vector, and a deliberate refusal to optimise for anything except whether the evening was any good.

Keep reading

product

How Filmatic picks one movie for two people

Averaging two tastes gives you a movie neither person wants. Two-person mode scores every candidate against both profiles and ranks by the weaker of the two.

Everything optional starts switched off. Nothing in a category loads until you allow it.