METHODOLOGY
The Algorithm
How a 141-kink, 4-dimension compatibility model actually works. The math, the design choices, the trade-offs — explained without obfuscation. The first dating algorithm to publish itself.
METHODOLOGY
How a 141-kink, 4-dimension compatibility model actually works. The math, the design choices, the trade-offs — explained without obfuscation. The first dating algorithm to publish itself.
01
Most dating apps treat kink as a binary preference. You're into rope bondage, or you're not. This is the same engineering shortcut that lets Tinder treat every user as essentially identical and then optimise for time-on-app rather than match quality.
Two people can both select "Rope bondage" and be completely incompatible. One wants to tie. The other wants to tie. Same checkbox, no scene. The kink isn't the unit of compatibility — the relationship to the kink is.
We capture four dimensions per kink, per person:
141 kinks × 4 dimensions = 564 data points per profile. That's the raw material. The algorithm is what turns it into a match.
02
For each kink both people care about, we compute three independent factors and combine them.
RECIPROCITY (role compatibility)
c_reciprocity = max(1 − |1 − (lean_A + lean_B)|, 0) ^ 1.5
Two givers (lean=0+0): close to zero. A perfect giver/receiver pair (0+1): perfect 1.0. Two switches (0.5+0.5): 1.0. The exponent of 1.5 means small mismatches penalise modestly while large mismatches drop sharply.
SIGNIFICANCE (importance weighting)
m_user = (1 + 1.5 · centrality_user + 0.5 · centrality_partner) / 2
How much does this kink count toward each person's overall score? Your own centrality weighs more than your partner's, but theirs still counts — you should care that something matters to them. Range: 0.5 (both incidental) to 1.5 (both essential).
BOUNDARIES
b_penalty = 1.0 · (no soft limits) | 0.3 · (one soft limit)
Hard limits are filtered out before scoring. Soft limits don't disqualify the kink — they reduce its weight by 70% to reflect the added negotiation friction.
The per-kink score for each person is simply
c_reciprocity × m × b_penalty.
Notably, scores are directional — you and your match can see
different compatibility numbers because your essential kinks aren't the
same as theirs. That asymmetry is honest.
03
A hard limit on either side removes that kink from compatibility scoring entirely. But it also penalises overall coverage if the other person wanted it — specifically by 0.5 × the wanting person's centrality. You don't get to want something essential and have us hide that the only candidate is someone whose hard limit it is.
No app can know what you'll regret. But it can refuse to match around stated boundaries. This is one of two non-negotiables in the design.
04
We aggregate two ways — both matter.
QUALITY
quality = sum(actual_scores) / sum(max_possible_scores)
Of the kinks you both engage with, how good are the matches? A score of 0.85 means the average shared kink is 85% as compatible as it could possibly be.
COVERAGE
coverage = (sum(shared_centrality × reciprocity) − hard_limit_penalty) / total_centrality
What fraction of your needs does this person actually meet? Someone who matches perfectly on three things you barely care about and nothing on the things you'd die for is not a good match. Coverage catches that.
The headline percentage you see is
quality × coverage, clipped to [0, 1].
Coverage has a floor of 0.3 to prevent perfectly-compatible-but-narrow
matches from disappearing, but that floor is the only prosocial thumb on
the scale anywhere in the system.
05
06
Honest answers to questions we don't yet know the answers to:
The algorithm will change. When it does, you'll see it here, dated and explained, before it changes.
Take the 5-minute quiz and watch your own data flow through these formulas.
DISCOVER YOUR DESIRE MAP