A free, open-source, community-powered global aggregator of founder opportunities.
FounderMap indexes every incubator, accelerator, grant, and fellowship program worldwide — no paywalls, no gatekeeping. An autonomous data pipeline scrapes 5+ public sources every 72 hours, classifies each entry via an LLM agent to extract structured metadata, validates community submissions through a legitimacy-scoring agent, and surfaces everything through a filterable Next.js frontend. Zero infrastructure cost.
- YC, Techstars, and ~50 well-known programs capture 95% of all applications
- Thousands of regional, domain-specific, and government-backed programs go undiscovered
- Existing aggregators (GrantWatch, ProFellow, F6S) are paywalled, US-centric, or siloed by category
- No single free, globally-scoped, real-time source of truth exists for founder opportunities
┌─────────────────────────────────────────────────────────────────────────┐
│ GitHub Actions (every 72h) │
│ │
│ ┌─────────────────────────────────┐ ┌────────────────────────────┐ │
│ │ scrape-and-classify │ │ validate-submissions │ │
│ │ │ │ │ │
│ │ scraper.py │ │ validate_submission.py │ │
│ │ ┌────────────┐ │ │ ┌────────────────────┐ │ │
│ │ │ Hacker News│ (Algolia API) │ │ │ URL reachability │ │ │
│ │ │ Reddit RSS │ (r/startups…) │ │ │ Duplicate check │ │ │
│ │ │ F6S RSS │ │ │ │ Groq LLM scoring │ │ │
│ │ │ Devpost API│ │ │ │ Domain reputation │ │ │
│ │ └─────┬──────┘ │ │ └────────┬───────────┘ │ │
│ │ │ dedup by URL hash │ │ │ │ │
│ │ ▼ │ │ ▼ │ │
│ │ classifier.py │ │ score >= 70 → approve │ │
│ │ ┌──────────────────────┐ │ │ score 40–69 → review │ │
│ │ │ Groq API │ │ │ score < 40 → reject │ │
│ │ │ Llama 3.3 70B │ │ └────────────────────────────┘ │
│ │ │ extracts: type/stage/│ │ │
│ │ │ geo/equity/domain/ │ │ │
│ │ │ deadline/score │ │ │
│ │ └──────────┬───────────┘ │ │
│ │ │ score >= 50 │ │
│ └─────────────┼───────────────────┘ │
└─────────────────┼──────────────────────────────────────────────────────-─┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ Google Sheets (Database) │
│ │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────────┐ │
│ │ raw_incoming │ │ approved │ │ submissions_pending │ │
│ │ (status=pending)│→ │ (14 columns) │← │ (Google Form input) │ │
│ └──────────────────┘ └────────┬─────────┘ └──────────────────────┘ │
│ │ public JSON API (gviz/tq) │
└─────────────────────────────────┼───────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ Next.js 14 Frontend (Vercel) │
│ │
│ fetch + ISR (1h revalidation) │
│ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ Filter by: type · stage · domain · geography · equity │ │
│ │ Search: full-text across name / description / geo / domain │ │
│ │ Sort by: legitimacy score · funding · deadline · added date │ │
│ │ Cards: featured programs (28) with custom styling + accept rates│ │
│ │ Submit a Program → Google Form → submissions_pending tab │ │
│ └──────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘
- Automated pipeline — scrapes 5 public sources every 72 hours via GitHub Actions
- LLM classification — Groq (Llama 3.3 70B) extracts type, stage, geography, equity, domain, deadline, and a 0–100 legitimacy score per entry
- Community submissions — Google Form feeds a validation agent that checks URL reachability, deduplicates, scores legitimacy, and auto-approves/rejects
- Filterable frontend — search + 6 filter dimensions + 5 sort options, all client-side
- Featured programs — 28 well-known programs (YC, Techstars, a16z, etc.) with custom styling and acceptance rates
- Deadline tracking — color-coded days-remaining badges (red < 14 days, orange < 30 days)
- Zero infrastructure cost — GitHub Actions free tier + Google Sheets + Vercel free tier + Groq free tier
| Layer | Tool | Notes |
|---|---|---|
| CI / Cron | GitHub Actions | Runs every 72 hours, 2 parallel jobs |
| Scraping | Python + requests + feedparser | Hacker News, Reddit, F6S, Devpost |
| LLM | Groq API — Llama 3.3 70B | Free tier, deterministic (temp=0.1) |
| Database | Google Sheets | Public JSON read, service account write |
| Frontend | Next.js 14 (App Router) + TypeScript | ISR, 1-hour revalidation |
| Styling | Tailwind CSS 3 | No external component library |
| Hosting | Vercel | Free hobby tier, auto-deploys from git |
| Forms | Google Forms | Native Sheets integration |
| Column | Type | Example |
|---|---|---|
id |
string | MD5 hash of URL |
name |
string | Y Combinator |
url |
string | https://www.ycombinator.com/apply |
type |
enum | Accelerator / Grant / Fellowship / Incubator / Competition / Other |
stage |
enum | Idea / MVP / Revenue / Any |
geography |
string | Global, USA, Europe, … |
equity |
string | Non-dilutive, 7% equity, Unknown |
domain |
string | AI, Climate, HealthTech, Any, … |
deadline |
string | ISO date or Rolling |
funding_amount |
string | $500k, Unknown |
description |
string | 1–2 sentence summary |
source |
string | HN / Reddit / F6S / community |
added_at |
datetime | ISO 8601 timestamp |
legitimacy_score |
integer | 0–100 |
FounderMap/
├── .github/
│ └── workflows/
│ └── pipeline.yml # GitHub Actions: scrape + classify + validate
├── frontend/ # Next.js web application
│ ├── src/
│ │ ├── app/
│ │ │ ├── layout.tsx # Root layout, metadata, Inter font
│ │ │ └── page.tsx # Homepage — fetch, filter, render
│ │ ├── components/
│ │ │ ├── Filters.tsx # Filter + search UI
│ │ │ └── OpportunityCard.tsx # Card with featured styling + deadline badge
│ │ └── lib/
│ │ └── sheets.ts # Google Sheets gviz/tq parser
│ ├── .env.local.example
│ ├── package.json
│ ├── tailwind.config.ts
│ └── tsconfig.json
├── pipeline/ # Python backend
│ ├── scraper.py # Fetches raw opportunities from 5 sources
│ ├── classifier.py # Groq LLM classification agent
│ ├── validate_submission.py # Community submission validation agent
│ ├── sheets_client.py # gspread wrapper with exponential backoff
│ ├── seed_data.py # Initial 302 programs
│ └── requirements.txt
├── PRD.md # Product requirements document
├── SETUP.md # One-time setup guide
└── README.md
- Node.js 18+ and npm
- Python 3.11+
- A Google Sheet set up per SETUP.md
- A Groq API key (free, no credit card)
cd frontend
npm install
cp .env.local.example .env.local
# Edit .env.local:
# NEXT_PUBLIC_SHEET_ID=<your_sheet_id>
# NEXT_PUBLIC_SUBMIT_FORM_URL=<your_google_form_url>
npm run dev # http://localhost:3000cd pipeline
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
# Credentials — pick one:
# Option A (local): download service account JSON → save as pipeline/creds.json
# Option B (CI-style): export GOOGLE_CREDENTIALS_JSON='{"type":"service_account",...}'
export GROQ_API_KEY=your_key_here
python scraper.py # Fetch raw opportunities → raw_incoming tab
python classifier.py # Classify pending rows → approved tab
python validate_submission.py # Validate community submissions| Variable | Description |
|---|---|
NEXT_PUBLIC_SHEET_ID |
Google Sheet ID (from the URL) |
NEXT_PUBLIC_SUBMIT_FORM_URL |
Google Form URL for community submissions |
| Secret | Description |
|---|---|
GOOGLE_CREDENTIALS_JSON |
Full JSON contents of the Google Cloud service account key |
GROQ_API_KEY |
Groq API key |
The GitHub Actions workflow (.github/workflows/pipeline.yml) runs every 72 hours and on manual dispatch with two parallel jobs:
on:
schedule: cron '0 */72 * * *'
workflow_dispatch:
jobs:
scrape-and-classify: # scraper.py → classifier.py (sequential)
validate-submissions: # validate_submission.py
Trigger a manual run: GitHub repo → Actions → FounderMap Pipeline → Run workflow
| Source | Method | Query |
|---|---|---|
| Hacker News | Algolia Search API | accelerator, fellowship grant founder, incubator apply (last 30 days) |
| RSS feeds | r/startups, r/entrepreneur, r/forhire | |
| F6S | RSS feed | Public accelerator/grant feed |
| Devpost | REST API | Open hackathons sorted by prize |
All sources are deduplicated by normalized URL hash before writing to raw_incoming.
- Visitor clicks Submit a Program → Google Form
- Form response lands in
submissions_pendingtab - Validation agent (GitHub Actions) runs:
- URL reachability check (HTTP HEAD, status < 400)
- Duplicate detection against
approvedtab - Groq LLM legitimacy scoring with domain reputation bonuses/penalties
- Suspicious TLD detection (
.xyz,.top,.click,.loan) - Known good domain bonus (
grants.gov,mozilla.org,microsoft.com, …)
- Score ≥ 70 → auto-approved to
approvedtab (source = "community") - Score 40–69 → flagged for manual review
- Score < 40 → auto-rejected with reason logged
- Push repo to GitHub
- Import at vercel.com → set
NEXT_PUBLIC_SHEET_IDandNEXT_PUBLIC_SUBMIT_FORM_URL - Deploy — live at
yourproject.vercel.app
Vercel auto-deploys on every push to main. The frontend uses ISR with a 1-hour revalidation window — no separate deploy needed when Sheet data changes.
Follow SETUP.md to:
- Create the Sheet with correct tabs and headers
- Grant public Viewer access (read)
- Grant Editor access to the service account (write)
- Automated scraper pipeline (Hacker News, Reddit, F6S, Devpost)
- LLM classification agent (Groq / Llama 3.3 70B)
- Next.js frontend with filters, search, and sorting
- Community submission validation agent
- Featured program cards with acceptance rates
- Email digest (Resend free tier)
- Twitter/X scraping via unofficial API
- "Suggest an edit" flow per listing
- Telegram / WhatsApp bot
- Fork the repo
- Submit a program via the Submit a Program button on the live site, or
- Open a PR to improve the scraper, classifier, or frontend
This is community welfare infrastructure — no paid tiers, no monetization, ever.
MIT