Founder email finder agent

A founder’s public email, from wherever they published it, with the page it came from.

Most founders publish no email where you would first look, and the usual fixes are the wrong ones: guessing first.last@ bounces and reads as spam, and buying addresses from a database is a list the founder never agreed to be on. The address is often public somewhere else — a Hacker News profile, a GitHub profile, a personal site linked from an X bio — but nobody has time to look in six places for every name.

Running on our own company since Oct 23, 2026 · Company sites · Hacker News · GitHub · X · Web search · Risk: Low. Everything on this page is public; there is nothing to sign in for.

Goes inThe YC leads file: companies without an address on record, their founders’ names and links
Comes outOne ledger row per company: the best address, its kind (personal, generic, other), the source and the page, or why none
Human stepNobody. A one-line note after each scheduled run; the cold email agent reads the ledger
Runs onA machine with Node.js; no browser, no sign-in

Tasks and outputs

What it takes on

Pick companies

Companies with no address on record, not tried in the last thirty days, up to ten a run.

Up to 10 companies

Read every public source

The YC page, the company site, the Launch HN author’s profile, matching GitHub profiles, the X bio, and search results that name the founder.

Addresses with provenance

Classify and record

Personal, generic or other, against each founder; one ledger row per company with the best address and where it was read.

Ledger row

Who it is for: Teams doing outbound into a list of startups who want every address to be one the person published themselves, and who want to know where each one came from.

How we use it: Built October 2026 and running daily over the YC leads the scraping agent collects, since its first look-ups on 23 October. It is the only part of our outreach that looks for addresses; the cold email agent reads from its ledger and never looks itself.

This is the same build-it-or-we-run-it model behind our AEO work. See your own AI visibility baseline

tools/email-finder/sources.mjsRules of the sources module

What counts as an address, and what does not

01Only an address printed on a public page or returned by a public API counts: a mailto: link, text on a page, a profile field.

02An address is personal when its local part is the founder’s name (first, first.last, initials on the company domain …), generic when it is hello@, team@, founders@ and the like on the company domain, other when it is someone else’s name on the company domain.

03An unrelated address on an unrelated domain is not evidence of anything and is dropped, however prominent the page.

04Nothing is derived from a name pattern; no third-party database is queried; LinkedIn is never opened.

05A company with no address found is tried again only after the retry wait; a company with an address is not looked at again.

Read from the sources moduleSix sources, each optional

The rules the agent’s output is written to, from the file named above. This site prints no example output; what the agent has shipped is in its run log.

Workflow

How a run goes, step by step

Pick a step to see what goes in, what comes out, and where a person is involved.

Step 1 of 4

Pick the day’s companies

Reads the leads file and the finder’s own ledger; keeps companies with no found row and no attempt within the retry wait, up to the daily cap.

Goes in

The leads file, the ledger

Comes out

Up to ten companies with their founders’ names and links

Where a person steps in

Nobody. With nothing to look at, the run says so and stops.

Step 2 of 4

Read the sources

For each company: the YC page first (website, founder cards, mailto: links), then the company site, Hacker News, GitHub, X and web search, each adding addresses with the page they came from. A source that errors is noted and skipped.

Goes in

One company and its founders

Comes out

Every address seen, with source and page

Where a person steps in

Nobody.

Step 3 of 4

Classify and write the row

Scores every address against every founder; the best personal address wins, then a generic one on the company domain when allowed. One row per company goes into the ledger; the others seen are kept in the row’s note.

Goes in

The addresses seen

Comes out

One ledger row: found with email, kind, source, page — or none, no-website, error

Where a person steps in

Nobody.

Step 4 of 4

Commit and tell

Commits the ledger alone and pushes; emails a one-line count to the team. The cold email agent reads the ledger on its own run.

Goes in

The day’s rows

Comes out

The ledger on the main branch; a note

Where a person steps in

Nobody; the note is for the record.

Before you start

What you’ll need to bring

Company material

A list of companies and founders to look for: name, a key (we use the YC slug), the founders’ names, and whatever social links you already have.

Source material

Nothing to configure for the public sources. The X source needs the team’s X developer credentials on the machine and is skipped without them.

Platform account

None. Nothing signs in anywhere; the X developer account is optional and read-only.

Run environment

Node.js and a scheduler. We use Windows Task Scheduler, before the cold email agent’s window, so the addresses are there when it picks.

Run log

Recent runs, as they happened

The full log is public and read-only. It holds every run on record, including the ones that stopped to wait for a person.

View the full run log

Guides and files

Set it up yourself

The setup guide, and the files the agent is built from. You run it in your own environment, with your own accounts.

Open · no account neededThree Node scripts (the sources module, the run, the one-line note) and a scheduled wrapper. No model, no browser, no sign-in: public pages and public APIs only (Algolia and Firebase for Hacker News, the GitHub REST API unauthenticated, the X API through the team’s own developer account, DuckDuckGo’s HTML results). Not packaged for public download yet — the setup guide below describes what they do; the managed tier runs it for you today.
Setup guide
  1. 01

    Runtime

    • Node.js. A scheduler for the daily run, or a person running it by hand.
    • An input list with company name, YC slug and founder names — ours is the YC scraping agent’s leads file.
  2. 02

    Browser setup

    • None. Every source is read as plain HTTP or through a public API.
  3. 03

    Account setup

    • None required. Optionally the X developer account’s credentials, which let the finder read founders’ X bios; without them that source is skipped silently. For the scheduled run, AWS credentials for the one-line note.
  4. 04

    Configuration

    • Companies per run (ten by default, capped at twenty-five), the retry wait for companies with no address found (thirty days), whether a generic address counts as found, the pause between companies, and which sources to use.
  5. 05

    First run

    • Run the finder on one company you know (--slug) and read the row: the address, its kind, the source and the page. Open the page and confirm the address is printed there.
    • Run a day’s batch and read the notes: the other addresses seen and where, and which sources errored.
    • Run it a second time the same day and confirm it looks at nothing — every company is either found or within its retry wait.
Files · 7

email-finder.md

Workflow · Markdown. The run by hand: look, report, commit; the hard rules.

Workflow

config.md

Configuration · Markdown. The daily cap, the retry wait, whether generic counts, the pause, the sources, the note’s addresses.

Configuration

sources.mjs

Script · Node. The six sources and the classifier: what counts as the founder’s address and what does not.

Script

find.mjs

Script · Node. The run: pick companies, read the sources, write one ledger row each.

Script

notify.mjs

Script · Node. The one-line note after a scheduled run.

Script

run-email-finder.ps1

Scheduler · PowerShell. The daily run: the checkout, the look-ups, one commit of the ledger, the note.

Scheduler

find-log.md

Ledger · Markdown. One row per company looked at: result, address, kind, source, page, pages read, note. The file this log is built from and the cold email agent reads.

Ledger

Not packaged for public download yet. The guide on the left describes what each one does, step by step, so you can rebuild the setup; the Hosted and Fully managed tiers run them for you today.

Rather have us run it?

Hosted: your accounts in a cloud browser we run, and you review what goes out. Fully managed: we set the strategy and run the agents.

Good to know

Where it stops and asks for you

  • Nothing to look at. Every company has an address on record or was tried within the retry wait. The run stops before any read; a person adds companies to the list or lowers the wait.
  • A source errors. The error goes into the row’s note and the other sources still run. Nothing is retried on its own.
  • GitHub or search rate-limits. The row notes it; the next day’s run tries the next companies. The daily cap and the pauses are the throttle.
  • Only a generic address was found. Recorded as generic when allowed, otherwise as none with the address in the note. The cold email agent decides whether a generic address is worth writing to.

Risk notice

What to watch for

  • Only what a founder or their company published counts: no pattern guessing, no purchased data, LinkedIn never opened. Coverage is therefore uneven by design.
  • A personal address on a personal domain (found through GitHub, Hacker News or a search result) is the founder’s own, but it is their personal mailbox; the cold email agent treats it like any other address and the opt-out rules apply the same way.
  • Pages change and APIs rate-limit; a source that errors is noted in the row and the others still run. A run is never retried on its own.
  • The ledger holds names and addresses. The public log shows counts only; the file itself is in the repository the team already uses for its lead data.

FAQ

Questions about this agent

Most companies come back with no address.

Expected for young startups: many publish none anywhere. That is a true result, not a failure; the row says none and the company is tried again after the retry wait. Nothing is guessed to fill the gap.

It found a generic address, not the founder’s.

hello@ or founders@ on the company domain is recorded as generic. The cold email agent prefers personal addresses and skips a generic one at a company of more than ten people; you can also turn generic results off in the configuration.

GitHub search is slow.

Unauthenticated GitHub search allows ten requests a minute, so the finder waits six seconds between founders. A run of ten companies takes a few minutes; it is scheduled early for that reason.