Skip to content

About

One Stop solution for founders

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

Β 

History

9 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

FounderMap

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.

Pipeline License: MIT


The Problem

  • 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

Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         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        β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Features

  • 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

Tech Stack

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

Data Schema (approved tab)

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

Directory Structure

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

Local Development

Prerequisites

  • Node.js 18+ and npm
  • Python 3.11+
  • A Google Sheet set up per SETUP.md
  • A Groq API key (free, no credit card)

Frontend

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:3000

Pipeline

cd 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

Environment Variables

Frontend (Vercel / .env.local)

Variable Description
NEXT_PUBLIC_SHEET_ID Google Sheet ID (from the URL)
NEXT_PUBLIC_SUBMIT_FORM_URL Google Form URL for community submissions

Pipeline (GitHub Secrets)

Secret Description
GOOGLE_CREDENTIALS_JSON Full JSON contents of the Google Cloud service account key
GROQ_API_KEY Groq API key

CI/CD Pipeline

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


Scraped Sources

Source Method Query
Hacker News Algolia Search API accelerator, fellowship grant founder, incubator apply (last 30 days)
Reddit 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.


Community Submission Flow

  1. Visitor clicks Submit a Program β†’ Google Form
  2. Form response lands in submissions_pending tab
  3. Validation agent (GitHub Actions) runs:
    • URL reachability check (HTTP HEAD, status < 400)
    • Duplicate detection against approved tab
    • 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, …)
  4. Score β‰₯ 70 β†’ auto-approved to approved tab (source = "community")
  5. Score 40–69 β†’ flagged for manual review
  6. Score < 40 β†’ auto-rejected with reason logged

Deployment

Vercel (Frontend)

  1. Push repo to GitHub
  2. Import at vercel.com β†’ set NEXT_PUBLIC_SHEET_ID and NEXT_PUBLIC_SUBMIT_FORM_URL
  3. 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.

Google Sheets (Database)

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)

Roadmap

  • 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

Contributing

  1. Fork the repo
  2. Submit a program via the Submit a Program button on the live site, or
  3. Open a PR to improve the scraper, classifier, or frontend

This is community welfare infrastructure β€” no paid tiers, no monetization, ever.


License

MIT

About

One Stop solution for founders

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages