---
name: pp-oneword-domains
description: "Check a word across every TLD with registrar prices, watch the aftermarket, and generate names with DomainsGPT, all from the terminal with a local store the site itself does not offer. Trigger phrases: `is smart.com available`, `cheapest TLD for a word`, `compare .ai vs .io prices`, `cheapest one-word domain auctions`, `brainstorm domain names with DomainsGPT`, `use oneword-domains`, `run oneword-domains`."
author: "Victor Wibisono"
license: "Apache-2.0"
argument-hint: "<command> [args] | install cli|mcp"
allowed-tools: "Read Bash"
metadata:
  openclaw:
    requires:
      bins:
        - oneword-domains-pp-cli
    install:
      - kind: go
        bins: [oneword-domains-pp-cli]
        module: github.com/mvanhorn/printing-press-library/library/developer-tools/oneword-domains/cmd/oneword-domains-pp-cli
---

# One Word Domains — Printing Press CLI

## Prerequisites: Install the CLI

This skill drives the `oneword-domains-pp-cli` binary. **You must verify the CLI is installed before invoking any command from this skill.** If it is missing, install it first:

1. Install via the Printing Press installer. It defaults binaries to `$HOME/.local/bin` on macOS/Linux and `%LOCALAPPDATA%\Programs\PrintingPress\bin` on Windows:
   ```bash
   npx -y @mvanhorn/printing-press-library install oneword-domains --cli-only
   ```
2. Verify: `oneword-domains-pp-cli --version`
3. Ensure the reported install directory is on `$PATH` for the agent/runtime that will invoke this skill.

If the `npx` install fails (no Node, offline, etc.), fall back to a direct Go install (requires Go 1.26.6 or newer). This installs into `$GOPATH/bin` (default `$HOME/go/bin`), so add that directory to `$PATH` instead:

```bash
go install github.com/mvanhorn/printing-press-library/library/developer-tools/oneword-domains/cmd/oneword-domains-pp-cli@latest
```

If `--version` reports "command not found" after install, the runtime cannot see the binary directory on `$PATH`. Do not proceed with skill commands until verification succeeds.

One Word Domains tracks 27,627 dictionary words across 93 TLDs with prices from six registrars, an aftermarket feed, and the DomainsGPT name generator, but publishes no API. This CLI replays its JSON routes so agents and scripts can compare TLDs, check availability, mine the dictionary, browse auctions, and run DomainsGPT, then keeps everything in SQLite for price drift, auction watches, and offline search. No other tool targeted oneword.domains as of the September 2026 ecosystem search.

## When to Use This CLI

Reach for this CLI when a task is about naming something and buying the domain: comparing TLDs by price and popularity, checking whether a dictionary word is free on a given extension, brainstorming brandable names with live availability, or scanning one-word aftermarket auctions. It is the only programmatic access to One Word Domains data, and its local store answers questions the site cannot, like price drift over time and which auctions appeared since yesterday.

## Anti-triggers

Do not use this CLI for:
- Do not use it to register or buy a domain; it links to registrars but never checks out
- Do not use it for WHOIS, RDAP, DNS, or certificate lookups on arbitrary domains; use domain-goat or whois for that
- Do not use it to check availability of invented, non-dictionary names except through gpt generate; the check route only knows the 27,627 indexed words
- Do not use it to manage DNS or hosting for domains you already own

## Unique Capabilities

These capabilities aren't available in any other tool for this API.

### Naming pipeline
- **`brainstorm`** — Generate DomainsGPT names, keep only the available ones with price, cheapest registrar, and a dictionary flag, and save the batch locally; one call per TLD, quota 10 anonymous.

  _Pick this when an agent needs priced, available, deduplicated name candidates in one call instead of generate-then-check loops._

  ```bash
  oneword-domains-pp-cli brainstorm --type brandable --context "a terminal tool for domain search" --tld ai,com --json
  ```
- **`recheck`** — Re-check every word and TLD you looked up before and report what changed: taken, freed, premium, price, or popularity.

  _Use it to refresh a shortlist before buying instead of re-running every lookup by hand._

  ```bash
  oneword-domains-pp-cli recheck --since 7d --json
  ```
- **`check`** — Check one word, or a file of words, across the most-viewed TLDs or all 93, with availability, premium flag, popularity, and the cheapest registrar price per TLD.

  _Use it whenever an agent needs is-it-free-and-what-does-it-cost for a dictionary word._

  ```bash
  oneword-domains-pp-cli check smart --tld com,io,ai --json
  ```
- **`compare`** — Compare several full domains in one table: available, premium, price, popularity, and cheapest registrar, with the cheapest available one called out.

  _Pick it to decide between a few candidate domains in a single call._

  ```bash
  oneword-domains-pp-cli compare smart.com smart.io oasis.ai --json
  ```

### Aftermarket intelligence
- **`listings rank`** — Rank aftermarket auctions by how contested the word is across TLDs, price relative to fresh registration, and bid pace.

  _Reach for it when scanning auctions for underpriced words instead of reading through 455 listings by hand._

  ```bash
  oneword-domains-pp-cli listings rank --tld co --sort popularity --max-checks 25 --agent --select rows.domain,rows.price,rows.price_x,rows.taken_of_93,rows.end_date
  ```
- **`listings watch`** — Diff the aftermarket feed against the last run: new listings, price or bid changes, listings that disappeared, and auctions ending within a window.

  _Run it daily to learn what changed on the aftermarket without re-reading every listing._

  ```bash
  oneword-domains-pp-cli listings watch --tld co --json
  ```

### Lifetime-pass database
- **`domains intersect`** — Find dictionary words that are free on every TLD you list, or free on one and taken on another; needs the lifetime-pass session from auth login --chrome or auth login --cookies-file.

  _Use it when a brand needs the same word on several extensions and the user has a lifetime pass._

  ```bash
  oneword-domains-pp-cli domains intersect --tld com,ai --category positive --min-length 4 --max-length 6 --csv
  ```

### Local dictionary
- **`words mine`** — Filter the 27,627-word dictionary by several categories at once, length, prefix, or glob, offline after a one-time words mine --refresh.

  _Pick it to build a candidate pool before checking availability, without burning API calls._

  ```bash
  oneword-domains-pp-cli words mine --category adjectives,positive --min-len 4 --max-len 6 --json
  ```
- **`hacks`** — Find domain hacks: split a word so its ending is one of the 93 TLDs (sm.art), or list dictionary words ending in a TLD.

  _Use it for brandable hacks like he.art or ch.art that no availability search surfaces._

  ```bash
  oneword-domains-pp-cli hacks --tld art --limit 20 --json
  ```

### TLD intelligence
- **`tlds inventory`** — Compare how many available one-word domains each TLD still has for a category and length filter, next to its cheapest registration price (public route).

  _Use it to choose an extension by remaining supply and cost before mining words._

  ```bash
  oneword-domains-pp-cli tlds inventory --category positive --min-len 4 --max-len 6 --sort count --json
  ```
- **`tlds drift`** — Record registrar price snapshots for every TLD and report which prices moved since an earlier snapshot.

  _Use it to see whether a TLD got cheaper or dearer before buying._

  ```bash
  oneword-domains-pp-cli tlds drift --since 30d --registrars
  ```

### DomainsGPT
- **`gpt generate`** — Run DomainsGPT and get the streamed names back as real JSON, optionally only the available ones.

  _Use it for raw name generation; use brainstorm when you also want prices and dictionary flags._

  ```bash
  oneword-domains-pp-cli gpt generate --type portmanteau --word open --position prefix --tld com --available-only --json
  ```

## Discovery Signals

This CLI was generated with browser-observed traffic context.
- Capture coverage: 55 API entries from 56 total network entries
- Protocols: rest_json (75% confidence), browser_rendered (70% confidence), html_scrape (55% confidence)
- Auth signals: chrome_mcp_session
- Generation hints: requires_js_rendering
- Candidate command ideas: create_generate — Derived from observed POST /gpt/generate traffic.; create_view — Derived from observed POST /api/tlds/ai/view traffic.; list_ai — Derived from observed GET /api/tlds/ai traffic.; list_ai.json — Derived from observed GET /_next/data/qzfSin9peIEieIakzu-ki/tlds/ai.json traffic.; list_api_key — Derived from observed GET /api/auth/api-key traffic.; list_com — Derived from observed GET /api/tlds/com traffic.; list_count — Derived from observed GET /api/domains/count traffic.; list_domains — Derived from observed GET /api/domains traffic.
- Caveats: error_status_cluster: Endpoint cluster only observed error HTTP statuses.

## Command Reference

**domains** — Availability checks for word plus TLD and the lifetime-pass domain database; search needs auth login --chrome

- `oneword-domains-pp-cli domains check` — Check availability, premium flag, price, aftermarket status, and popularity (tldCount) for a dictionary word on one TLD
- `oneword-domains-pp-cli domains count` — Count available one-word domains for a TLD with the same filters as search; returns a bare integer; normally public
- `oneword-domains-pp-cli domains saves` — List the domains saved to your One Word Domains account; requires auth login --chrome
- `oneword-domains-pp-cli domains search` — Search the 1,380,000-plus available one-word domain database for a TLD with text, category, price, length, sort

**gpt** — DomainsGPT: AI-generated brandable names with live availability

- `oneword-domains-pp-cli gpt saves` — List DomainsGPT names saved to your account; requires auth login --chrome
- `oneword-domains-pp-cli gpt usage` — Show DomainsGPT usage and quota for the current identity; anonymous callers get 10, signed-in accounts more

**listings** — Aftermarket domain auctions and buy-now listings with price, bids, and end date

- `oneword-domains-pp-cli listings count` — Count aftermarket listings matching the filters; returns a bare integer
- `oneword-domains-pp-cli listings filters` — List the TLDs that currently have aftermarket listings, with counts
- `oneword-domains-pp-cli listings list` — List aftermarket listings, 100 per page, filtered by TLD, registrar, and word length, sorted by domain, price, bids

**tlds** — Top-level domains: registrations, top-10M presence, views, per-registrar prices, and the cheapest registrar

- `oneword-domains-pp-cli tlds get` — Get one TLD with its description, registrar price list, cheapest registrar, and example sites
- `oneword-domains-pp-cli tlds list` — List all 93 TLDs with registration counts, top-10M site counts, page views, and minimum registration price

**words** — The dictionary behind One Word Domains, 27,627 words tagged with categories

- `oneword-domains-pp-cli words count` — Count dictionary words matching the directory filters; returns a bare integer
- `oneword-domains-pp-cli words get` — Get one dictionary word with its category tags
- `oneword-domains-pp-cli words list` — List dictionary words; with --prefix up to 10 autocomplete matches


## Freshness Contract

This printed CLI owns bounded freshness only for registered store-backed read command paths. In `--data-source auto` mode, those paths check `sync_state` and may run a bounded refresh before reading local data. `--data-source local` never refreshes. `--data-source live` reads the API and does not mutate the local store. Set `ONEWORD_DOMAINS_NO_AUTO_REFRESH=1` to skip the freshness hook without changing source selection.

Covered paths:

- `oneword-domains-pp-cli domains`
- `oneword-domains-pp-cli domains search`
- `oneword-domains-pp-cli gpt`
- `oneword-domains-pp-cli listings`
- `oneword-domains-pp-cli listings list`
- `oneword-domains-pp-cli tlds`
- `oneword-domains-pp-cli tlds get`
- `oneword-domains-pp-cli tlds list`
- `oneword-domains-pp-cli words`
- `oneword-domains-pp-cli words get`
- `oneword-domains-pp-cli words list`

When JSON output uses the generated provenance envelope, freshness metadata appears at `meta.freshness`. Treat it as current-cache freshness for the covered command path, not a guarantee of complete historical backfill or API-specific enrichment.

### Finding the right command

When you know what you want to do but not which command does it, ask the CLI directly:

```bash
oneword-domains-pp-cli which "<capability in your own words>"
```

`which` resolves a natural-language capability query to the best matching command from this CLI's curated feature index. Exit code `0` means at least one match; exit code `2` means no confident match — fall back to `--help` or use a narrower query. `--json` (and other machine formats) keep that exit-2 contract and write `{"matches":[]}` on stdout so agents can inspect the envelope without treating a miss as success.

## Recipes

### Cheapest way to buy a word

```bash
oneword-domains-pp-cli check smart --tld com,io,ai,co,app --available-only --json --select domain,available,cheapest_registrar.name,cheapest_registrar.price
```

Fans the word across the listed TLDs, keeps only free ones, and narrows the JSON to the price you would pay.

### Underpriced short .co auctions ending soon

```bash
oneword-domains-pp-cli listings rank --tld co --sort popularity --max-checks 25 --agent --select rows.domain,rows.price,rows.price_x,rows.taken_of_93,rows.hours_left
```

Compact agent envelope ranking .co auctions by how many of the 93 TLDs already took the word, with price relative to fresh registration; add --ending 48h once the site's feed carries live end dates again.

### Brainstorm with DomainsGPT and keep only free names

```bash
oneword-domains-pp-cli brainstorm --type brandable --context "a terminal tool for domain search" --tld ai --json
```

Streams about 20 names, keeps the available ones, prices them, flags dictionary words, and saves the batch locally.

### Which TLD got cheaper this month

```bash
oneword-domains-pp-cli tlds drift --since 30d --registrars
```

Records a per-registrar price snapshot and diffs it against the snapshot from 30 days earlier; the first run only records, so movers appear once two dated snapshots exist.

### Mine positive tech words that are free on .ai and .com

```bash
oneword-domains-pp-cli domains intersect --tld com,ai --category positive --min-length 4 --max-length 6 --csv
```

Lifetime-pass database query across two TLDs at once, exported as CSV for a spreadsheet.

## Auth Setup

Every headline command works without an account. The lifetime-pass database (domains search, domains intersect), saved domains, and saved DomainsGPT names use your browser session: sign in to oneword.domains in Chrome (email magic link), then run oneword-domains-pp-cli auth login --chrome, which needs one cookie extractor installed (pycookiecheat, cookies, or cookie-scoop-cli) and reads Google Chrome profiles. If you signed in from Brave or another Chromium browser, export the cookies to a file and run oneword-domains-pp-cli auth login --cookies-file <path> instead. There is no API key for the site; DomainsGPT partner tokens, when you have one, go in ONEWORD_DOMAINS_GPT_TOKEN.

Run `oneword-domains-pp-cli doctor` to verify setup.

## Agent Mode

Add `--agent` to any command. Expands to: `--json --compact --no-input --no-color`.

Global format flags share one contract on promoted, novel, sync, and `--deliver` paths:

- `--json` — one JSON document on stdout (sync progress events go to stderr)
- `--compact` — keep identity/status/timestamp fields; does not change the document vs stream shape
- `--csv` / `--plain` — tabular rows (collection envelopes unwrap to the row array)
- `--quiet` — one identity value per row, no envelope

- **Pipeable** — JSON on stdout, errors on stderr
- **Filterable** — `--select` keeps a subset of fields. Dotted paths descend into nested structures; arrays traverse element-wise. Critical for keeping context small on verbose APIs:

  ```bash
  oneword-domains-pp-cli domains search --tld ai --agent --select slug,tldCount,premium
  ```
- **Previewable** — `--dry-run` shows the request without sending
- **Offline-friendly** — sync/search commands can use the local SQLite store when available
- **Non-interactive** — never prompts, every input is a flag
- **Read-only** — do not use this CLI for create, update, delete, publish, comment, upvote, invite, order, send, or other mutating requests

### Response envelope

Commands that read from the local store or the API wrap output in a provenance envelope:

```json
{
  "meta": {"source": "live" | "local", "synced_at": "...", "reason": "..."},
  "results": <data>
}
```

Parse `.results` for data and `.meta.source` to know whether it's live or local. A human-readable `N results (live)` summary is printed to stderr only when stdout is a terminal AND no machine-format flag (`--json`, `--csv`, `--compact`, `--quiet`, `--plain`, `--select`) is set — piped/agent consumers and explicit-format runs get pure JSON on stdout.

## Paths and state

Agents should treat the CLI's path resolver as part of the runtime contract:

- Use `--home <dir>` for one invocation, or set `ONEWORD_DOMAINS_HOME=<dir>` to relocate all four path kinds under one root.
- Use per-kind env vars only when a specific kind must diverge: `ONEWORD_DOMAINS_CONFIG_DIR`, `ONEWORD_DOMAINS_DATA_DIR`, `ONEWORD_DOMAINS_STATE_DIR`, `ONEWORD_DOMAINS_CACHE_DIR`.
- Resolution order is per-kind env var, `--home`, `ONEWORD_DOMAINS_HOME`, XDG (`XDG_CONFIG_HOME`, `XDG_DATA_HOME`, `XDG_STATE_HOME`, `XDG_CACHE_HOME`), then platform defaults.
- `config` contains settings like `config.toml` and profiles. `data` contains `credentials.toml`, `data.db`, cookies, and auth sidecars. `state` contains persisted queries, jobs, and `teach.log`. `cache` contains regenerable HTTP/cache files.
- Stored secrets live in `credentials.toml` under the data dir. Existing legacy `config.toml` secrets are read for compatibility and leave `config.toml` on the first auth write.
- Run `oneword-domains-pp-cli doctor --fail-on warn` to surface path and credential-location warnings. `agent-context` exposes a schema v4 `paths` block for agents that need the resolved dirs.
- For MCP, pass relocation through the MCP host config. The MCP binary does not inherit CLI flags:

  ```json
  {
    "mcpServers": {
      "oneword-domains": {
        "command": "oneword-domains-pp-mcp",
        "env": {
          "ONEWORD_DOMAINS_HOME": "/srv/oneword-domains"
        }
      }
    }
  }
  ```

Fleet precedence: an inherited per-kind env var overrides an explicit `--home` for that kind. Use `ONEWORD_DOMAINS_HOME` or per-kind vars as durable fleet levers, and use `--home` only for a single invocation. Relocation is not reversible by unsetting env vars; move files manually before clearing `ONEWORD_DOMAINS_HOME`, or `doctor` will not find credentials left under the former root.

## Automatic learning

This CLI ships a self-capturing learning loop. The CLI does its own bookkeeping: every invocation is journaled locally, a failed flag followed by a corrected retry auto-derives a `flag_alias` candidate, and a `teach` on a query family without a playbook auto-synthesizes a `playbook_candidate` from the session's journal. Your job is judgment only: `recall` first, act on surfaced candidates, `teach` the final answer, `playbook amend` when you observe a correction. You never record failures by hand.

### Step 1: `recall` before any discovery

Before list/search/drill commands on a new user question, pass the question as an argv or MCP tool argument to `recall --agent`. Do not interpolate user-controlled text in