affix-domains · diff
git:20260714.e2c3982 to git:20260827.732a77b
56 added, 14 removed. Audit A to A.
---
name: affix-domains
- description: Attach popular brand prefixes/suffixes to a seed word and check each `.com` via Verisign RDAP. Use when the user names a word and asks for prefix/suffix `.com` variants, or wants domains generated by adding endings like -ly/-ify/-hub or beginnings like open-/get-/go-.
+ description: Attach popular brand prefixes/suffixes to a seed word and check availability against the authoritative registry. Starts at `.com`; if the seed word's own `.com` is taken, escalates the whole sweep to .com/.net/.org/.ai/.io/.co/.app/.cc. Use when the user names a word and asks for prefix/suffix domain variants, or wants domains generated by adding endings like -ly/-ify/-hub or beginnings like open-/get-/go-.
---
# affix-domains
- **Affix** a seed word with common brand prefixes and suffixes, check each `.com` live, and prompt the user to register the free ones.
+ **Affix** a seed word with common brand prefixes and suffixes, check each candidate live against the authoritative registry, and prompt the user to register the free ones.
## Steps
- 1. **Generate candidates.** For seed `W`, produce `W` + each suffix and each prefix + `W` from the catalog below. Lowercase. Dedupe. Drop any combination that spells an existing English word (e.g. `getup`, `openbox`) — its `.com` is almost certainly taken and burns an RDAP call. If the user hints a style (playful, techy, marketplace…), weight the matching categories; default is every category.
+ 1. **Gate on the bare seed's `.com`.** Before generating anything, check `<seed>.com` alone. It decides the scope of everything below:
- 2. **Check `.com` availability** via Verisign RDAP (authoritative for `.com`):
+ - **Free** → the seed itself is winnable. Say so up front, then run the affix sweep on **`.com` only** — the original contract. Nothing else is needed.
+ - **Taken** → escalate. Every check from here on runs across the **full TLD set**: `.com .net .org .ai .io .co .app .cc`. Also sweep the **bare seed** across the other seven — `mate.ai` is worth more than `matebuddy.com`, and it costs eight lookups to find out.
+
+ 2. **Generate candidates.** For seed `W`, produce `W` + each suffix and each prefix + `W` from the catalog below. Lowercase. Dedupe. Always drop triple-letter runs (`mateee`) and a suffix that repeats the seed (`matemate`).
+
+ The English-word filter is **mode-dependent**: in `.com`-only mode, drop any combination that spells an existing English word (e.g. `getup`, `openbox`) — its `.com` is almost certainly taken and burns a lookup. In **escalated mode, keep them** — that rationale is `.com`-specific, and a real word gone in `.com` says nothing about `.ai` or `.cc`. (`mately` is a dictionary adverb *and* the flagship `-ly` SaaS pattern; it is free in six TLDs.) If the user hints a style (playful, techy, marketplace…), weight the matching categories; default is every category.
+
+ 3. **Check availability** with the bundled script, which already encodes the per-TLD endpoint, parallelism, and retry rules. It lives in this skill's `scripts/` dir — invoke it by absolute path:
+
```bash
- for d in cand1.com cand2.com ...; do
- code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 \
- "https://rdap.verisign.com/com/v1/domain/${d}")
- # 404 = AVAILABLE, 200 = TAKEN
- done
+ ~/.claude/skills/affix-domains/scripts/check_domains.sh \
+ --tlds com,net,org,ai,io,co,app,cc cand1 cand2 cand3 ...
```
- For >15 candidates parallelize with `xargs -P 8`. Treat **only 404** as available; anything else means taken or ambiguous.
- 3. **Surface the survivors** grouped by the catalog category that produced them. One line per free `.com`.
+ With many candidates, pass them on stdin instead: `printf '%s\n' "${cands[@]}" | … --stdin`.
- 4. **Prompt the user to register.** Ask which they want to take. Point them to Cloudflare Registrar (or their preferred one). Do not enter payment on their behalf — registration is the user's action.
+ Pass **bare names, not domains** — the script forms `name.tld` itself. Output is one `<domain>\tFREE|TAKEN|UNKNOWN` line per lookup. A full 63-affix escalated sweep is ~500 lookups and takes roughly 30–60s, paced by the serial `.app` path.
+ **`UNKNOWN` is not `FREE`.** It means the registry never gave a clean answer. Never show it as available; re-run those few names, and if they stay UNKNOWN, say so explicitly.
+
+ 4. **Surface the survivors.** In `.com`-only mode, list one line per free `.com`, grouped by the catalog category that produced it.
+
+ In escalated mode the raw cross-product is far too long to dump. Instead, rank each surviving name by its best available TLD, using this preference order:
+
+ `.com` > `.ai` > `.io` > `.co` > `.net` > `.org` > `.app` > `.cc`
+
+ Show the best one or two TLDs per name, grouped by catalog category, and offer the complete matrix only if the user asks. Note when a name is free across *many* TLDs — that usually means it is genuinely unclaimed rather than merely available in the leftovers.
+
+ 5. **Prompt the user to register.** Ask which they want to take. Point them to Cloudflare Registrar (or their preferred one) — note that Cloudflare Registrar does not sell every TLD in this set, so a second registrar may be needed. Do not enter payment on their behalf — registration is the user's action.
+
+ ## TLD endpoints
+
+ Verified 2026-08-27, each against a known-taken and a known-free control. The script holds these; the table is here so a human can audit it.
+
+ | TLD | Method | Endpoint | Notes |
+ |---|---|---|---|
+ | `.com` | RDAP | `rdap.verisign.com/com/v1/domain/` | Verisign, authoritative |
+ | `.net` | RDAP | `rdap.verisign.com/net/v1/domain/` | Verisign |
+ | `.cc` | RDAP | `tld-rdap.verisign.com/cc/v1/domain/` | Verisign, but a **different host** than `.com`/`.net` |
+ | `.org` | RDAP | `rdap.publicinterestregistry.org/rdap/domain/` | PIR |
+ | `.ai` | RDAP | `rdap.identitydigital.services/rdap/domain/` | Identity Digital |
+ | `.io` | RDAP | `rdap.identitydigital.services/rdap/domain/` | same host as `.ai`; **not in the IANA bootstrap** |
+ | `.app` | RDAP | `pubapi.registry.google/rdap/domain/` | Google Registry; **rate-limited**, see below |
+ | `.co` | **WHOIS** | `whois.registry.co` | **No RDAP service exists.** Free ⇔ `DOMAIN NOT FOUND` |
+
+ **`.app` rate limiting is a rolling quota, not a concurrency cap.** Dropping to `-P 2` does not help — once the budget is spent, every request 429s regardless of parallelism. The only fix is serial requests plus backoff-and-retry, which is what the script does. Treat `429` as *retry*, never as an answer.
+
+ ### Endpoints that look right and are wrong
+
+ Both of these return **HTTP 404 for domains that are definitely registered** — a silent false-available that would tell the user to go buy a taken domain. Do not substitute them:
+
+ - `rdap.godaddy.com/v1/domain/` — 404s on `t.co`. It is the *registrar's* RDAP, not the registry's.
+ - `rdap.org/domain/` — a bootstrap proxy; 404s on both `.co` and `.io` because neither is in the IANA bootstrap file.
+
## Suffix catalog
### Verbifier — "does X as a service"
| Affix | Feel · exemplars |
|---|---|
| -ify | turns the word into a service (Spotify, Shopify) |
| -ize | systematize (Rentalize) |
| -ate | automate/activate (Automate) |
### Short & modern
| Affix | Feel · exemplars |
|---|---|
| -ly | SaaS all-rounder (Bitly, Calendly, Grammarly) |
| -r | drop-vowel web-2.0 (Tumblr, Flickr) |
| -y | cute, casual (Etsy) |
### Doer
| Affix | Feel · exemplars |
|---|---|
| -er | actor/agent (Uber, Tinder) |
| -or | mechanical (Vector) |
| -ist | specialist (Stylist) |
### Companion
| Affix | Feel · exemplars |
|---|---|
| -buddy | friendly helper (GasBuddy) |
| -pal | trusted friend (PayPal) |
| -mate | sidekick (Mailmate) |
| -bot | automated agent |
### Tool & hub
| Affix | Feel · exemplars |
|---|---|
| -hub | gathering point (GitHub) |
| -base | foundation/platform (Coinbase, Firebase, Supabase) |
| -box | packaged tool (Dropbox) |
| -kit | toolkit (ConvertKit) |
| -pad | workspace (Launchpad) |
| -space | room to work (Squarespace) |
| -stack | tech stack (Substack) |
| -labs | R&D shop (Bell Labs) |
| -works | workshop (SolidWorks) |
### Vowel endings — playful, globally pronounceable
| Affix | Feel · exemplars |
|---|---|
| -oo | round, cute (Yahoo) |
| -ee | soft (Renee-like) |
| -o | punchy (Venmo) |
| -a | smooth (Tesla, Zara) |
| -ia | name-like (Nvidia, Expedia) |
| -ora | elegant Latin (Pandora) |
| -us | Latin gravitas (Prius) |
| -ex | sharp, techy (FedEx) |
| -ix | techy (Netflix) |
### Stylized & meme
| Affix | Feel · exemplars |
|---|---|
| -zilla | monster-big (Mozilla) |
| -matic | machine-magic (Instamatic) |
| -aroo | bouncy-cute (Kangaroo) |
| -verse | a whole universe (metaverse) |
### Vertical positioning
| Affix | Feel · exemplars |
|---|---|
| -bay | marketplace (eBay) |
| -cast | media/broadcast (Podcast) |
| -app | application (Cash App) |
## Prefix catalog
### Call-to-action
| Affix | Feel · exemplars |
|---|---|
| get- | grab it (GetResponse) |
| go- | momentum (GoDaddy, GoPro) |
| use- | utility (Usebutton) |
| try- | low-commitment invite |
| join- | community invite |
| meet- | introduction (MeetUp-style) |
| hey- | friendly hail (Hey.com) |
### Possessive
| Affix | Feel · exemplars |
|---|---|
| my- | personal (MySpace, MyFitnessPal) |
| the- | definitive (TheVerge) |
### Scale & depth
| Affix | Feel · exemplars |
|---|---|
| deep- | serious tech (DeepMind, DeepSeek) |
| ever- | permanence (Evernote) |
| every- | universality (Everlane-like) |
| super- | boosted (Superhuman) |
| ultra- | extreme |
| up- | rising (Upwork) |
### Newness & openness
| Affix | Feel · exemplars |
|---|---|
| open- | transparent/community (OpenAI, OpenTable) |
| neo- | new wave (Neobank) |
| meta- | beyond (Meta) |
| next- | successor (NextDoor) |
| real- | authentic (RealPage) |
| live- | real-time (LiveChat) |
### Speed & ease
| Affix | Feel · exemplars |
|---|---|
| fast- | velocity (Fastly) |
| quick- | instant (QuickBooks) |
| easy- | frictionless (EasyJet) |
| smart- | intelligent (SmartThings) |
### AI & agents
| Affix | Feel · exemplars |
|---|---|
| ai- | AI-native signal (AI21) |
| chat- | conversational (ChatGPT) |
| agent- | autonomous doer (Agentforce) |
| agentic- | agent-native workflows (agentic AI wave) |
## Rules
- - **Live RDAP only** — never claim availability from cached knowledge or prior turns of this conversation. Domains get registered between checks.
- - **`.com` only** — this skill's contract. If everything is taken, note that other TLDs are out of scope and offer a companion check.
+ - **Live lookups only** — never claim availability from cached knowledge or prior turns of this conversation. Domains get registered between checks.
+ - **Only an explicit negative means available.** RDAP `404`, or WHOIS `DOMAIN NOT FOUND`. Anything else — `429`, `5xx`, a timeout, an empty body — is `UNKNOWN`, which is reported as unknown and never as free.
+ - **Use the bundled script rather than hand-rolled `curl`.** The per-TLD hosts, the `.co` WHOIS special case, and the `.app` retry loop are all easy to get wrong in a way that fails silently toward false-available.
+ - **The escalated TLD set is fixed**: `.com .net .org .ai .io .co .app .cc`. If the user wants a TLD outside it, check it explicitly and say the endpoint was not pre-verified.
- **No payment on the user's behalf.** Prompt them to register; they check out.