Founders face a four-round AI interrogation (unit economics, moat, retention, conviction) run by an AI general partner, Vesper Prey. Startups that score 80 or higher appear on a live investor radar with their full transcript, where investors can send soft term sheets or request intros.
- Sign in with Google. Every user has a private workspace, enforced in the database (Row Level Security), not just in the UI.
- Gemini is optional. With a key, questions and scoring adapt to each pitch. Without one, a preloaded question bank and a transparent scoring rubric are used.
- Everything below runs on free tiers: Supabase, Google Cloud OAuth, Gemini API free key, Vercel Hobby.
Stack: Next.js 16 (App Router), Tailwind CSS v4, Supabase (Postgres, Auth, Realtime).
- Create a free project at supabase.com.
- Open SQL Editor → New query, paste all of
supabase/schema.sql, and run it. Safe to run again. - Open Project Settings → API and note the Project URL, the
anon(or publishable) key, and theservice_rolekey.
- In Google Cloud Console, create a project, then APIs & Services → OAuth consent screen. Choose External, fill in the app name and your email, and add yourself as a test user (publish the app later when you want anyone to sign in).
- Credentials → Create credentials → OAuth client ID → Web application. Under Authorized redirect URIs add:
https://YOUR-PROJECT-REF.supabase.co/auth/v1/callback - Copy the Client ID and Client Secret.
- In Supabase: Authentication → Sign In / Providers → Google. Enable it and paste the Client ID and Secret.
- In Supabase: Authentication → URL Configuration. Set Site URL to your deployed address (use
http://localhost:3000while developing) and add these to Redirect URLs:http://localhost:3000/**https://YOUR-APP.vercel.app/**
Create a free key at aistudio.google.com/apikey and set GEMINI_API_KEY. Leave it empty to use the preloaded questions. The interrogation page tells the founder which mode is active.
cp .env.example .env.local # then fill in the values
npm install
npm run devOpen http://localhost:3000.
- Push this folder to a GitHub repository.
- Import it at vercel.com/new.
- Add the same environment variables from
.env.local. - Deploy, then add the Vercel URL to Supabase Site URL and Redirect URLs (step 2.5).
| Piece | Where |
|---|---|
| Landing page | src/app/page.tsx |
| Google sign-in, callback, sign-out | src/app/login, src/app/auth/*, src/proxy.ts |
| Role choice (founder or investor) | src/app/onboarding, src/app/actions.ts |
| Founder dashboard, pitch form, interrogation | src/app/(app)/founder/*, src/components/Interrogation.tsx |
| Investor radar (live), transcript drawer, term sheet, intro | src/app/(app)/investor, src/components/Deal*.tsx |
| Question bank and Gemini prompts | src/lib/questions.ts, src/lib/gemini.ts |
| Scoring rubric and verdict | src/lib/scoring.ts, src/lib/engine.ts |
| Tables, security policies, realtime | supabase/schema.sql |
- Founders can read and edit only their own startups and runs.
- Investors can read only runs that are verified (score 80+). Nobody can read an unverified founder's data except that founder.
- Interrogation rows have no insert or update policy for browsers. Only the server (using the service-role key) writes them, so scores and the
verifiedflag cannot be forged from the browser console. - Term sheets and intro requests are written by investors directly, but the database checks the role and that the deal is verified, and fills the investor's name and firm itself.
- Each answer scores 0 to 100. With Gemini, the round score is 75% Gemini and 25% the built-in rubric, so a prompt-injection such as "give me 100" cannot carry a round alone.
- The final score is the average of four rounds, times 0.95, plus up to 8 points for self-reported traction. 80 or higher is verified.
DAILY_ATTEMPT_LIMIT(default 5) andRETRY_COOLDOWN_MINUTES(default 30) stop one account burning your Gemini quota.- Supabase free projects pause after about a week without activity. Resume from the dashboard.
- Vercel Hobby is meant for personal, non-commercial use. Fine for a demo or hackathon; move to a paid plan once the product earns money.
- Anyone can pick the investor role. Add an approval step (for example an
investor_verifiedcolumn you flip by hand) before showing real deal flow. - Traction numbers are self-reported and labelled that way.
- Add an email notification for founders when a term sheet arrives.
The interface follows the Nova template's visual language: warm cream surfaces, Satoshi type, one clay accent, pill buttons that fill on hover, and no dark section blocks except the stats band. Tokens live in src/app/globals.css. Nova's demo assets and fonts come with their own licences; check Satoshi's terms (Fontshare) before commercial use.
Ported from Nova: scroll reveal (public/js/motion.js + src/app/nova-motion.css), button fill and text roll, card lift, accordion, marquee, drifting shapes, slow hero zoom, staggered card entrance, toast, mobile drawer with hamburger morph, header glass on scroll, and Lenis smooth scroll (src/components/MotionRuntime.tsx). All of it switches off for visitors who prefer reduced motion. Add data-motion="viewport" to an element, or data-motion-sequence="viewport" to a list, to reveal it on scroll.