A full-stack VC pipeline management tool with real-time AI enrichment, built as a technical assessment.
VC Scout helps venture capital analysts track, research, and organize investment opportunities in one place. Instead of juggling spreadsheets and browser tabs, analysts get a unified pipeline where they can search companies, run AI enrichment on any company website in seconds, save curated watchlists, and replay saved searches — all persisted locally with zero backend database required.
- Browse and manage portfolio companies with a sortable, paginated table
- Real-time search across company name, sector tags, and location
- Filter by funding stage (Seed → Public) and sector
- Sort any column — name, stage, funding, location
- URL-driven filter state — filtered views are bookmarkable and shareable
- Add Company modal with full form validation
One click on a company profile scrapes the live website, sends the content to Claude, and returns structured intelligence:
- 1–2 sentence analyst summary
- 3–5 "what they do" bullets
- 5–8 keyword/sector tags
- Derived market signals (Hiring, API Product, Enterprise Focus, B2B SaaS, etc.)
Results are cached server-side — no duplicate API calls on repeat visits.
- Funding stage, founded year, HQ location, total raised at a glance
- Signals timeline — funding rounds, product launches, hiring surges, partnerships, press
- Analyst notes — personal thesis notes, saved to localStorage per company
- Save to List — add the company to any curated watchlist from the profile
- Create named watchlists (e.g. "AI Infrastructure", "Series A Targets")
- Preview member companies at a glance on each list card
- Export to CSV or JSON for further analysis in Excel / Notion / Airtable
- Double-confirm delete to prevent accidental data loss
- Save any search + filter combo with a custom name
- Replay with one click — navigates to the Companies page with all filters pre-applied
- View and manage saved query history with creation dates
| Layer | Technology |
|---|---|
| UI Framework | React 19 + TypeScript 5.8 |
| Styling | Tailwind CSS 4 (utility-first, zero runtime CSS-in-JS) |
| Routing | React Router 7 (URL-driven state via useSearchParams) |
| Icons | Lucide React |
| Build Tool | Vite 6 (sub-second HMR) |
| Backend | Node.js + Express 4 (Vite middleware mode) |
| AI Model | Anthropic Claude (claude-haiku-4-5) |
| Web Scraping | Cheerio (server-side HTML parsing) |
| Persistence | localStorage (companies, lists, searches — no DB required) |
| Runtime | tsx (TypeScript executor, no separate compile step in dev) |
vc-scout/
├── server.ts # Express server + /api/enrich endpoint
├── src/
│ ├── pages/
│ │ ├── Companies.tsx # Pipeline table: search, filter, sort, pagination, add
│ │ ├── CompanyProfile.tsx # Profile view: enrichment, signals timeline, notes
│ │ ├── Lists.tsx # Curated watchlists + CSV/JSON export
│ │ └── SavedSearches.tsx # Saved queries with one-click replay
│ ├── components/
│ │ └── Layout.tsx # Sidebar navigation with active state
│ ├── lib/
│ │ └── store.ts # localStorage CRUD (getCompanies, addCompany, saveCompany)
│ └── types.ts # TypeScript interfaces + 8 seeded companies
└── .env # ANTHROPIC_API_KEY
Single Express server handles both the REST API and Vite's dev middleware on the same port — no CORS config, no proxy setup needed.
- Node.js 20+
- An Anthropic API key
git clone <repo-url>
cd vc-scout
npm installCreate a .env file in the project root:
ANTHROPIC_API_KEY="sk-ant-..."Start the dev server:
npm run devOpen http://localhost:3000.
User clicks "Enrich" on a company profile
↓
POST /api/enrich { url: "https://company.com" }
↓
Server fetches website HTML (10s timeout)
↓
Cheerio strips scripts/styles/nav → extracts clean body text (12k char cap)
↓
Prompt + content sent to Claude Haiku
↓
Structured JSON returned: summary, bullets, keywords, signals
↓
Cached in-memory on the server (no repeat calls)
↓
Frontend writes enrichment data to localStorage on the company record
If the website is unreachable (SPA with no SSR, Cloudflare block, timeout), the server falls back to domain-only mode — Claude infers from the URL rather than failing hard.
URL-driven state — All filters, sort direction, and page number live in useSearchParams, not local component state. This makes views bookmarkable and enables the Saved Searches feature to pre-populate the Companies page by simply navigating to /?q=fintech&stage=Series+A.
Single server, dual role — Express mounts Vite's dev middleware directly, so the API and the React app both run on port 3000. No proxy config, no CORS headers, no concurrently hacks.
Graceful enrichment degradation — Website fetch failures (timeout, bot-blocked, JS-rendered SPAs) don't crash the request. The enrichment continues with domain-only context so users always get a result.
ESM-first — "type": "module" in package.json. The server runs via tsx for TypeScript execution without a build step during development, keeping the feedback loop fast.
Zero-database persistence — localStorage is the data layer. No provisioning, no migrations, no connection strings. Works offline out of the box and removes all infrastructure friction for a demo/assessment context.
Built to spec as a take-home technical assessment for a VC-focused engineering role:
- Company table with search, sort, filter, and pagination
- Company profile with AI-powered enrichment
- Activity / signals timeline per company
- Persistent notes per company
- Curated lists with CSV and JSON export
- Saved searches with one-click replay
- Add new companies to the pipeline
- Fully typed with TypeScript — no
anyabuse - Clean, production-ready UI with loading states and error handling
npm run dev # Start dev server (Express + Vite on port 3000)
npm run build # Production Vite build
npm run lint # TypeScript type check (tsc --noEmit)
npm run preview # Preview the production build locallyDesigned and built to demonstrate full-stack product thinking — not just code that works, but a tool a real VC analyst could open and immediately use.