product
How Double Feature finds the movie to watch after yours
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

Most recommendation features answer one question: what else is like this. Double Feature answers a different one, and the difference turns out to be most of the engineering.
The obvious approach fails immediately
We already described how movies are represented in our piece on the recommendation model. Every movie becomes a long list of numbers derived from the text written about it, and movies occupying similar territory land near each other.
So the obvious way to build a pairing feature is to take the movie you loved, find its nearest neighbour, and return that.
Try it and you get rubbish. Not broken rubbish, which would be easier. Plausible rubbish.
The nearest movie to any movie is usually the same movie wearing a different hat. The sequel. The other one by the same director from the same period. A near-copy someone made two years later. All of those are excellent matches by the numbers, and all of them make for a flat second movie, because you have already had that experience an hour ago and the second helping adds nothing.
Nobody wants to watch the same evening twice.
What a pairing actually is
A pairing is not two similar movies. It is a sequence, and the second movie has to do something the first one did not.
That gives a shape you can actually build against. The candidate should sit near enough to the first movie to share a preoccupation, and far enough away that it treats the preoccupation differently. Too close and it is a repeat. Too far and there is no thread, and the two movies just happen to be on the same evening.
So we are not looking for the minimum distance. We are looking inside a band. That single change, from nearest to a range, is what makes the results interesting rather than obvious.
Order is part of the answer
Here is the part that surprised us most. A pairing is directional. Movie A then movie B is a different evening from B then A, and often only one of the two orders works.
The rule that keeps proving true is about what each movie does with its tension. A movie that delivers its release, that pays off what it built, sits comfortably first. A movie that withholds, that ends ambiguously or leaves the pressure unresolved, belongs second. Do it the other way and the ambiguous movie gets flattened by whatever came after it, because the resolved one closes the evening down.
Runtime matters for the same practical reason. Two long movies is not a double feature, it is a commitment. If the first runs past two hours the second has to be short, and if both are long the pair does not ship no matter how well they fit.
Then a person writes the reason
This is where the machine stops. A model can tell you two movies are an interesting distance apart. It cannot tell you why, and the why is the entire value.
“Users who watched this also watched” is not a reason. It is an observation about other people. What makes a pairing worth acting on is a sentence explaining what the second movie does to the first, and that sentence has to be written by somebody who watched both.
So every pairing in the archive carries one, and an editor approved it. That is also why the archive is finite rather than infinite. We could generate pairings endlessly and we would rather have fewer that someone can stand behind. A feature that returns a result for every input, including the inputs it should decline, is a feature you stop trusting after the third bad answer.
The last filter is boring and decides everything
A perfect pairing you cannot watch is not a pairing.
Both movies are checked against the services you actually have, in your country, before the pair is shown to you. A recommendation that sends you to a rental page you did not ask for has failed even if the pairing was brilliant, and this is the filter that quietly rejects more candidates than any of the interesting ones above.
What it is bad at
Worth saying plainly, because every recommendation feature has a shape of failure and pretending otherwise is how you lose people.
It is weakest on movies with very little written about them. The representation comes from text, so a movie almost nobody has discussed sits in a vague place and its pairings are correspondingly vague.
It is weakest on comedies. Tone is the hardest thing to capture from description, and two comedies that read identically on paper can feel nothing alike in a room.
And it has no idea what you watched last week. It pairs against the movie you named, not against your year. That is a deliberate limit rather than an oversight, but it does mean the feature occasionally suggests something you finished recently and loved.
Why build it this way
The short version is that similarity is easy and useless, and the useful thing sits slightly further out where you have to make choices about distance, order, runtime and who writes the explanation.
There is a second reason not to trust the nearest result, separate from this one and worth knowing if you use anybody’s similar-movies feature: a few movies sit near almost everything, which is a property of high-dimensional space rather than a choice anyone made.
None of that is a hard technical problem. It is a series of small decisions that each sound arbitrary and together decide whether the second movie improves the first one or just follows it.
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.

product
How the Filmatic recommendation algorithm matches movies to you
No hand-waving about AI. The actual movie recommendation algorithm: what a swipe does, how movies match your taste, and what the system is bad at.

guide
Why every “movies like this” list shows the same movies
Similar-movie lists converge on the same handful of titles whatever you type. The cause is a measurable property of high-dimensional space, not laziness.