A consumer product that reads personality from behaviour, not quizzes, grown to 10k+ users in five months.
Project Type
Contract, full time. A consumer social product on web and iOS, shipped to daily users.
Role
Founding product design engineer, full stack.
Timeline
April to August 2026, inclusive.
Skills & Tools
Convex schema, indexes and migrations, React, TanStack, TypeScript, LLM authoring and eval pipelines, illustration, layout and motion.
Sourced summer 2026 from analytics
Trove is a live product and I worked on it under contract. Nothing here covers the authoring system’s prompts, the scoring weights, unreleased roadmap, commercial terms or any non-public user data. What follows is the design reasoning, the research, the craft decisions and the outcome numbers achieved while I was there, which is everything I can show without handing somebody a copy of the thing.
You are not what you fill out on a questionnaire. So the product is not allowed to ask you anything.
Refuse to ask a single question and the only evidence left is what somebody does.
You are not your LinkedIn bio and you are not your Hinge profile, and nearly every system built to understand you opens by asking you to be one of those things. Trove drops you into a short story with no clean answer and reads what you actually do.
Lovely on a homepage. Unreasonable in a codebase. I joined as hire number one on this iteration with the idea proven exactly once, as a Valentine’s drop in February, and eighteen weeks to build the machine underneath it. Eight routes. Sixteen components. A profile that existed as a mockup. No writers’ room and no animators.
A whole first session: everything before the game, the game itself at four times speed, and the personality read that follows. It opens by telling you it starts with what you do, offers a self-description step where every field has an “I don’t know yet”, and asks you to make an account only after it has already told you something about yourself.
Which means a real dilemma, every day, forever. Trove writes its stories, which it calls tangles, with language models and has another one judge them. The judge I inherited scored ten qualities, then threw nearly all of that away to answer one question: good enough to publish, yes or no. A story that merely clears not broken contains no dilemma, and a fake dilemma reveals nothing about the person playing it. Nothing could go up , only through, which means the promise quietly stops being true and you are running a quiz with nicer typography.
So I built a score out of what we were already throwing away, weighted toward a story’s weakest moment and whether two people playing it actually ended up somewhere different.
The pipeline that produces one is the most complicated thing I worked on. A premise and a category go in. What comes out has already been played start to finish by a cast of invented players inside the real product, every playthrough read back, and fixed automatically a limited number of times before a person sees a word of it. Most come out playable on the first pass.
A premise goes in
One line of intent and a category. That is the entire human input at this end.
It gets played, for real
A cast of invented players plays it start to finish inside the real product, not a rehearsal of it.
Every playthrough is read back
Every playthrough gets read back. The weakest moment decides the story’s fate, because it is the part a writer can actually fix.
A person still says yes
Passing means it works. It does not mean it is good, so nothing reaches a player unsigned.
Two and three loop on a cap: a revised draft is played again before it can move forward. Then somebody makes choices nobody asked them to explain, those choices become a read, the read moves their trait scores, and the profile sharpens every seventh day you play.
The same instinct killed a feature. “Stories that do not repeat themselves” was on the roadmap and all of us believed it, so I measured first: 139 tangles , 950 pairs of real player prose, one genuine duplicate . The best thing I shipped that quarter is a thing I removed.
Personality is a living system. An unfolding story, one that shifts depending on who is in the room.
One play tells you about a Tuesday. You need somebody who keeps choosing to come back.
That is the line that turns a quiz into a product, and it cost the most. Seven cards, one a day, sealed in a pack you have to rip. The explore page, where the daily games live, bends toward you as you play: what it puts in front of you is shaped by your patterns, and it holds on to the story you walked away from.
The pack rip and the home screen. Both exist so that opening Trove on day nine feels different from opening it on day one.
Then something to accumulate. Every tangle needs a play card, and in April that meant hand-assembling one per card, which does not survive a daily cadence for a week. So the card builds itself: it reads what the story is about and picks the art, which sky suits a tense late-night scene, which of the mascots fits a story about being the outsider.
Ask a language model for pixel coordinates and it returns numbers that land on the card’s existing furniture about half the time, confidently, silently. Nobody gets an alert. You just get an ugly card, forever.
An unplayed card shows blurred slots, one sticker for each topic its results will touch on. Play it and they fill in with the ones you earned.
The same card after a play, stickers filled in and the read sitting underneath it. A collection is only evidence of an unfolding story if the things in it were earned.
What you unlock is a record of what you did, worn instead of written.
Most companions are built to be pleased to see you. His face reports.
Trove tot greets you, reacts to a read, sleeps when you have been away and wears what you unlock. Fourteen poses times twenty-eight accessories is 392 drawings nobody was going to make, so he is composited at runtime from one pose sprite with accessory art on top.
There is exactly one right answer per slot per pose, and I tried to derive it. I measured his yarn ball, which cannot be measured consistently across poses. Two attempts later I had written a foot detector that confidently found his mouth. Every one failed silently, because a hat two percent off a head does not throw. It just looks faintly cursed, on one pose, forever.
Every cell is composited live by the real placeFit() from the codebase, running on the real anchors over the real art. → Scroll sideways for the other nine poses.
Four outfits across all fourteen poses. Fifty six combinations, none of them drawn.
Every product with a mascot has worked out that a creature who misses you is worth a few points of retention. That is part of it. It is not the end of it. What you unlock, you unlocked by playing something, and what you played is the only thing Trove knows about you, so you can look at him and learn something about your own month without a sentence being asserted at you.
He runs on one rule. Pose is the clock, face is the care. He changes body through the day so there is a reason to look again, and changes face only when your care changes, so he can never look like he is having a lovely afternoon while he has been ignored for a week.
Read across, not down. Look after him and he has four different kinds of happy available to him. Ignore him for a fortnight and he has two faces left, both of them bad. The point is not that neglect makes him sad, it is that it takes his range away, and nobody has to be told that for it to land.
The patterns worth knowing about yourself are the ones you cannot see from the inside.
Anything specific enough to be revealing is specific enough to be wrong.
It does not stop at the read. The same evidence moves the traits underneath it, which is how one play becomes a profile instead of a receipt. Which is also why the profile could not be a dashboard. A dashboard says here is your data , and data is only ever what you already put in. This had to say here is you , a much ruder sentence that has to earn itself. So it became a spatial diorama: your player pass, the journal your read lives in, the postcards you have sent and the floor they all sit on, sharing one plane, with exactly one in focus while the rest sit parked around it.
The read itself. Every sentence in it is derived from something you did, not something you declared.
Clip wanted: the profile diorama A slow scroll through the profile so elements fly to centre and park again. This is the thing I spent the most time on and it is the one part of the page that cannot be shown as a still.
Where the reads accumulate, and the one thing on this page that genuinely cannot be shown as a still.
Then the move I am proudest of. Having just told you who you are, it asks whether it got you right. You pick a face, you write a sentence, and it holds your note against the choices you actually made.
Everything before this is a product talking. This is a product listening, and it is the only reason the sentence before it is allowed to be so confident.
And then it had to survive contact with people.
Nothing crashed. That was the problem.
Three faults cost us real players that quarter and not one raised an error, because each was a system reporting success while quietly failing.
A result came back correct in every detail except its shape, which meant the safety net never caught it, and everything after that recorded a success. Three surfaces went dark and it looked exactly like a slow network. The share card got heavier every press, quietly, while working.
Ten thousand people let a piece of software tell them something about themselves.
A questionnaire cannot be argued with. It only hands back what you put in.
Then they sent it to their friends, which is the part I did not see coming and should have. The patterns you cannot see from the inside are exactly the ones everyone around you has always been able to see. Trove makes them sayable, and puts two of you side by side in the same scene.
A comparison: same tangle, two people, and an argument worth having over dinner.
Seven surfaces by August. The iOS app is a thin shell around the web app, built by a teammate in a fortnight, which is the compliment: by July the thing underneath was coherent enough that going native was a wrapper instead of a rewrite.
At an event we hosted, someone recognised themselves in most of their read and argued with the part that did not fit, for about five minutes, to my face.
Four things I would carry into the next one.
You cannot ask someone who they are
The question changes the answer. Every system in Trove exists so that nobody has to answer one.
Automate the labour, never the attention
The writers’ room and the animator both became systems. Whether a hat sits right, or a story is good rather than merely unbroken, stayed expensive on purpose.
A person is not a result
A read that never moves is a horoscope and a read that always moves is noise. Seven days of play was the honest speed for a living system.
It has to be willing to be wrong out loud
The disclaimer on the score, the reflection step, the wait before re-reading. Every one of them makes the product claim less, and claiming less is what got it believed.
I spent eighteen weeks building a machine to find the human edge in other people, and it turns out the way you do that is to make something honest enough to be argued with. Nobody argues with a horoscope. They argued with this.
→ Play Trove at play.trove.is