Behind the scenes
What happens when you post
You share a need or an offer. SuperIntro looks for the people who complement it, gets a yes from both sides, and sends a warm intro email. Here is the whole journey, in five steps.
01
You post a need or an offer
A post is the atomic unit here: something you need, or something you can offer, aimed at everyone, your connections, or a private group. Your profile is just your live posts. Add your LinkedIn and the first draft writes itself: Exa reads the public page, Gemini turns it into needs and offers you can edit.
Exa LinkedIn enrichment · Gemini 3.1 Flash Lite extraction · structured JSON
02
Every post becomes a vector
The moment a post is saved, it is embedded into 768 numbers that capture what it means, not just what it says. That is why search and matching feel instant: reading is pure math. The same semantic search runs live as you type in the composer.
gemini-embedding-001 · 768 dimensions · embedded at write, never at read
03
We look for complements, not clones
Most networks match people who look alike. SuperIntro scores every pair both ways: how well their offer meets your need, plus how well your offer meets theirs. The home feed is personalized the same way, blended toward offers and diversified across authors, so the top of your feed is people who can actually help.
bipartite need↔offer scoring · cosine similarity, both directions summed
04
Both sides opt in, then the intro goes out
A reach-out is a request, never an instant connection, even a QR scan in person. Only when both people say yes does a connection form, and a warm intro email lands in both inboxes with an AI-drafted opener you can rewrite or clear before it sends.
double opt-in · Resend from intros@superintro.app · Gemini-drafted opener, you edit
05
The loop keeps running
Every other week, a digest emails each member the people they could help and the people who could help them, deep-linked to the posts where one tap starts an intro. After you meet, a private rating feeds back into what we surface next.
Vercel Cron · stateless week-parity schedule · RFC 8058 one-click unsubscribe
Outcome A
Connected
The intro email is sent and an in-app chat opens, realtime over Firestore.
Outcome B
Not yet
Your post keeps working for you, in semantic search and in every future digest.
What it runs on
Next.js 16
The whole app: App Router, React Server Components.
react 19 · typescript · tailwind v4 · shadcn/ui
Vercel
Hosting, preview deploys, and the cron jobs.
push to main → prod · vercel cron for digests
Cloud Firestore
The database: people, posts, matches, connections, groups, chats.
deny-all rules · server-mediated writes · realtime chat reads
Firebase Auth
Sign-in, upgraded to Identity Platform.
google · linkedin (server code flow → custom token) · email magic link
Gemini
All the AI: profile extraction, intro drafting, embeddings.
gemini 3.1 flash lite · gemini-embedding-001 · 768 dims
Exa
Neural web search for LinkedIn enrichment and people lookup.
profile auto-draft · find-my-linkedin search
Resend
Every email: intros, requests, digests, away-message nudges.
intros@superintro.app · one-click unsubscribe
PostHog
Product analytics across the whole funnel.
events · referral attribution · admin HogQL dashboard
Notes for engineers
- · Firestore rules are deny-all: every write goes through the server via the Admin SDK. Realtime chat reads are the only client reads, gated per-thread by membership.
- · Embeddings are computed at write time, never at read time, so read paths do pure cosine math.
- · Rate limits and a daily spend budget guard every endpoint that touches paid AI or email.
- · The biweekly digest cron is stateless: week parity decides whether to run, no stored state.
- · LinkedIn sign-in is a server-side OAuth code flow that mints a Firebase custom token, not native OIDC.
- · Images live in a private cloud bucket, served through an authorizing proxy route.
Architecture overview · informational. More about the why on the About page.