Find someone who gets the real you
A dating app that uses the data from the platforms you already love - music, games, code, books, beer, and more - to find genuinely compatible matches. Niche overlaps score higher than mainstream ones, because both loving a band with 12 listeners means more than both knowing the charts.
The demo uses mock data and runs entirely in your browser - no sign-up required.
Your interests, decoded
Affinity Atlas reads the platforms you already use and turns real behaviour - listening history, game libraries, reading lists, check-ins - into compatibility signals. The rarer the shared interest, the stronger the signal.
Worked example: niche overlap (Igorrr) vs mainstream overlap (Taylor Swift) - same pipeline, different contribution.
Connect what you use
Link the apps and platforms you already love — music streaming, game libraries, reading lists, fitness trackers, anything. Only what you choose, always revocable.
Real behaviour, not bios
Your actual listening history, playtime, ratings, and habits say more about who you are than a 500-character bio ever could.
Niche overlap = strong signal
Both loving a band with 200 listeners scores far higher than both knowing whoever tops the charts. Rarity reveals genuine compatibility.
Example interest categories
These illustrate the kinds of signals Affinity Atlas can work with - not a fixed or final list. Some draw on external platform integrations, others on Hierarchical Interest Q&A (branching questions that derive structured data like frequency, intensity, and dealbreakers), and many combine both.
How it works
Real behavioural data, weighted by how rare the overlap is.
Real signals, not self-reported
Listening history, game libraries, code repos, and more - your profile will reflect who you actually are, not just what you claim.
Niche-weighted matching
Sharing a love for an obscure saison scores higher than both liking IPA. Rarity matters.
Explainable match cards
Every match shows clear reasons, and supports a drill-down breakdown that is auditable without exposing the other person's private raw data.
See and delete what we hold
A clear place to inspect your stored signals in human terms, why they are used, and delete them so they are gone.
Why Affinity Atlas exists
Most dating platforms are built on a fundamental conflict of interest. Their revenue comes from subscriptions, and subscriptions require repeat customers. If everyone found a meaningful connection in their first month, the business model collapses. Platforms like Tinder have a structural incentive to keep you swiping - not to help you meet people.
Affinity Atlas is built for outcomes: finite decks instead of infinite feeds, user-controlled notifications, and transparent match cards that you can audit.
Affinity Atlas is being built by a developer and data scientist who thinks that is backwards. The algorithm is transparent - you can see exactly why someone was suggested. The matching logic rewards genuine compatibility, not engagement metrics. And the platform uses data you are already creating through your hobbies, communities, and interests to find people who actually share your world.
This is not a venture-backed startup optimising for time-on-app. It is an independent project driven by the belief that technology should make human connection easier, not more profitable. No gatekeeping, no dark patterns, no incentive to keep you searching.
The matching algorithm
For the technically, mathematically, and data science inclined - here is exactly how compatibility is calculated. Full algorithm deep-dive →
Core formula
Compatibility = Σ(Affinity × NicheWeight × SignalWeight × CategoryMultiplier) / Σ(SignalWeight × CategoryMultiplier)
Normalised to a 0-100 score. Only sources where both users have data are included - if the only shared source is Spotify, the entire score comes from Spotify. No penalty for connecting fewer platforms. Both users always see the same number.
Formula components
- Affinity
Presence × EngagementFactor × SentimentFactor- a continuous 0-1 score replacing simple binary overlap. Presence is 1 if both users share an item, 0 if not. EngagementFactor and SentimentFactor refine the score using depth-of-interest data when available, and gracefully default to 1.0 when that data does not exist. This applies equally to shared likes and shared dislikes.- EngagementFactor
max(0.05, sqrt(logNorm(engA, cap) × logNorm(engB, cap)))- geometric mean of both users' normalised engagement. Engagement metrics vary by source: minutes listened (Spotify), hours played (Steam), repos per language (GitHub), check-ins per style (Untappd), books read per author (Goodreads). Log-scale normalisation (log(1+value) / log(1+cap)) prevents power users from dominating. Defaults to 1.0 when no engagement data exists.- SentimentFactor
min(sentA, sentB)- the minimum of both users' normalised sentiment. Sentiment sources include: saved/liked status (Spotify), star ratings normalised to 0-1 (Untappd, Letterboxd, Goodreads), and implicit signals like very low playtime (Steam, <2h = 0.3). Defaults to 1.0 when no sentiment data exists.- NicheWeight
max(0.05, 1 − popularity / 100)- rare items contribute more signal. A shared artist at popularity 10 has a niche weight of 0.90; at popularity 90, only 0.10.- SignalWeight
- Per-source importance. Defaults: Spotify 1.0, Steam 1.0, Untappd 0.9, Letterboxd 0.85, Goodreads 0.85, GitHub 0.8, Events 0.7, Strava 0.6, Q&A 1.2. User-configurable.
- CategoryMultiplier
clamp(sqrt(wA × wB) × 1.5, 0.05, 1.5)- reflects how much each user cares about this interest category. Users set importance per category on a 0-100 scale (presets: Low, Somewhat, Very, Dealbreaker). The geometric meansqrt(wA × wB)ensures mutual importance is rewarded disproportionately - if both users rate Music at 75, the multiplier is 1.125 (a boost); if one sets 75 and the other 20, it drops to 0.58. This only acts across categories - within a category, two Spotify libraries are always compared identically regardless of weight. Clamped between 0.05 (effectively suppressed) and 1.5 (mutually important boost).
Shared-source normalisation ↗ deep-dive
If User A connects only Spotify and User B connects five platforms, the score is calculated only on Spotify - the one source they share. User B's extra integrations do not penalise User A or inflate the score. Both users always see the same percentage. This is paired with a category breakdown (showing which categories contributed and how each performed) and explore prompts ("Connect Steam to see if your gaming taste aligns too") so users understand what the score is based on and are encouraged to add more data - without the algorithm ever punishing them for not doing so.
Hierarchical data awareness ↗ data deep-dive
The algorithm does not treat data as flat lists. Within each category, data exists at interconnected levels - a Song belongs to an Album, made by an Artist, tagged with Genres - and matching happens at every level. This hierarchy works across platforms (the same artist on Spotify and Apple Music is resolved to the same entity) and within datasets (if we have rich song-level data but no explicit genre affinity, we compute genre values by aggregating upward from listening patterns). Full hierarchy documentation →
Data tiers ↗ data deep-dive
Not all data sources provide the same depth. The algorithm gracefully degrades across three tiers:
- Tier 1 - Rich
- Presence + engagement + sentiment. Example: Spotify (minutes listened + saved status), Untappd (check-ins + average rating), Goodreads (books read + average rating). All three Affinity components are active.
- Tier 2 - Moderate
- Presence + engagement OR sentiment. Example: Steam (hours played, implicit sentiment from low playtime), GitHub (repos per language, no rating). Two of three components are active.
- Tier 3 - Basic
- Presence only. Example: a simple list of interests with no engagement or rating data. Affinity = 1.0 × NicheWeight, equivalent to the original Boolean model. Popularity can still be measured against other Affinity Atlas users.
Full data tier documentation → including sparse data challenges across sources, categories, and Interest Q&A hierarchies.
Worked example
Both listen to Igorrr
Spotify popularity: 18 → NicheWeight = 0.82
User A: 1,200 min listened, saved ✓
User B: 860 min listened, saved ✓
EngagementFactor = sqrt(0.89 × 0.83) = 0.86
SentimentFactor = min(1.0, 1.0) = 1.0
Affinity = 0.86 × 1.0 = 0.86
Contribution = 0.86 × 0.82 × 1.0 = 0.71
Both have Igorrr in data
Spotify popularity: 18 → NicheWeight = 0.82
User A: 1,200 min listened, saved ✓
User C: 3 min listened, not saved ✗
EngagementFactor = sqrt(0.89 × 0.14) = 0.35
SentimentFactor = min(1.0, 0.3) = 0.3
Affinity = 0.35 × 0.3 = 0.11
Contribution = 0.11 × 0.82 × 1.0 = 0.09
Same artist, same NicheWeight - but the deep mutual fan scores 7.9× higher than the shallow false positive. Without engagement and sentiment data, both would have scored identically. The Igorrr problem - "you both love this band" when one person listened for 3 minutes and moved on - is eliminated.
Data sources scored
Integrations will roll out in stages, prioritising the highest-signal data sources first. Not all will be available at launch.
External integrations (behavioural data)
The same example interest categories from above - each with platform-specific scoring. Full scoring details → | Data architecture →
View all 13 integration categories
Shared artists and genres weighted by popularity. Engagement depth (minutes listened) and sentiment (saved status) refine affinity. Disliked genres also scored.
Shared games weighted by ownership rarity. Engagement depth (hours played) and implicit sentiment (very low playtime flags disinterest) refine affinity.
Shared languages and topics weighted by rarity. Engagement depth (repos per language) refines affinity.
Shared styles and breweries by rarity. Engagement depth (check-ins) and sentiment (average rating) refine affinity.
Shared directors, films, and genres by popularity. Sentiment (star ratings on shared films) refines affinity.
Shared activities, consistency, and distance similarity.
Shared authors and genres by popularity. Engagement depth (books read per author) and sentiment (average rating) refine affinity.
Shared shows and categories by subscriber rarity.
Shared cuisines and restaurants by regional rarity.
Shared destinations, travel styles, and reviews.
Shared channels and content categories.
Shared target languages and learning consistency.
Cross-category signal from event attendance.
Standardised personality assessments
Trait profiles across type and dimension models. Some pairings trigger inverse bonuses.
Complements secure-insecure pairings where research supports it.
Similarity scored with optional inverse bonuses for complementary styles.
Structured Q&A
Mutual acceptability weighted by importance. Dealbreaker conflicts halve the sub-score. Inverse compatibility for complementary opposites (Montoya et al., 2008; Markey & Markey, 2007).
Interest Q&A hierarchical
For interest categories without strong external integrations (pets, plants, board games, cosplay, astrology, vintage/thrift), hierarchical Q&A collects structured data that feeds directly into the Affinity model. "Are you a pet person?" branches into pet types, breeds, how many, how often you walk them, dealbreakers. Frequency and quantity answers become EngagementFactor inputs; preference strength becomes SentimentFactor; answer rarity across all users drives NicheWeight. The result is Tier 1-equivalent scoring - presence, engagement, and sentiment - without needing an API. Full Interest Q&A documentation →
Find your people
See how the algorithm works for your specific interests - explained in the language your community actually uses.
🎵 Music & Audio
🎮 Gaming & Tabletop
🍽 Food & Drink
🎬 Film & Media
⌨ Creative & Tech
🏃 Active & Outdoors
📚 Reading & Learning
🌿 Lifestyle & Identity
Frequently asked questions
Is Affinity Atlas a real app I can use today?
Not yet. Affinity Atlas is currently a concept and interactive demo. You can explore the matching logic with mock profiles, but you cannot match with real people.
Does the demo collect any personal data?
No. The demo runs entirely in your browser using localStorage. Nothing is sent to a server. Anything you enter stays on your device and can be deleted at any time.
How does the matching work (in plain English)?
It combines signals from the platforms and interests you care about, then weights overlaps by how rare they are. A niche overlap usually says more about compatibility than a mainstream one. You can also see the reasoning behind matches instead of being handed a black-box score.
What data do you use, and will my match see my raw data?
The goal is to use real signals from things you already do, like listening, playing, reading, and other interest data you choose to share. Your match should never see your private raw data. They see high-level reasons and summaries, not your full history.
Can I control what I share, and delete it later?
Yes. The goal is for you to be able to see what signals are being used, understand why they matter, and remove them if you want them gone. Nothing should feel irreversible or hidden.
Does Affinity Atlas use AI to read messages or infer personality?
No. Affinity Atlas is focused on transparent, explainable matching. It does not use LLMs to process your messages or personal signals. If AI features were ever considered in the future, they would be opt-in and introduced with clear notice.
How much will Affinity Atlas cost?
Pricing is not final yet. Running a real service means paying for servers, security, and ongoing maintenance, and doing that properly is non-negotiable. Privacy is also a core value, which means selling personal data or ad-targeting people is not an option.
In the early stages, the most realistic path is that the project runs at a loss while a sustainable model is proven out. Longer term, that could look like optional donations to cover costs, Tech for Good or non-profit style funding, sponsorship that does not compromise privacy, or another approach that keeps access broad. Dating and finding friends should not be gatekept, and the goal is not to force people to pay just to participate.
Stay in the loop
Affinity Atlas is a passion project - there is no fixed timeline or guaranteed schedule. Drop your details to hear about progress when it happens, share ideas, or express interest in collaborating.