RankRise

A double-opt-in dating app where every rating stays private.

The problem

Rating people in public turns dating into a scoreboard, and one-sided interest wastes everyone’s time — but private ratings and mutual matching only work if the real-time stack behind them is reliable.

Our approach

A double-opt-in matching app: ratings are visible only to the person who gave them, and chat and video calling unlock for both people only when two members rate each other highly. Report and block on every profile and every chat, with tiered subscriptions.

Outcome

Live on Google Play, with private ratings, mutual matching and in-app calling in production.

Private by construction, not by policy

The premise only works if a rating is genuinely never visible to the person rated. That is not a setting or a promise in a privacy policy — it is a constraint on the schema, the queries and every endpoint that could join a rating back to the person it describes.

The moment a rating can leak through an aggregate, a notification or an ordering, the product becomes the public scoreboard it exists as an alternative to. Designing for that up front is cheaper than discovering later that a feature request quietly requires it.

Mutual state, which is harder than it looks

A match is not a row either person owns. It comes into existence when two independent private ratings happen to agree, which means the system has to evaluate a condition that spans two users and then unlock capabilities — chat, calling — for both of them at once.

Getting that wrong in either direction is serious: unlocking early exposes interest that was meant to stay private, and unlocking inconsistently leaves one person in a conversation the other cannot see.

Safety as a feature of the surface, not a settings page

Report and block exist on every profile and inside every chat, rather than in an account menu somebody has to go looking for. In a product where people are being evaluated, the distance between "this is uncomfortable" and "I can do something about it" is a design decision.

The same reasoning applies to what a blocked relationship means everywhere else in the system — discovery, matching, notifications — because a block that only covers the conversation is not a block.