Domain Looker
Domain Looker checks up to 100 domains at once against official registry data and tells you honestly which are taken and which might be free. Paste anything: URLs, Markdown links, international names. No API keys and no registrar upsell.
The short version
An open-source web app for bulk domain availability pre-checks using RDAP, the structured, registry-published successor to WHOIS.
A React 19 and Vite front end with an Express API in strict TypeScript: input normalisation with public-suffix rules, IANA bootstrap routing, per-registry pacing, caching, six explicit result states and CSV export, with tests and CI on GitHub.
Precision in a small tool. It never confuses a failed request with an available domain, and every exported row keeps where it came from.
From the implementation and repository, 4 October 2026.
Six messy lines.
Five honest rows.
The parser accepts ordinary URLs and Markdown links, strips paths and subdomains, uses public-suffix rules to find the registrable name and converts international names to their ASCII lookup form. Duplicates collapse to one lookup; an invalid line gets its own row instead of stopping the batch.
| Pasted | Normalized | Result |
|---|---|---|
https://www.example.org/pricing | example.org | Registered |
[Our blog](https://blog.example.net/launch) | example.net | Registered |
bücher.de | xn--bcher-kva.de | Registered |
example.org | example.org | Duplicate, skipped |
not a domain | (none) | Invalid |
my-brand-idea-2026.com | my-brand-idea-2026.com | Likely available |
Six pasted lines become five result rows. Sample data, as in the demo mode below.

- APaste anything. URLs, Markdown links, names, mistakes.
- BCounted honestly. 5 unique rows checked, 1 duplicate skipped.
- CDemo mode is labelled. Demo results are clearly labelled on screen.
- D“Likely”, not “available”. The wording matches what RDAP can prove.
Current desktop interface running locally in demo mode, 4 October 2026.
A missing record
is not a failed request.
RDAP is the registration-data service behind every check. Each response maps to one explicit state, and only one of them suggests a name might be free.
A registration record was returned.
No record found. A registrar still confirms purchase eligibility.
Try later. This says nothing about availability.
Keep the reason instead of guessing.
Implemented response handling, covered by tests.
Spend requests
where they are useful.
The Node service uses IANA’s registry directory to route each lookup. Within a batch it allows up to four requests at once and one active request per registry host. Recent results are reused for 15 minutes, labelled as cached, with the original check time kept.
The export follows the active filter and carries the original input, normalized domain, status, notes, check time and cache flag, so the result stays interpretable after it leaves the tool.
| Original input | Normalized | Status | Checked | Cache |
|---|---|---|---|---|
https://www.example.org/pricing | example.org | registered | 2026-10-04T12:00Z | no |
bücher.de | xn--bcher-kva.de | registered | 2026-10-04T12:00Z | no |
not a domain | invalid_domain | 2026-10-04T12:00Z | no |
Selected fields from the real CSV formatter, sample data.
A modest task,
done precisely.
- Mixed-input parsing with public-suffix rules
- International domain conversion
- Batch de-duplication and per-row errors
- Six explicit result states
- Per-registry pacing and 15-minute cache
- Filtered CSV export with provenance
MIT licensed, strict TypeScript, tested and running CI on GitHub.
Have a recurring task a small tool could simplify? Start a conversation
All projects ↗Available for select projects and opportunities
Have a website that needs to win work?
Let’s work together. Have a project in mind or a role you’re hiring for? I’d like to hear about it.
Nothing opened? Use Copy address and paste it into your email app.