Premium matchmaking, built as one app: meet, date, stay together. This is a working v1 of the relaunch plan, with all five pieces wired and verified end to end.
| Piece | Where | What it does |
|---|---|---|
| Consumer app | /app |
Profile, one curated suggestion at a time (no swipe feed), mutual opt-in, the vouching layer, referrals. |
| Concierge bot | src/lib/concierge.ts, /app/matches |
On a mutual yes it names a venue and offers specific slots. Both tap, overlap confirms, no overlap gets one more round, then a human steps in. Sends a one-way .ics, a morning-of nudge, and a 24h post-date check-in. Propose, never coordinate. |
| Vouching | src/lib/social.ts |
Passive vouches on profiles, plus the post-match "ask a mutual friend for the inside scoop." The mutual-friend graph is derived from data we own (referrals, dinner co-attendance, vouches), not LinkedIn or a contacts scrape. |
| Matchmaker backend | /studio |
Searchable, filterable roster. Match pipeline (suggested to together). Per-person view with full history, notes, vouches, the social graph, dinners, coaching. |
| Co-pilot | /studio/copilot, src/lib/copilot.ts |
Internal RAG assistant: find candidates, recall notes, summarize a person, find stale singles, draft intros. Uses Claude when funded, falls back to a real local intent engine over the live roster otherwise. |
| Brand + funnel | /, /apply, /dinners, /coaching |
Landing, application, dinners, coaching bench. |
npm install
npm run db:reset # create SQLite db + seed roster, dinners, matches, vouches
npm run dev # http://localhost:3009Sign in at /login (demo login: pick any seeded member to see the app, or an operator (Jess, Zoe, Erik) to see the studio).
Scripts:
npm run demo:bot # exercises the full concierge flow with fast-forwarded time
npm run concierge:tick # the cron entrypoint (run every ~15 min in prod)The AI layer (src/lib/ai.ts) is provider-agnostic and tries providers in order, picking the first that is configured and responds:
- NVIDIA (
NVIDIA_API_KEY) - the default. Free, OpenAI-compatible endpoint atintegrate.api.nvidia.com. Llama 3.3 70B for the co-pilot chat,nv-embedqa-e5-v5(1024-dim, asymmetric query/passage) for embeddings. - Claude (
ANTHROPIC_API_KEY) - chat fallback. - OpenAI (
OPENAI_API_KEY) - embedding fallback. - Local - if nothing is funded: the co-pilot runs a real intent engine over the live roster (find candidates, recall notes, summarize, stale-finder, draft intros) and embeddings use a deterministic lexical vector. The product always runs.
The co-pilot UI shows which provider answered (a badge: "NVIDIA Llama 3.3", "Claude", or "local engine"). After switching providers or bulk-editing profiles, re-embed with npm run embed.
Next.js (App Router) + React 19, TypeScript, Tailwind, Prisma + SQLite (dev) / PostgreSQL (prod). The Airtable schema in the relaunch plan mirrors this data model so a sync can be layered on later without changes.
- Create a PostgreSQL database (Neon or Supabase free tier recommended).
- Push to GitHub.
- Connect to Vercel and set
DATABASE_URLenvironment variable to your PostgreSQL connection string. - Update
prisma/schema.prismato useprovider = "postgresql"for production. - Vercel will run migrations and seed automatically on first deploy.
For local development, SQLite (prisma/schema.prisma with provider = "sqlite") is sufficient and requires no external database.
Run the concierge sweep on a schedule:
*/15 * * * * cd /path/to/meet-cute && node --env-file=.env --import tsx scripts/concierge-tick.ts
In a real deployment the bot would also send over SMS / WhatsApp (Twilio) instead of writing in-app messages. The message-sending is isolated in concierge.ts (say), so swapping the transport is a one-function change.