feat: add domainfree — bulk domain availability from RDAP - #7
Closed
ralyodio wants to merge 1 commit into
Closed
Conversation
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>
Contributor
Author
|
Superseded by profullstack/cli-tools#8, merged and shipped in v0.2.0. cli-tools is where the CLI tools are migrating ( Closing unmerged rather than resolving the README conflict. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds
bin/domainfree— bulk domain availability, straight from the registry.Came out of naming the
sorrycheck/sinkstateprojects, where the DNS approach quietly gave wrong answers.Why not DNS
DNS cannot tell registration apart from configuration:
NXDOMAIN— identical to a name nobody ownsMeasured 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, noArecord.digreturnsANSWER: 0and it reads as available.So DNS is fine as a cheap prefilter and wrong as a buy signal.
domainfreereads RDAP instead.Usage
Only available names go to stdout, one per line; the summary goes to stderr, so
domainfree -f in.txt | wc -lcounts what you can buy.Details
.com/.net, PIR for.org,rdap.orgfor the rest.ERR:<code>with exit status 2, so an unknown is never silently read as available.curl.Complements
domainjson, which does a deep lookup of one name; this answers one question across thousands.Tested
Args, stdin,
-f,--all, non-.comrouting, case/whitespace normalisation, junk filtering,--helpand bad-flag exit codes, plus a full 8,513-name run.Note per the repo's own README:
~/.local/binsymlinks into the working tree, so merging this does not update the installed command —git -C ~/scripts pullafter merge. I've already linked~/.local/bin/domainfreelocally.🤖 Generated with Claude Code