Case study07/08August 2026 ← All case studies
Things I made
Beau: I built a matching app that watches how you react, then I turned it off
A matching app that shows you a social moment and watches what you do, instead of asking you to describe yourself. Built solo to a working beta in two months, then wound down, and the question it left me with.
In January and February this year I built a social matching platform, solo, from concept to a working beta with real users. It's called Beau. It ran for a while, it did what I built it to do, and then I wound it down. This is what it was and what it taught me, including the question it left me with that I still don't have a clean answer to.
The idea
Every dating and friendship app asks you to describe yourself. Bios, prompts, a list of interests. People are bad at this, and not because they're lying. They just don't know. Ask someone if they're jealous and they'll say "a bit". Put them in a situation where their partner's ex turns up at the party and watch what they do.
So Beau doesn't ask. It shows. The core of the app is a thing I called the Dojo: a six-turn interactive scene, generated by a language model, where you're dropped into a social moment and pick what you do. The abstract stuff (jealousy, frugality, attachment style, dozens more) is embedded in the scene by the model, and you never see the dimension being measured. You just react.
Every choice feeds an identity graph. Not a profile with fields. A graph, with you at the centre connected to interests, traits, values and vices by weighted edges. Weights sit on a spectrum, so "extrovert" at minus 0.7 is an introvert, and they drift as you make more choices, with a ninety-day half-life so the graph is who you are now rather than who you were in January.
Profiles unlock gradually based on how a chat is going, not up front. And the whole thing runs on an energy economy: five Dojo sessions earn you one match dispatch, which meant the real AI costs mapped onto a natural cadence rather than a subscription nobody used.
The build
Two months, on my own. Three databases, each doing one job: a relational store for users, chat and payments; a graph database for the identity graph; a vector database for similarity search and for spotting when "Lesserafim" and "Le Sserafim" are the same node. Around twenty backend service modules and fifty API endpoints, deployed as three containers.
The matching ran as a funnel. A fast vector pre-screen pulls a few hundred candidates. Graph scoring applies the hard filters, then a weighted compatibility score (values weigh most, then vices, then traits, then interests, with a few attachment-theory heuristics on top). Then a thousand random walks through the two people's combined graph, to surface connections neither profile would show, with the hit rate presented to the user as a "fate probability". Overnight, a stable matching algorithm turns all those scores into pairings across the whole pool.
The thing I was really testing
Beau was also a cost experiment. I wanted to know how far you could push language model spend down without the product getting worse. Some of what worked:
The six-turn Dojo scene is one model call, not six. All six turns are generated in a single batch with constrained JSON output, so turns two to six are instant and the cost is a sixth of the obvious design.
Turning a user's choice into graph nodes runs as a cascade. Known nodes skip the model entirely. Novel ones try a vector lookup first. Only the truly unknown trigger a model call.
Choosing the next scene for a user uses zero model calls. It's pure graph analytics: which dealbreaker values haven't been captured yet, which adjacent interests haven't been explored.
Every user had their token spend tracked to the cent. I've carried that habit into everything I've built since, including work for real firms, and it's the reason I now treat "how much did that cost" as a design question rather than a finance one.
What it taught me
Two things, and they've shaped everything since.
The first is practical. I learned how to design, build and cost a real AI system end to end: which database for which job, where the model call is worth it and where code does it better, what a trust boundary looks like when the model's output goes straight into a live system. Structured output and grounding. Per-user cost tracking. Those were Beau lessons before they were work lessons.
The second is the one I think about more. Beau infers psychological traits from instinctive reactions rather than from what people say about themselves. That's the whole point, and it's also a live question: how much should a system be allowed to infer about a person from their behaviour, and what should it be allowed to do with that inference? I built the thing, so I don't get to ask that as a bystander. It's the reason a chunk of my interest has moved towards the governance side of AI, and it's a first-hand question rather than a borrowed one.
Why I stopped
The beta delivered what it was for. Real users, a working pipeline, the architecture lessons, and the ethics question. The deployment is paused and nothing's deleted.
I'd describe it as taken solo through to a working beta. Not a startup, not a failure. A very good two months.
This piece was written with AI assistance, which I use as a dyslexia adjustment first provided through my Disabled Students' Allowance. Every fact in it comes from my own maintained record and has been checked by me.