Describe the brand you want. Vacant suggests names with AI and shows only the domains you can actually register.
Vacant is a free, open-source, self-hostable domain finder. Clone it and run it, or pull the prebuilt container. Nothing is hosted for you and nothing is monetized.
Only-available results, checked live and ranked best first:
Patterns are highlighted as you type, so you can see the shape of the name:
- Two ways to search: describe a brand in plain words, or sketch its shape with patterns.
- Only available names: every suggestion is checked against the registries before you see it.
- Ranked best first: results are scored for length, pronounceability, and brandability.
- Live price estimates: a keyless lookup adds a yearly price to each available name.
- Save and revisit: favorites and recent searches are kept locally in your browser.
- Self-hostable: one command with Bun, or one container. Bring your own API key.
Type in two ways, or mix them:
- Plain words:
a calm fintech brand, short and warm. The AI proposes brandable names. - Patterns: sketch the shape of the name.
(animals): a slot the AI fills in.(com/io): exact options, no AI, no guessing.- Everything else is literal:
get(action word)app.(com/io).
Every suggestion is ranked best-first, then checked for real registration availability. You only see names you can register, each with a live price estimate and a one-click link to a registrar.
Availability is resolved server-side through a cascade that is free and key-optional for most TLDs:
- RDAP: the authoritative registry lookup (from the IANA bootstrap).
- DNS: an existing
Arecord proves a domain is taken. - WHOIS: a fallback for TLDs the first two miss.
- Domainr: an optional final fallback if you supply a key.
Results stream back as each domain resolves, behind a shared cache and a concurrency limit, so a search of dozens of names is one request, not a storm.
Requires Bun.
bun install
cp .env.example .env.local # add your OpenRouter key
bun devOpen http://localhost:3000.
| Variable | Required | Purpose |
|---|---|---|
OPENROUTER_API_KEY |
Yes | Powers AI suggestions. Get one at https://openrouter.ai/keys. |
OPENROUTER_MODEL |
No | Any OpenRouter model with structured output. Default google/gemini-3.5-flash. |
DOMAINR_RAPIDAPI_KEY |
No | Improves availability accuracy on TLDs that RDAP and WHOIS miss. |
Pricing comes from a public, keyless endpoint, so no extra key is needed for the price estimates.
Pick a fast instruction-tuned model. Heavy reasoning models are slower, cost more, and can fail to return the structured output Vacant needs.
Pull and run the published image:
docker run -p 3000:3000 -e OPENROUTER_API_KEY=sk-... ghcr.io/martian56/vacant:latestOr with Compose, using a local .env:
docker compose upBuild the image yourself:
docker build -t vacant .
docker run -p 3000:3000 -e OPENROUTER_API_KEY=sk-... vacantbun run dev # start the dev server
bun run build # production build (standalone output)
bun run test # run the unit tests
bun run lint # eslint
bun run typecheck # tsc --noEmit
bun run format # prettier --write
bun run update-tlds # refresh lib/tlds.json from the IANA RDAP bootstrapBun · Next.js (App Router) · TypeScript · Tailwind CSS · Vercel AI SDK · OpenRouter.
Issues and pull requests are welcome. Please read CONTRIBUTING.md and the Code of Conduct first.


