Hi dev.to, I built BlindFlag as an experiment in applying zero-knowledge architecture to a common early-stage dating issue.
The Problem:
Finding out if there are hidden "dealbreakers" (debt, legal history, dating boundaries) in your relationship is key to knowing if you'll go the distance, and doing so early can save years of time. But asking someone to fill out a plaintext checklist of their deepest flaws on a first date is a social nightmare, and more importantly, people don't want to reveal more than they absolutely have to.
The Architecture:
BlindFlag lets two people compare their realities against their partner's dealbreakers double-blind. I used OpenMined's Private Set Intersection (PSI) WebAssembly library to handle the cryptography entirely client-side.
User path:
Partner A and Partner B select their inputs.
The data and private keys are encrypted locally in the browser memory.
The Flask backend acts strictly as a blind relay passing the scrambled payloads. It never sees the plaintext selections or the matching topics.
If an incompatibility is found, the UI flags it, but the actual topic is only revealed if BOTH users explicitly click a mutual consent ("reveal") button.
Architecture Note / Tradeoffs:
This is implemented under a semi-honest model. Because the cryptography runs client-side in WebAssembly, a technically sophisticated person modifying their own browser runtime could bypass the mutual-reveal gate or inflate their input set to exfiltrate answers (though I added a server-side payload cap of 80 items to mitigate full-dictionary scraping). I explicitly treat partner integrity as a social constraint rather than a mathematically perfect ZKP guarantee. (I also wrote this explicitly into the app as an additional dealbreaker: "A dishonest partner could manipulate their inputs to infer your answers. If you suspect your partner would do this, that may itself be a red flag.")
Itβs a functional trust-based prototype right now. I'd love feedback on the client-side PSI implementation or ways to harden the architecture further, or any other tips to improve it. Huge thanks in advance for any feedback/input/whatever!
Top comments (0)