Under the hood

How Date by Proxy works

01
Paste links
LinkedIn URL + public Instagram URL
02
Apify
harvestapi/linkedin-profile-scraper + apify/instagram-profile-scraper, async runs polled by the browser
03
Storage
Raw JSON saved in Postgres; Instagram photos rehosted to Supabase Storage (IG links expire)
04
Analyst agent
Vision model describes 6 photos, then a reasoning model writes the evidence-backed profile
05
Dating agents
One per person. 8 turns, each its own LLM call, each agent sees only its own person + the chat
06
Verdicts
Each agent privately scores fit, chemistry, values, lifestyle, dealbreakers, second date
07
Ranking
0.7 × my verdict + 0.3 × their verdict − dealbreaker + mutual bonus

The two sources, and nothing else

Every fact about a person comes from their public LinkedIn (headline, about, experience, education, skills, languages, volunteering) or their public Instagram (bio, captions, hashtags, locations, alt text and the photos themselves). Scraping runs on Apify; raw output is stored so every insight is auditable.

Evidence, not vibes

Every hobby, interest, value, need and dealbreaker on a profile page carries evidence (the LinkedIn field or the Instagram post it came from, with a quote) and a confidence score. The Analyst is told never to invent facts and never to infer sensitive traits like religion, ethnicity, orientation, health or politics.

Agents that really only know their own person

A date is not one big prompt. Agent A gets A's profile and the transcript so far; agent B gets B's. They alternate for 8 messages across four phases: icebreaker, lifestyle, values & goals, dealbreakers. Each side runs on a different model instance. After the date each agent writes a private verdict citing moments from the conversation against its person's needs.

Who dates whom

A date only happens if each person is someone the other wants to meet. Visitors choose who they want to date (women, men or everyone). For the seed pool we default to opposite-gender matching, using a gender the Analyst reads only from explicit signals in the person's own profiles (pronouns, self-descriptions like “Mom” or “Dad”, or their own profile photo) and cites as evidence. Orientation is never inferred.

Ranking

viewScore = 0.4 fit + 0.2 chemistry + 0.25 values + 0.15 lifestyle. score(A,B) = 0.7 × A's view of B + 0.3 × B's view of A − 3 if a dealbreaker was hit + 0.5 if both want a second date. Seed people are ranked against the seed pool; visitors date and are ranked against every matching seed agent.

Stack

Next.js 16 + TypeScript + Tailwind on Vercel · Supabase Postgres + Storage · Apify (apify-client) · Groq (OpenAI-compatible API): gpt-oss-120b for analysis and verdicts, gpt-oss-20b and Qwen 3 for date turns, Qwen 3 vision for Instagram photos · zod-validated JSON output. The browser orchestrates the pipeline in short API calls so nothing hits a serverless timeout.