← Back to work

LeadForge

Live

Replaces a full-time SDR and $300–500/month in tooling with a self-optimizing pipeline that sources, scores, enriches, and reaches out to funded startups — free sources only, humans approve every send.

3,600+
Leads processed
74%
Contactability
516
Peak sends / day
4.5%
Bounce rate
01

The problem it solves

Outbound prospecting burns 20+ SDR hours a week on research, email hunting, and follow-up tracking. The standard automation stack — Apollo for data, Hunter for emails, Instantly for sending — runs $300–500 a month before a single reply lands. Worse, volume-first automation actively hurts: it floods the funnel with unqualified leads and pattern-guessed emails, and the bounce rate quietly destroys sender reputation — the one asset outbound can't buy back.

LeadForge's founding thesis is written into its scoring engine: 100 real buyers a day beat 10,000 junk leads. Everything optimizes Revenue > Meetings > Replies > Quality > Quantity, in that order.

02

What I built

A streaming pipeline that runs continuously: ~40 free-source scrapers ranked by a quality-weighted bandit fill a buffer; each processing cycle drains it through noise filtering, dedup, 0–100 revenue scoring, a hot-lead fast lane, zero-cost contact enrichment, LLM composition, and guarded multi-provider sending. Replies come back through an IMAP poller, get classified into 11 intents, and feed follow-up sequences. A live Next.js Command Center shows the funnel, deliverability, source ROI, and the reply inbox in real time — and a five-squad AI build org maintains the codebase itself under human-merge-only governance.

~40 Free
Sources
Bandit Rank
+ Noise Filter
Dedup +
0–100 Score
Enrichment
Waterfall
LLM Compose +
Guarded Send
IMAP → 11-Intent
Reply Loop
03

Key features

04

System internals

ComponentWhat it does
scrapers/~40 source scrapers behind one registry with per-source circuit breakers, rate limiters, and priorities. A goal-file noise gate filters junk before anything is stored.
enrichment/Revenue scoring into tiers (PRIORITY ≥78 · STRONG ≥62 · STANDARD ≥45), decision-maker discovery with title-authority ranking, ICP gating, entity resolution, and semantic dedup (sentence-transformer cosine, 0.92 threshold).
mailer/Provider-routed sending (Gmail API / SMTP / Brevo) with idempotency keys, send-window gating, preflight checks, bounce parsing, failure classification, 5 drip sequences, and the breakup email as a non-skippable step.
ai_services/The single LLM gateway (4-tier fallback), reply/lead intent classifiers, personalization, and a self-improve loop — with prompt caching and auto-truncation keeping token cost near zero.
tracker/SQLite (WAL) with 27 tables. Lead lifecycle: scraped → qualified → queued → contacted → replied → call_booked → proposal → won/lost. "Already contacted" truth lives in the send ledger, not a status string.
jobs/A parallel job-postings subsystem — 10,000+ postings tracked across Ashby, Greenhouse, Lever, and more, dual-routing hiring signals into lead scoring.
workflows/A visual workflow engine: 30 defined workflows, 3,800+ recorded runs with full node-level event logs.
build orgFive AI build squads (acquisition, enrichment, outreach, UI, platform) plus an architect with veto power, a read-only data-health auditor, and a regression gate — agents open PRs, only humans merge.
05

Tech stack

FrontendNext.js 14 · React 18 · TypeScript · Tailwind CSS · React Flow · Recharts · SSE live log stream
BackendPython · Flask · threaded daemons (reply poller · daily pipeline · workflow scheduler) · Pydantic v2
AI / MLClaude CLI · Ollama · Claude Haiku API · sentence-transformers · scikit-learn · multi-armed bandits (source + query)
ScrapingPlaywright · BeautifulSoup4 · Chrome Extension MV3 (LinkedIn capture) · ATS APIs · GraphQL
OutreachGmail API · SMTP · Brevo · IMAP polling · dnspython MX validation · live SMTP handshakes
DataSQLite (WAL, 27 tables) · JSON state stores (bandit, dedup memory, learned queries, entity graph)
06

Impact — live database numbers

1,744
Emails enriched
Zero data-API spend — scraping + patterns + SMTP verification
525
Named decision-makers
Founder/CEO/CTO-ranked contacts with verified reachability
1,450
Emails delivered
66 bounces = 4.5% — sender reputation intact
10,176
Job postings tracked
Hiring signals feeding the lead-scoring engine
07

Reliability & safety engineering

08

Decisions worth talking about

The bandit rewards quality, not volume

Each source's score is success-rate × speed × quality-yield, where quality-yield counts qualified leads, verified emails, and decision-makers at double weight. The war story that forced this: one source produced 1,070 leads across 23 runs with zero qualified — and was outranking the best source on raw volume. Measured-zero converters now get starved to a 0.35 multiplier; proven converters get floored at 0.85 so a bad week can't kill a good source. Unmeasured sources keep an exploration prior of 0.8 until they've earned ~10 runs of confidence.

Resolve domains by MX, not by .com

Startup domains lie. The resolver sweeps nine TLDs (.com, .ai, .io, .app…) and accepts a candidate only if it has real MX records — because the .com is often parked while the company actually lives on the .ai. Before this rule, pattern emails were being generated against domains that couldn't receive mail at all.

Guessed emails earn zero score

Pattern-generated addresses that haven't survived a live SMTP handshake get exactly zero contactability points, and a weak unnamed inbox is not treated as an email channel at all — role inboxes cap at 0.3 confidence. Topline numbers look worse; the bounce rate says it's worth it.

Contact forms verified by GET, not HEAD

Single-page apps happily return 200 for any path, inflating "has a contact form" counts. The detector fetches the actual body and requires real form markers before claiming a contact channel exists — and treats a 405-on-GET as a valid POST-only endpoint rather than a failure.

The breakup email always sends

Sequence data shows the final "closing the loop" touch consistently earns the highest reply rate. It's wired as a non-skippable step in every sequence, regardless of prior engagement. Counterintuitive, entirely data-driven.