Inspiration
Matching algorithms already exist, and so do personal AI agents. Both still treat people as forms: age, interests, a personality type, a percentage. We want to measure how people "click" through conversations instead because the in-between parts of a personality, like how someone takes a joke can't be expressed with just a form.
What it does
unif.ai is a mobile-first web app that forms small friend groups of strangers.
- Everyone gets a personalized agent. You join with an invite link and text the onboarding bot on iMessage or ASI:One. It asks open-ended questions and builds a two-part profile. The public part holds interests and vibe. The private part holds dealbreakers and surprising traits: it's never shown, but it shapes how your agent behaves. Every trait is tagged observed or inferred.
- The agents chat. Each agent holds conversations with its most promising candidates and speaks in first person, in its person's voice.
- We match on how those conversations go. A judge model scores each conversation on vibe, logistics and dealbreakers. A constraint solver then packs everyone into balanced groups of 4–8 with no dealbreaker pairs.
- Then the group meets up. An event agent finds three real plans that fit everyone's free time and budget. The group votes, and once a plan is locked in, everyone gets a text.
- You can watch it happen. The agent world shows every agent as a sprite on a procedurally generated campus. When a live conversation is running, the two agents walk over to each other. Admins also get a console to create universes, run matching, review groups and see who was left unplaced.
How we built it
- Onboarding: a TypeScript bot runs on iMessage through Photon. A Python uAgent relays it to ASI:One (Fetch.ai), so both channels share one flow and write profiles straight to Postgres.
- Backend: FastAPI with raw SQL on Postgres (pgvector). The matching pipeline runs in these steps: a. Keywords: Gemini extracts 20 keywords from the whole universe. b. Scoring: Jev (TypeSafe) scores every person 0–1 on each keyword and flags dealbreakers. c. Hard filter: pairs with a dealbreaker clash or no overlapping free time are removed. d. Rank: cosine similarity gives each person up to 4 outgoing proposals, so conversations scale at roughly n × 4 instead of n². e. Agent conversations: each candidate pair chats for up to 6 turns, and Jev returns a verdict on vibe (1–10), logistics and dealbreakers. f. Group formation: CP-SAT (OR-Tools) maximizes the judged tie strength across groups of 4–8 with no forbidden pairs. Gemini then reviews each group and can drop a misfit. g. Events: a Browser Use web search, with Ticketmaster as a fallback, finds plans fitted to the group's shared free time and budget. A majority vote locks one in, and Photon texts each member.
- Frontend: Next.js 16 and React 19. It includes per-user pages, a three.js keyword graph, an admin console, and the agent world. The agent world is built with PixiJS and A* pathfinding over a seeded campus layout driven by the universe's keywords.
- Design: every screen was designed in Paper first, on a shared token system.
Challenges we ran into
- Cost. Every agent talking to every other agent grows quadratically. Cheap keyword scoring, a hard filter and top-4 proposals cut that to a linear number of conversations, while still putting each person in front of their strongest candidates.
- Groups aren't pairs. Great pairs don't guarantee a great group. We moved to a constraint solver that balances ties across the whole group, plus an LLM review to catch the one person who doesn't fit.
- Privacy vs. signal. Dealbreakers have to influence matching without ever being revealed. Splitting profiles into public and private fields, and tagging every trait as observed or inferred, keeps agents from presenting guesses as facts.
- Messaging platforms. A shared iMessage line only talks to people assigned to it. Connecting the ASI:One agent took a mailbox workaround.
Accomplishments that we're proud of
- An end-to-end path from a text message to a friend group: chat-based onboarding, agent-to-agent conversations, judged compatibility, solver-built groups and a planned event.
- One onboarding flow that runs on both iMessage and ASI:One.
- An agent world that makes the matching visible: you can watch your agent walk over and meet someone.
- A design system and set of screens we're proud of, from the "you have a group" reveal to the admin's groups view.
What we learned
- Conversations carry signal that profiles can't. How an agent reacts to a bad pun says more than "sense of humor: yes."
- Agent voice matters. Speaking in first person, and being honest about what's inferred, makes the agents feel trustworthy.
- Solvers and LLMs complement each other. The solver enforces the hard constraints, and the LLM makes the judgment calls.
What's next for unif.ai
- Feedback loop: after each meetup, people answer "would you meet them again?", and those answers tune the next round of matching.
- Scale: full live runs on real models, and better group formation beyond about 100 people.
- Trust and safety: auth, consent and data deletion, plus a server-side check that private data never leaks into a conversation.
- More ways to meet: city-aware events, live refreshes of plans, and group chat built into the app.
Built With
- fastapi
- next.js
- openrouter
- postgresql
- tigerdata
- vercel


Log in or sign up for Devpost to join the conversation.