How it works
Each person is represented by one AI agent. It knows exactly two things about its person: their LinkedIn and their Instagram. It reads both, writes the profile, then goes on dates with other agents on its person's behalf, remembers them, and reports back.
Local and no login. Instagram: the mobile profile endpoint (12 latest posts with captions); if throttled, a real logged-out browser reads the profile JSON and the 12-post grid (dates and Instagram’s own image descriptions). LinkedIn: the public profile page (JSON-LD, posts, text), with Jina Reader as a fallback. Private accounts are rejected.
Plain Python computes hard signals from the posts: words per caption, emoji rate, Hindi–English mix, posting rhythm, video share, who they tag, where they post from.
One LLM call writes an evidence-cited profile: needs, hobbies, interests, values, qualities, personal facts, personality, voice. Every item cites the exact post (P1…P12) or LinkedIn, and links back to it.
No LLM: shared interest tags and values, social energy, same city, and the partner traits that predict satisfaction give a two-way score. The best mutual pairs get first dates.
Each message is its own LLM call with only that agent’s private brief. The last messages can propose the next date; if both agents want it, they go. Each agent remembers the earlier dates.
After every date each agent privately rates it and tags the moments. Rankings weigh how far a pair got and both ratings, and fall back to the match score for pairs who haven’t dated.
Why the agents actually date
Speed-dating research shows that matching on traits before a date can predict who is attractive to people in general, but almost none of the chemistry between two specific people (Joel, Eastwick & Finkel, 2017, Psychological Science). So the math only makes the shortlist, and the agents go on dates to test the part that can't be predicted.
- Private briefs. Each agent knows its own person in depth, but only the other person's public card. Everything else has to come out on the date.
- Their own words. Agents are grounded in their person's verbatim captions and voice samples. Agents built from a person's own words simulate them better than ones built from descriptions (Park et al., 2024, Generative Agent Simulations of 1,000 People).
- A real arc. Dates escalate the way real dating does (café → shared activity → evening) and get more personal over time, like Aron et al.'s (1997) 36 questions.
- Memory. From the second date on, each agent carries its own notes from earlier dates and opens with a callback.
Keeping it honest
- No invented facts. Agents may only share stories that are in their person's sources, and every profile claim links to its post.
- Against flattery. LLMs tend to agree with each other (Sharma et al., 2023), so debriefs come with base rates ("most dates are 4–6") and must quote the moment behind each score.
- Against drift. The voice rules are repeated on every turn, because personas drift within a few turns (Li et al., 2024).
- Inferences are labelled. Personality read from social media correlates only about 0.3–0.4 with the real thing (Azucar et al., 2018), so traits are shown as inferred, with evidence. It's an estimate, not proof.
- Sensitive traits are off limits. No religion, politics, health, sexuality, ethnicity or caste. Relationship status and orientation are never assumed.
Tech stack · cost $0
Scraping: local Python, no login, no paid API. Instagram: the mobile web_profile_info endpoint, falling back to a real logged-out Chromium (Playwright) that reads the profile JSON embedded in the page plus the 12-post grid. LinkedIn: the public profile page (JSON-LD Person, posts, page text), with Jina Reader as a fallback fetcher. Agents: a failover chain of zero-cost LLMs: Claude via Claude Code in headless mode, Cerebras (gpt-oss-120b, Qwen) and Groq free tiers, each throttled to its free limit. Web: FastAPI, Jinja, Tailwind, SQLite, Server-Sent Events for the live dates, and a vanilla-JS replay player. The demo is exported to static HTML for GitHub Pages.