A thesis-driven VC intelligence interface with live AI enrichment. Surface high-signal companies, manage sourcing pipelines, and make every recommendation explainable.
- Authentication (
/login) — Secure Email/Password and Google OAuth powered by Supabase - Discovery (
/companies) — Search + faceted filters + sortable results table with pagination + bulk actions - Company Profile (
/companies/[id]) — Overview, signals timeline, notes, AI enrichment, auto-tag suggestions, watch toggle - Pipeline Kanban (
/pipeline) — Drag-and-drop pipeline: New → Reviewing → Due Diligence → Passed → Invested - Collections (
/lists) — Create lists, add/remove companies, rename, export CSV/JSON - Saved Views (
/saved) — Save and re-run search + filter combinations - Compare (
/compare) — Side-by-side comparison of up to 4 companies - Analytics (
/activity) — Sector donut chart, pipeline funnel, thesis fit histogram, top-scoring leaderboard, activity feed - Thesis (
/settings/thesis) — Configure sectors, stages, geographies, keywords + scoring weights
Click "Enrich with AI" on any company profile to:
- Scrape homepage +
/about+/careers+/blog(parallel, server-side) - Analyze with Gemini 1.5 Flash
- Display: summary, what-they-do bullets (3-6), keywords (5-10), derived signals (2-4)
- Show sources: exact URLs scraped, timestamps, content lengths
- Auto-Tag: AI suggests tags from keywords — accept or dismiss per tag
- History: every enrichment run is tracked with model, sources, and results
- ⌘K / Ctrl+K command palette for instant navigation
- Bulk actions — Select multiple companies → add to list or export CSV
- Pipeline Kanban — Drag-and-drop to move companies between pipeline stages
- Company Comparison — Side-by-side table with thesis match breakdown
- Watch/Follow — Toggle watch on companies, see watched count in analytics
- Duplicate Detection — Warning when adding a company with an existing domain
- Auto-Tag Suggestions — AI-generated tags with accept/dismiss controls
- Enrichment History — Track all past enrichment runs with diffs
- Theme toggle (light/dark/system)
- URL param hydration for saved search execution
- Explainable scoring — see exactly why a company matched your thesis
3-tier logo resolution: Clearbit Logo API → Google Favicon API → deterministic color letter avatar.
- Node.js 18+
- npm or yarn
cd vc-scout
npm installCreate .env.local in the vc-scout/ directory:
# Supabase Authentication
NEXT_PUBLIC_SUPABASE_URL=your_supabase_project_url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key
# AI Enrichment (MegaLLM / OpenAI Proxy)
OPENAI_API_KEY=your_megallm_api_key
OPENAI_BASE_URL=https://ai.megallm.io/v1
# Alternatively, Google Gemini API:
GOOGLE_GEMINI_API_KEY=your_gemini_api_keyGet a free API key from MegaLLM or Google AI Studio. Set up an authentication project at Supabase.
Security: The enrichment API runs server-side via Next.js API routes (
/api/enrich). API keys are never exposed to the browser. Supabase keys are safe to expose (NEXT_PUBLIC_) as they are anon-keys restricted by RLS policies.
npm run devOpen http://localhost:3000.
npm run build
npm startnpx vercelSet GOOGLE_GEMINI_API_KEY in Vercel → Settings → Environment Variables.
src/
├── app/
│ ├── (dashboard)/ # Authenticated layout wrapper
│ │ ├── activity/ # Analytics dashboard
│ │ ├── companies/ # Discovery + profile pages
│ │ ├── compare/ # Side-by-side comparison
│ │ ├── lists/ # Collection management
│ │ ├── pipeline/ # Kanban board
│ │ ├── saved/ # Saved search views
│ │ └── settings/ # Thesis configuration
│ ├── api/enrich/ # Server-side AI enrichment endpoint
│ ├── auth/callback/ # Supabase OAuth callback handler
│ ├── login/ # Authentication page
│ └── page.tsx # Root redirect to /companies
├── components/
│ ├── auth/ # Context Providers (AuthProvider)
│ ├── companies/ # CompanyTable, CompanyProfile, CompanyFilters, CompanyLogo
│ ├── layout/ # Shell, TopNav, Sidebar
│ ├── settings/ # ThesisSettingsForm
│ └── ui/ # shadcn/ui primitives
└── lib/
├── store/ # Zustand stores (persisted in localStorage)
├── data/ # Mock company seed data
├── scoring.ts # Thesis-weighted scoring engine
└── types.ts # TypeScript interfaces
- Zustand with
persistmiddleware → localStorage - Stores:
useCompanyStore,useThesisStore,useListStore,useSavedSearchStore
User clicks "Enrich" → POST /api/enrich
→ Scrape 4 pages in parallel (cheerio)
→ Send combined text to Gemini 1.5 Flash
→ Parse structured JSON response
→ Return summary + bullets + keywords + signals + sources
→ Generate suggested tags from keywords
→ Create enrichment history entry
→ Update company in Zustand store
| Layer | Technology |
|---|---|
| Framework | Next.js 14 (App Router) |
| Language | TypeScript |
| Styling | Tailwind CSS + shadcn/ui |
| State | Zustand + localStorage |
| Auth | Supabase SSR (App Router) |
| AI | MegaLLM / OpenAI / Gemini SDKs |
| Scraping | Cheerio (server-side) |
| Charts | Pure SVG (no charting library) |
| Animations | Tailwind animate + CSS |
| Icons | Lucide React |
| Theming | next-themes (light/dark/system) |
| Testing | TestSprite (AI Automated UI Testing) |
The project has been rigorously tested using TestSprite, an AI-driven testing suite. An automated test plan covering all core functionalities was executed, followed by targeted bug fixes.
- 52 Core Interactive UI Tests covering:
- Discovery sorting and list management.
- Multi-faceted filtering (Stages, Sectors, Geographies).
- Parallel server-side AI Enrichment processes (Gemini API interactions, mock-fallbacks).
- State persistence of Lists and Saved Views.
- Complex Kanban pipeline functionality (
drag-and-drop). - Interactive Analytics filtering.
Following the initial TestSprite validation, the following stability updates were implemented:
- Search Resets: Resolved an issue where clearing search filters failed to correctly re-hydrate the initial default state.
- Duplicate Prevention: Implemented strict duplication constraints across "Collections" and "Saved Views" to preserve data integrity and UX.
- Analytics Interactivity: Chart elements (Sector distribution, Pipeline Funnels, Thesis Match distributions) were upgraded into clickable filters that directly manipulate the underlying activity feed.
- Data Completeness: Enriched the mock dataset to gracefully accommodate aggressive testing strategies testing for randomized or extremely specific data combinations (i.e 'Alpha Systems', 'Beta Flow').
- Accessibility: Added distinct
#export-buttonselectors and ensured critical "Saved View" navigation is accessible across all viewport sizes.
Current Status: All interactive front-end components are confirmed stable with near 100% test coverage across the golden path.