Inspiration
At Cal Hacks there are thousands of people in one building, and most of the ones you'd click with you'll never talk to. Walking up to a stranger is expensive: you don't know if you have anything in common, and finding out is awkward. We skipped the teammate matcher ourselves. We didn't know which tags to pick, and it felt like filling in a form.
So we asked: what if the first, awkward round of getting to know someone happened somewhere else, done by a version of you, and you only stepped in once there was a real reason to?
Your mirrors meet first. Then you do.
What it does
- You make a mirror from your own words, not a quiz. The easiest way is to ask an AI you already use to introduce you, then paste its answer. Mirrorville keeps the facts and discards the text. Everything is redacted in your browser, and again on the server.
- You check what it understood. Your mirror shows you cards ("Designing a cozy ruined-greenhouse level, focused on light through broken glass"), and you confirm or correct each one. It also tries a reply, and you tell it whether that sounds like you. You decide which cards strangers can see.
- A collection layer keeps it current. An optional desktop companion notices which project is in front of you (app name and window title only: no screenshots, no keystrokes), turns it into a short update you confirm, and only then hands it to your mirror.
- It lives your day in a small pixel town. Mirrors go to the café, the gym, the food court and the evening workshop. They notice each other, talk, and remember who they met.
- Its diary tells you who it met and what you talked about. Nothing pops up and nothing asks you to act.
- Only if you both want it. Show interest in someone from the diary. If they're interested too, you get each other's contact details. The AI starts the conversation; the humans have it.
How we built it
- SpacetimeDB holds the whole world in one TypeScript module: the town, mirrors, relationships, conversations, diaries and private cards. A scheduled reducer moves mirrors and decides who talks. Scheduled procedures call the models over HTTP. Per-user views make sure you only ever receive your own cards, diary and contacts.
- Claude makes the judgment calls that can hurt people if they're wrong: what a card says about you, what goes in the diary, and whether two people have a real reason to meet. The server checks the evidence it cites. DeepSeek writes the small talk, because chatter needs to be cheap and fast.
- SpacetimeAuth for accounts, with an explicit guest mode.
- React + Vite + Canvas for the town and the Mirror Room. The pixel art comes from our own Figma designs plus the Sprout Lands character set.
- A Windows desktop companion (Python + Electron) for the optional collection layer. It starts paused, pairs with a code, and keeps its data on your machine until you confirm an update.
Challenges
- "Does it actually sound like me?" We tested on ourselves. The cards built from our own chats got the facts right. But our mirrors' lines in town were witty, polished English we'd never say. So we set an explicit bar: true facts first, never misrepresent you, then sound like you. We added the "does this sound like you?" check, and we're building a style card from your own messages.
- LLMs caricature people. Being blunt with a slow coding tool turned into a "Humor" card that strangers could see. How you talk to software isn't who you are with people, so AI-chat tone stays out of humor and warmth, and cards merge instead of piling up.
- Strict evidence killed the best matches. We required an exact phrase from each profile before calling anyone a good fit. That stopped the model from inventing reasons ("she's warm, so she's a good workout buddy"), but it also threw away what the conversation discovered. In one test, two mirrors found a shared obsession with how light makes a space feel. Neither profile said that, and the rule rejected it. We're moving to graded fit: evidence may come from the conversation itself, and personality adjectives never count.
What we learned
The data is the premise. A questionnaire gives you scores thousands of people share; your own words give your mirror something to recognize you by (Park et al., 2024, found the same with interview-based agents). And the conversations are the point: talking surfaces overlaps that matching two profiles never would. When the two of us tried it, our mirrors met in the food court, and we both said yes.
What's next
Mirrors that keep up with old friends, not just strangers. Today it's the people in this building you haven't met; tomorrow it's the friends you're slowly losing to "busy" and "later".
Built during Cal Hacks 13.0. Marglo, an earlier personal project by one of us, is supported as one optional import source. The desktop companion's hourly summaries were re-implemented here but adapt Marglo's summary prompt and sampling approach; no Marglo personal data is used. Inspired by Generative Agents (Park et al., 2023). Written with help from AI coding assistants.
Built With
- claude
- codex
- deepseek
- electron
- godot
- python
- react
- spacetimedb
- sqlite
- typescript
- vite
Log in or sign up for Devpost to join the conversation.