← Back to Projects
Machine LearningIterating

LabReach AI

Research outreach helper: scrape lab pages, draft with a local LLM option, and never send until I review.

Cold email prep was eating time, so I automated the boring parts and refused to automate the dangerous one. LabReach finds faculty pages, pulls context, drafts with Ollama when I want text to stay local, and writes a review artifact before Gmail can do anything. JS-heavy department sites break naive scrapers. That is fine. Guessing an email and blasting it is not.

Engineering highlights

  • Hybrid scrape path for JS-heavy faculty pages
  • Local drafting option so research notes do not have to hit a cloud API
  • Hard review step before any send
Date
2026
Focus
ML + Tools
Build stage
CLI pipeline working; expanding campaign tooling
Disciplines
Scraping · LLM Drafting · Send Control
ml-toolsautomationscrapingworkflow
Workflow preview
Full write-up below. The hero is the short version. This is the build story: what I designed, what broke, and why I made the calls I did.

Motivation

Why I started this

What pulled me in, and what I wanted to get better at.

Why I built it

Research outreach prep was repetitive, and fully automatic emailing felt reckless. I wanted help without a silent send button.

What interested me

Faculty pages are messy. LLM drafts are easy. Sending the wrong email is expensive.

What I wanted to learn

I built scrape, draft, review, then maybe send. Local Ollama is there when I do not want research notes leaving my machine.

System Overview

How the system fits together

LabReach finds lab pages, pulls context, drafts outreach, and forces a review step before Gmail can send anything.

01

Discovery

Crawl department listings and candidate lab URLs.

02

Extraction

Pull emails and research context from messy faculty pages.

03

Drafting

Local or configured LLM turns context into outreach text.

04

Review gate

Human checkpoint is mandatory before send scheduling.

Data flow

URLs → scrape/extract → structured profiles → LLM draft → review artifacts → optional send.

Control flow

Campaign state lives in SQLite. Send actions are explicit; drafts never auto-mail.

Engineering Breakdown

Broken down by discipline

Each block covers the goal, the design, what broke, what changed, and what shipped.

01Acquisition & Extraction

Acquisition & Extraction

Goal

Turn JS-heavy faculty pages into structured outreach context.

Design

BeautifulSoup plus Playwright for pages that defeat static HTML. Extraction quality varies; the pipeline records failures instead of guessing emails.

Challenges

  • JS-rendered directories break naive scrapers.
  • Email formats and robots policies vary by department.

Iterations

  • Static scrape
  • Playwright path
  • Per-site failure logging

Final implementation

Hybrid extraction with stored context for the drafting stage.

02Drafting & Control Plane

Drafting & Control Plane

Goal

Accelerate writing without removing human accountability.

Design

Ollama/local drafting option, template context, and review artifacts before Gmail API send.

Challenges

  • Automation without brakes creates reputation risk.
  • Draft quality still needs domain-aware editing.

Iterations

  • Single-email script
  • Campaign history
  • Hard review gate

Final implementation

CLI pipeline where review is part of the product, not an afterthought.

Key Design Decisions

Calls I actually made

What else was on the table, what I picked, and why it still made sense once the hardware was real.

01

Human review as invariant

The problem

Can drafts ever send automatically?

Alternatives considered

  • Auto-send
  • Review required

Tradeoffs

Auto-send is faster and unsafe for cold academic outreach.

Why I chose this

Review artifacts required before send.

02

Local drafting option

The problem

Where should sensitive research text go?

Alternatives considered

  • Cloud-only LLM
  • Local Ollama path

Tradeoffs

Cloud is convenient; local keeps drafts off third-party servers.

Why I chose this

Support local drafting for sensitive workflows.

Evolution

How it got here

Bench bring-up, CAD fits, soldering, and the demos in between. Not just the final photo.

  1. v1

    Script

    One-off scrape and draft.

    No media for this milestone yet.
  2. v2

    Pipeline

    Discovery, storage, and review gates.

    No media for this milestone yet.
  3. Next

    Observability

    Stronger campaign retries and metrics.

    No media for this milestone yet.

Results & Validation

What held up

What worked in the end, what I can show for it, and where it's still limited.

Working CLI pipeline

GitHub labreach-ai

End-to-end prep flow with a mandatory review step before mail.

Limitations

  • Not a hosted SaaS; extraction quality remains site-dependent.

Reflection

Looking back

What surprised me, what I'd redo, and questions I'm still chewing on.

What surprised me

  • The review layer mattered more than clever prompting.

What I would redesign

  • More structured schema for faculty pages.

Future improvements

  • Campaign observability and safer retry policies.

Questions that emerged

  • Where should academic outreach automation stop?