MESA Cohort C4 · AI and its Applications · Final examination · Nawaz Alam. Built and deployed on Vercel with Gemini Flash, Neon Postgres and live public data.
Vikram tracks 50 VCs in a spreadsheet. It records who and when he last spoke, but not who is worth contacting now. Finding out means googling 50 people twice a week. So he chases on gut feel, spends energy on quiet VCs and misses the moment an active one would have replied.
Vikram, first-time founder of a seed-stage B2B logistics SaaS, two months into the raise. Works his pipeline twice a week. Not technical; lives in his table.
On Monday and Thursday morning his table is already up to date: who to contact this week, the observable signal from the last 30 days behind each pick (with a link), who is quiet, and what to do. His own notes stay untouched.
| Today (manual) | With VC Pulse |
|---|---|
| Open spreadsheet, google each VC, skim LinkedIn/news (~2-3 h, often skipped) | 07:00 IST Mon/Thu: cron refreshes all 50 VCs from 5 live sources (~2 min, unattended) |
| Judge relevance by gut; easy to miss a logistics deal or a podcast | Gemini Flash reads every item: is it really this VC, what did they do, how close to logistics? |
| Copy findings into notes by hand, sometimes overwriting old context | Only 4 signal columns are written; his notes are protected by the database itself |
| Write a generic "just following up" email | Evidence-backed hook + one-click Gemini draft (he edits and sends it himself) |
Timing decides whether a cold or follow-up email gets read. 50 VCs × 5 places to look × twice a week = 500 lookups a week. No founder does that consistently, so outreach falls back to gut feel.
Every Monday and Thursday for the whole raise (typically 3-6 months): around 50 repetitions of the same research loop.
Yes, from public, official feeds: Google News RSS, the VCs' own blog/Substack RSS, Apple's Podcasts search API, and Gemini's Google Search tool when the API plan allows it. LinkedIn/X are deliberately not scraped (terms of service, account bans).
A ranked "this week" board (reach out / warm / wait / park), a one-line action per VC, the evidence links, and an email draft that cites the signal.
Research time per session (≈2-3 h → ≈3 min of review); share of outreach that has a concrete hook (target 100% of "reach out" picks); reply rate of signal-timed emails versus generic follow-ups (tracked from his contact history).
Risks: wrong person with the same name, stale news, AI invention. Controls: every signal carries a source link and the source's own date; Gemini may only classify items it is given (never invent); items it rejects stay visible; a failed AI call keeps the previous verdict rather than wrongly marking someone "quiet". The worst case is one email sent at a slightly worse moment, which is cheap and recoverable.
The system recommends; Vikram decides and sends. It never emails a VC and never edits his contact history or notes. That is enforced by Postgres column permissions, not just by good intentions.
Measured AI cost ≈ $0.10 (≈ ₹9) per run via the course OpenRouter key (Gemini 3.5 Flash-Lite, the cheapest model that also scored best), about ₹75 a month at twice a week; feeds, Vercel and Neon are free. It saves ~4-5 founder-hours a week in the busiest months of a company.
Vikram owns the relationships and his columns. VC Pulse (the pulse_engine login) owns exactly 4 signal columns. The builder owns the sources, the prompt and the scoring rules (all in the public repo).
Sending the email. Fundraising is a relationship business; one tone-deaf automated email to a partner can cost a relationship. VC Pulse drafts, Vikram sends.
Writing to his contact history or notes. The brief says they must remain untouched, so the engine's database login has no permission to write them at all.
Scraping LinkedIn / X. It would add signal, but it breaks their terms and risks bans. We use official public feeds instead and say so openly.
Deciding the score with AI. Gemini classifies evidence; plain code does the arithmetic. Same evidence → same score, every time, and it can be explained line by line.
Four layers, each enough on its own:
pulse_engine, which Postgres allows to UPDATE only last_signal_date, signal_summary, follow_up_score, recommended_action. Any attempt to write notes fails with permission denied. Try it live on the Notes guard tab.pulse_founder, which can write only Vikram's columns, so it can't fake a score either. The all-powerful owner login is not even stored on the server.UPDATE … SET the four columns WHERE id = ….Supabase vs Neon: the brief says "Supabase table". Supabase and Neon are both hosted Postgres; our schema (db/schema.sql) and permissions (db/roles.sql) are plain Postgres and run unchanged on Supabase. Neon was used because the free Supabase project slots on this account are in use by earlier portfolio apps. Switching means pointing the two connection strings at Supabase; no code changes.
| Source | Finds | Why this one |
|---|---|---|
Google News RSS: "Name" when:30d | interviews, quotes, op-eds, event coverage | Official public feed; no key; India/US editions by region |
Google News RSS: "Firm" (logistics OR "supply chain" OR freight…) | the firm's deals in Vikram's space | Catches "new portfolio investment in a logistics company" |
| VC blog / Substack RSS | things they wrote | Authoritative: their own words, their own dates |
| Apple Podcasts Search API | podcast episodes they appeared on | Public API; "said in an interview" |
| Gemini + Google Search grounding | talks, panels, demo days | Switches on automatically when the Gemini API plan allows it (the free tier doesn't). Only links Google actually returned are kept |
Every item keeps its URL and the source's own publish date. Anything older than 30 days is dropped before the AI sees it.
A past investment in the same space is not, by itself, a reason to invest again. If the company is a direct competitor, the investor is usually less likely to back Vikram's startup; if it is adjacent, it shows conviction but proves nothing about a new slot. So each signal is weighted by what it means for Vikram's startup:
| Meaning (Gemini labels, code checks) | Weight | Why |
|---|---|---|
| 🎯 Thesis: they say/write they want logistics or supply-chain software | 42 | An open invitation; the clearest sign they want more deals like Vikram's startup (general SaaS writing doesn't count) |
| 🚀 Deploying: new early-stage cheques right now (new fund, bigger seed cheques, new cohort) | 34 | Allocation is open at the startup's stage |
| 🤝 Complement: backed an adjacent, non-competing company | 26 | Conviction + a partnership/warm-intro angle, nothing more |
| 👀 Visible: publicly active on other topics | 10 | Reachable this week |
| ⚠️ Overlap: backed a direct competitor | 0, and −15 | Usually a no: VCs rarely fund a portfolio company's rival |
Signal points = meaning weight × topic fit × who acted (the partner 1.0 · their firm 0.85) × freshness (100% for 7 days, fading to 40% at day 30). Signal strength = best + 40% of 2nd + 20% of 3rd, capped at 70. Fit (who is likely to meet an Indian seed company?): thesis +3 / +8 / +15 · India-based +10 · not India-based with no sign of India investing −5 · US-only/other-market mandate −15 · seed/early confirmed +5 · later-stage only −8 (geography/stage flags come from Gemini, so its caveats change the score, not just the text). Timing (from Vikram's own columns, read-only): followed up <7 days ago −30 (don't pester), 7-13 days −10, waiting 14+ days with a fresh signal +10 (perfect nudge), not contacted yet with a fresh signal +10.
Actions: followed up <14 days ago → WAIT (hook saved for later) · score ≥ 55 → REACH OUT / NUDGE · 35-54 → WARM · weak/off-topic activity → LOW · no signal → PARK, worded by relationship ("waiting 60 days and quiet: one light check-in next month, or move on") and by how long they've been quiet (a 1-year lookback of news naming them with their firm separates "quiet this month" from "quiet for 3+ months"). Open any investor to see their maths.
57 real items from the live pipeline were labelled by hand (is this really about that investor or their firm? is it about logistics?), then run through Gemini + our code checks (tests/eval_judge.py, labels in data/eval_gold.json).
| Question | Precision | Recall | Accuracy |
|---|---|---|---|
| Is it really them / their firm? | 100% (no false claims) | 85-89% (varies by run) | 93-95% |
| Is it about logistics? (on correct items) | 100% | 100% |
Measured on the fallback model (Gemini 3.5 Flash-Lite, before the gateway switch), i.e. the worst case. The design deliberately trades a little recall for precision: a missed signal costs Vikram little; a wrong one could embarrass him in front of an investor. The misses are headlines that don't name the investor, which our "evidence must name them" rule rejects on purpose.
Keywords can't tell "Rajan Anandan co-wrote a book" (him acting) from "a company Peak XV once backed raised money from someone else" (not him), or a consumer-TV deal from a freight deal. Gemini reads each headline and classifies actor, act and topic fit, then writes a specific hook. The arithmetic stays in code so it is auditable.
Gemini never searches or invents in the main path. It only labels items we fetched, each with a real URL and the source's date. The JSON schema forces structured output, temperature is 0.1, and anything it rejects is still shown. Code also double-checks it: a "3/3 logistics" rating is lowered to 2 unless the source text itself contains a logistics word. For Google Search grounding, we keep only links whose domain Google actually returned.
Open the Notes guard tab and press "Attack my own database": the engine login tries to overwrite a note and Postgres answers "permission denied for table vcs". Column privileges are read live from information_schema. Every run also stores before/after fingerprints of his columns.
Vikram works his pipeline twice a week (from the brief). Vercel Cron calls /api/cron at 01:30 UTC (07:00 IST) on Mondays and Thursdays, protected by a secret. It processes all 50 investors in parallel in about two minutes.
Multi-founder accounts (row-level security per founder), Gmail integration to log replies into contact history automatically (with consent), signal alerts in Slack/Telegram, a reply-rate dashboard to tune the weights from real outcomes, and paid Gemini search grounding for event coverage.
About $0.10 (≈ ₹9) of Gemini per run via the course OpenRouter key, logged per run; the news, blog and podcast sources are free public feeds.