Skip to content

Read the page an address points at, and know when it points at none - #65

Merged
ralyodio merged 1 commit into
mainfrom
feat/web-presence
Aug 19, 2026
Merged

Read the page an address points at, and know when it points at none#65
ralyodio merged 1 commit into
mainfrom
feat/web-presence

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

"you need to scour the web for them and find their contact pages and socials"

Why Gravatar was not enough

18 identities from the first 1,800 people — about 1%. Gravatar is opt-in twice over: you need an account and you need to have attached your other accounts to it.

What the list actually is

I looked at the 16,268 rows now in prod before building anything, and they are not what the domain mix suggested:

count what the web gives you
publication handle 5,934 (36%) 0xshah@substack.com0xshah.substack.com — the local part is the subdomain
company domain ~5,000 (31%) 4,235 distinct sites
nothing ~5,300 (33%) gmail, yahoo, icloud…

The first two are pages the crawler already reads — it pulls a name, a title and published social links out of a site, which is precisely what an imported row is missing.

Derivation, not guessing

Every rule turns an address into a page it demonstrably belongs to. None invents a handle on a network the person never mentioned. This codebase already refuses to do that for email addresses — which it could at least verify by sending to — and an unverifiable social identity is worse.

Knowing when to do nothing is the valuable half

Sending every Gmail address to google.com would be 5,000 fetches of a page about nobody, and it would look like the feature working.

The tests caught a real one: qq.com was missing from the freemail list — 127 addresses that would have been read as company domains and sent the crawler to Tencent's homepage. The international consumer providers are now listed (163, naver, seznam, orange, comcast, …).

first.last@substack.com also correctly resolves to nothing: that is not first.last.substack.com, and building a hostname from it would fetch something that does not exist.

Cost control

Crawls are enqueued under the same dedupe key as everything else, so four hundred people at one company read that site once. That lesson cost 226 identical crawls of accenture.com in #63.

Verification

  • bun test1380 pass, 0 fail across 91 files
  • typecheck and format:check clean
  • 10 new tests, weighted toward the must-not-resolve cases

What this will cost when it runs

Roughly 10,000 distinct pages (5,934 publications + 4,235 domains). At 25 jobs/tick that is several hours of crawling, and each crawl makes a model call for extraction. Worth knowing before merging — I can add a per-tick cap if you would rather meter it.

🤖 Generated with Claude Code

Gravatar answers for about one person in a hundred: 18 identities from the
first 1,800 of a real list. That is not enough to call an address enriched,
and the reason is that Gravatar is opt-in twice over — the person must have
an account and must have attached their other accounts to it.

An address usually points somewhere anyway. Measured against the 16,268-row
list now in production:

  36%  a publication handle  — 5,934 substack.com addresses, where the
       local part *is* the subdomain, so 0xshah@substack.com is the
       account behind 0xshah.substack.com
  31%  a company domain      — 4,235 distinct sites
  33%  nothing at all        — gmail, yahoo, icloud and friends

Those first two are pages the crawler already knows how to read: it pulls a
name, a title and published social links out of a site, which is exactly
what is missing from an imported row.

This is derivation, not guessing, and the distinction is load-bearing. Every
rule turns an address into a page that address demonstrably belongs to. None
invents a handle on a network the person never mentioned — the codebase
already refuses to do that for email addresses it could at least verify by
sending to, and an unverifiable social identity is worse.

Knowing when to do nothing is the more valuable half. Sending every Gmail
address to google.com would be five thousand fetches of a page about nobody,
and it would look like the feature working. `qq.com` was missing from the
freemail list entirely — 127 addresses that would have been read as company
domains and sent the crawler to Tencent — which is what the test caught and
why the international consumer providers are now listed.

Crawls are enqueued under the same dedupe key as everything else, so four
hundred people at one company read that company's site once. That lesson
cost 226 identical crawls of accenture.com.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@ralyodio
ralyodio merged commit 3a976f8 into main Aug 19, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant