---
name: affix-domains
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 candidate live against the authoritative registry, and prompt the user to register the free ones.

## Steps

1. **Gate on the bare seed's `.com`.** Before generating anything, check `<seed>.com` alone. It decides the scope of everything below:

   - **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
   ~/.claude/skills/affix-domains/scripts/check_domains.sh \
     --tlds com,net,org,ai,io,co,app,cc  cand1 cand2 cand3 ...
   ```

   With many candidates, pass them on stdin instead: `printf '%s\n' "${cands[@]}" | … --stdin`.

   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 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.
