Cringe: a dating app designed to keep you single

An AI rewrites your profile honestly instead of flatteringly. Some of the people in your deck are not people, and the app tells you so.

Client
Nuits
Year
2026
Status
Waitlist
Role
Solo founder, Product design, Engineering, AI systems
Stack
React, Cloudflare, OpenRouter, Cloudflare AI Gateway
Cringe: a dating app designed to keep you single

Context

Cringe is a dating app with an inverted objective function. Every other app in the category optimises for engagement and calls it connection. Cringe optimises for you closing it and going outside.

You write a profile. An AI rewrites it honestly rather than flatteringly, which for most people is a short and unwelcome document. Then you swipe through a deck. Some of those profiles are AI plants, and the app discloses which ones, because the EU AI Act says a person has the right to know when they are talking to a machine.

It is on a waitlist.

The problem

Dating apps are the clearest example of an incentive misalignment that everyone involved can see and nobody can fix. A successful match removes two paying users. A near-match keeps them both subscribed. The interface is tuned to the feeling of almost, forever.

The profile layer makes it worse. Everyone writes an optimised version of themselves, everyone knows everyone else is doing it, and the first three dates are spent decoding how far the copy drifted from the person. The dishonesty is mutual, consensual and useless.

I wanted to see what the same interface looked like with the flattery removed and the fakeness labelled.

My role

Solo. Nuits has never hired anyone, so this is my product design, my brand, my interface and my code.

The design work here was not decoration. The hard part was making a disclosure feel like part of the product rather than a compliance sticker in the corner of the screen. A legal notice that looks like a legal notice gets dismissed in one tap and nobody has learned anything. That was a design problem before it was a legal one.

Approach

I started from the honest-rewrite feature, because it tells you immediately whether the whole idea is funny or just cruel.

The line I drew: the rewrite is allowed to be unflattering about claims, never about the person. “Loves travelling” becomes a note that you have been to four countries and posted about two of them. It does not comment on your face, your body, your income or your worth. Punching at the cliché is the joke. Punching at the user is a product that hurts people, and the distinction had to be encoded in the system prompt rather than left to taste.

The AI plants came second. A deck of exclusively real people in an app nobody has joined yet is an empty room, and a labelled fake is a genuinely interesting thing to talk to. Labelling them was never optional.

Building it

React on Cloudflare. The stack is deliberately small, because the interesting engineering is in the model layer.

Model calls route through OpenRouter, so the profile rewriter and the plant personas sit on different models and I can move either without touching application code. The rewriter runs on a strong instruction-following model, because the constraint set is long and violating any of it is the failure that ends the product. The plant conversations run on something cheaper and faster, since latency in a chat thread is felt directly and nobody is grading the prose.

Cloudflare AI Gateway sits in front of image handling and does safety classification on anything a user uploads. That is not a nice-to-have on a dating product; it is the price of allowing uploads at all. The gateway also gives me caching and per-route spend limits, which is how a free waitlist product survives contact with the internet.

The rewriter is the piece I evaluated hardest. I kept a set of real profiles, ran every prompt revision against all of them, and read the output looking for one failure: the model deciding to be witty about the person. Large models drift toward cruelty when you ask them for honesty, because cruelty is the nearest thing to honesty in the training data. The fix was a negative constraint list plus a second pass that classifies each generated sentence as claim-directed or person-directed and drops the second kind. It costs an extra call per rewrite. It is worth it.

The plants carry disclosure in three places: on the card in the deck, in the chat header, and in settings, where you can turn them off entirely. Under the EU AI Act, an interaction with an AI system has to be disclosed to the person interacting with it. Building that in from the first commit was cheaper than retrofitting it, and it turned out to be the feature people mention first.

Outcome

Waitlist is open at becringe.org. The signups are the outcome so far, and I would rather say that plainly than dress a waiting list up as traction.

The disclosure did not cost anything. Nobody has treated the labelled AI profiles as a bug. Several people have treated them as the reason to sign up.

What I’d do differently

I built the swipe deck before the rewriter, which meant a month of tuning an interface around output I had not stress-tested. The model behaviour should have come first, with the interface drawn around what the model actually does.

I would also have written the AI Act disclosure copy in all four site languages at the start. Translating a legal notice after the tone is set is a rewrite, not a translation.