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