OSV Fellowship alumni outreach pipeline for Null Bites Lab grant review.
- 80 fellows scraped from
osvfellowship.com/winners - 22 with direct email (see
data/fellows.csv) - 39 with Twitter only (manual DM fallback)
- 12 with LinkedIn only
- 7 unreachable via public channels
scripts/
scrape_winners.mjs Playwright fetch + "Load more" clicks
parse_table.mjs jsdom parse of the saved HTML into table rows
normalize.py Split year / name / country / project
enrich_contacts.py Fetch each personal/company site, extract emails
build_csv.py Roll everything into data/fellows.csv
send_outreach.py Envelope preview + Gmail send with PDF attached
templates/
email_subject.txt Subject template (tokens: {year})
email_body.md Body template (tokens: {first_name}, {year_short}, {project_hook})
data/
fellows.csv Final contact table
sent.log.jsonl Append-only send log (created on first send)
raw/ Intermediate scrapes + html_cache/ for reproducibility
node scripts/scrape_winners.mjs
node scripts/parse_table.mjs
python3 scripts/normalize.py
python3 scripts/enrich_contacts.py
python3 scripts/build_csv.py# preview envelopes only — prints every recipient, never hits Gmail
python3 scripts/send_outreach.py --dry-run
# send to every row that has a direct email (22 fellows)
python3 scripts/send_outreach.py --sendUses gws gmail messages send on awlseninc@gmail.com. Attaches
/Users/sam/workspaces/programming/NullBites-MyoFib1-ActionPlan.pdf. Idempotent:
re-running skips any recipient already present in data/sent.log.jsonl.
- Twitter-only (39): DM from Sam's account with the Drive PDF link
- LinkedIn-only (12): connection request with a one-liner + PDF link
- Unreachable (7): needs name search / LinkedIn lookup (Ian Lavoi Davis, Isaak Freeman, Miroslav Stodic, Justh (x2), Sandro Luna, Ramji Lal)