Skip to content

feat: add domainfree — bulk domain availability from RDAP - #7

Closed
ralyodio wants to merge 1 commit into
mainfrom
add-domainfree
Closed

feat: add domainfree — bulk domain availability from RDAP#7
ralyodio wants to merge 1 commit into
mainfrom
add-domainfree

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

Adds bin/domainfree — bulk domain availability, straight from the registry.

Came out of naming the sorrycheck / sinkstate projects, where the DNS approach quietly gave wrong answers.

Why not DNS

DNS cannot tell registration apart from configuration:

  • a parked domain resolves fine and is taken
  • a domain registered with no nameservers returns NXDOMAIN — identical to a name nobody owns

Measured over 8,513 generated candidates, dig NAME | grep "ANSWER: 0" reported 20 registered domains as free, and missed none that were genuinely free.

The clearest case is oubliette.com: registered in 1996, paid through 2034, three nameservers, no A record. dig returns ANSWER: 0 and it reads as available.

So DNS is fine as a cheap prefilter and wrong as a buy signal. domainfree reads RDAP instead.

Usage

domainfree sorrycheck.com sinkstate.com
domainfree -f candidates.txt
generate-names | domainfree --jobs 24
domainfree --all example.com        # show TAKEN rows too

Only available names go to stdout, one per line; the summary goes to stderr, so domainfree -f in.txt | wc -l counts what you can buy.

Details

  • Per-TLD routing: Verisign for .com/.net, PIR for .org, rdap.org for the rest.
  • 16 parallel lookups by default — 8,513 names in ~47s, no rate limiting observed.
  • Indeterminate results (429, 5xx, timeout) are retried once serially, then reported as ERR:<code> with exit status 2, so an unknown is never silently read as available.
  • Only dependency is curl.

Complements domainjson, which does a deep lookup of one name; this answers one question across thousands.

Tested

Args, stdin, -f, --all, non-.com routing, case/whitespace normalisation, junk filtering, --help and bad-flag exit codes, plus a full 8,513-name run.

Note per the repo's own README: ~/.local/bin symlinks into the working tree, so merging this does not update the installed command — git -C ~/scripts pull after merge. I've already linked ~/.local/bin/domainfree locally.

🤖 Generated with Claude Code

Prints only names that can actually be registered, one per line, so it pipes
into anything. Complements domainjson, which looks one name up in depth; this
answers a single question across thousands.

Availability comes from RDAP, never from DNS, because DNS cannot distinguish
registration from configuration:

- a parked domain resolves and is taken
- a registered domain with no nameservers returns NXDOMAIN, exactly like a
  name nobody owns

Measured over 8,513 generated candidates, the DNS shortcut
(`dig NAME | grep "ANSWER: 0"`) called 20 registered domains free while missing
none that were genuinely free. oubliette.com is the clearest case: registered
1996, paid through 2034, three nameservers, no A record — so dig reports
ANSWER: 0 and it reads as available. Good enough as a cheap prefilter, wrong as
a buy signal.

Details worth keeping:

- Per-TLD endpoint routing: Verisign for .com/.net, PIR for .org, rdap.org for
  everything else.
- 16 parallel lookups by default; 8,513 names take ~47s with no rate limiting.
- Indeterminate results (429, 5xx, timeout) are retried once serially, then
  reported as ERR:<code> with exit status 2, so an unknown is never silently
  read as available.
- The summary goes to stderr and names to stdout, so `domainfree -f in.txt |
  wc -l` counts what you can buy.

Tested: args, stdin, -f, --all, non-.com routing, case and whitespace
normalisation, junk filtering, help/bad-flag exit codes, and an 8.5k-name run.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@ralyodio

Copy link
Copy Markdown
Contributor Author

Superseded by profullstack/cli-tools#8, merged and shipped in v0.2.0.

cli-tools is where the CLI tools are migrating (domainjson, blog-post, gh-prs*, tcfeed are all there already), it exposes the tool to moshcode as a domain plugin, and it has vitest coverage. Keeping a second bash implementation here would only drift.

Closing unmerged rather than resolving the README conflict.

@ralyodio ralyodio closed this Aug 19, 2026
@ralyodio
ralyodio deleted the add-domainfree branch August 19, 2026 13:31
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