{
  "markdown": "# domain-check\n\n> Cross-platform, dependency-free domain availability checker — runs as a plugin in **Claude Code**, an extension in **Gemini CLI**, and a skill in **Codex CLI** / **OpenCode**, or as a plain Python CLI.\n\n[![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)\n[![Agent Skills Standard](https://img.shields.io/badge/Agent_Skills-open_standard-7c3aed.svg)](https://agentskills.io)\n[![Stdlib only](https://img.shields.io/badge/dependencies-zero-green.svg)](#requirements)\n[![Cross platform](https://img.shields.io/badge/platform-Linux_·_macOS_·_Windows-lightgrey.svg)](#platform-support)\n[![License: MIT](https://img.shields.io/badge/license-MIT-yellow.svg)](LICENSE)\n\nAsk your coding agent **\"is `example.com` free?\"** and get an evidence-backed answer with the registrar, expiration date, server IPs, and full SSL certificate inline — for any TLD on the planet, including GDPR-redacted ccTLDs like `.de`, `.eu`, `.at`, `.ch`, `.es`.\n\n### Single check — full evidence inline\n\n![Single domain check showing verdict, registrar, expiry, nameservers, IPs and full SSL certificate](images/Domain_Check.png)\n\n### Bulk check — three TLDs, three evidence paths\n\n![Bulk check across .com Available, .de Taken without expiry (GDPR-redacted), and .com Taken with full registrar and expiry](images/Bulk_Check.png)\n\n> The `.de` row legitimately has no expiry — DENIC redacts that field under GDPR. The skill says so explicitly instead of guessing.\n\n---\n\n## Why this skill exists\n\nMost domain-checker tools fail in one of three ways:\n\n- They hit a single source and return false negatives when it's wrong.\n- They require API keys and paid plans.\n- They silently return *\"unknown\"* for half of all ccTLDs because GDPR redacts the registry response.\n\nThis skill solves all three:\n\n- **Five-source consensus.** RDAP, WHOIS, authoritative DNS NS lookup, A/AAAA + HTTP reachability, TLS certificate. The verdict only reaches 100% confidence when sources agree.\n- **TLD-aware decision tree.** For `.de` the only reliable signal is an authoritative NS query against `a.nic.de`. For `.com` an RDAP no-object response is definitive. The skill picks the right strategy per TLD.\n- **Zero dependencies, zero config.** Pure Python ≥ 3.11 standard library. No `pip install`, no venv, no API tokens, no rate-limited free tier.\n- **Bulk + parallel.** 30 domains in ~10–15 seconds via `asyncio`.\n- **Built for AI agents.** The `SKILL.md` tells the agent *when* to invoke it (trigger phrases in EN + DE) and how to read the JSON output.\n\n## Features\n\n- Binary verdict — `Available` / `Taken` / `Reserved` / `Unclear` with a 0.0–1.0 confidence score\n- Five concurrent sources, ~2–4 s per single check\n- Expiration dates for both domain registration and SSL certificate, surfaced inline whenever the registry exposes them (GDPR ccTLDs legitimately redact this — the skill says so explicitly instead of guessing)\n- 30+ TLD-specific WHOIS patterns plus IANA-bootstrap fallback for any unknown TLD\n- GDPR-aware: authoritative registry NS lookups for `.de`, `.eu`, `.at`, `.ch`, `.es`, `.li`, …\n- Inline SSL inspection: issuer, subject, SAN, validity, fingerprint, hostname match\n- IP resolution: IPv4, IPv6, reverse DNS for any URL or hostname\n- Bulk mode with 8-way concurrency and NDJSON / JSON / human table output\n- Naming co-pilot — generates and scores brandable domain candidates and bulk-checks the top N for actual availability\n- Cross-platform: same commands on Linux, macOS, Windows\n- Implements the [Agent Skills open standard](https://agentskills.io)\n\n## Install\n\nThis repo ships as both a **Claude Code plugin** and a **Gemini CLI extension**, with a manifest for each. The skill itself lives in `skills/domain-check/`.\n\n### Claude Code\n\nOnce the plugin is listed in the official marketplace, install with:\n\n```\n/plugin install domain-check\n```\n\nUntil then (or for any custom install), add this repo as a marketplace and install from there:\n\n```\n/plugin marketplace add PleasePrompto/domain-check-skill\n/plugin install domain-check@domain-check-skill\n```\n\n### Gemini CLI\n\n```bash\ngemini extensions install https://github.com/PleasePrompto/domain-check-skill\n```\n\nThe repo is tagged with the `gemini-cli-extension` topic, so it appears in the Gemini Extensions Gallery automatically after Google's daily crawl.\n\n### Codex CLI / OpenCode (manual)\n\nCodex doesn't have an official skill marketplace yet. Clone the repo and copy just the skill folder into your agent's skills directory:\n\n```bash\ngit clone https://github.com/PleasePrompto/domain-check-skill.git /tmp/dc\ncp -r /tmp/dc/skills/domain-check ~/.agents/skills/domain-check     # Codex CLI\ncp -r /tmp/dc/skills/domain-check ~/.config/opencode/skills/        # OpenCode\nrm -rf /tmp/dc\n```\n\n### Project-local (any agent)\n\nTo pin the skill to a single repository so the whole team gets it:\n\n```bash\ngit submodule add https://github.com/PleasePrompto/domain-check-skill.git .claude/plugins/domain-check\n```\n\n## Usage\n\nOnce installed, just talk to your agent. Triggers it recognises (English + German):\n\n- *\"is X.com free?\"* / *\"ist X.de frei?\"*\n- *\"check this domain\"* / *\"domain prüfen\"*\n- *\"bulk domain check for these names\"*\n- *\"SSL cert of X\"* / *\"what IP does X resolve to?\"*\n- *\"suggest names for an AI phone-bot startup\"*\n\nOr run the script directly from the skill directory:\n\n```bash\ncd skills/domain-check\npython3 scripts/domain_check.py check example.com\npython3 scripts/domain_check.py bulk example.com example.org example.net\npython3 scripts/domain_check.py ssl example.com\npython3 scripts/domain_check.py resolve https://example.com/path\npython3 scripts/domain_check.py suggest graph --use-case ai_tool --count 20 --check\n```\n\n### Subcommands\n\n| Command | Purpose |\n|---|---|\n| `check <domain>` | Single-domain check, JSON output with full evidence |\n| `bulk <d1> <d2> …` | Up to 8 in parallel; supports `--file`, `--stdin`, `--format=ndjson\\|json\\|table` |\n| `ssl <hostname> [--port 443]` | TLS-only inspection: issuer, SAN, validity, fingerprint, effective IP |\n| `resolve <url\\|host>` | Hostname → IPv4 + IPv6 + reverse DNS for the first 3 IPs |\n| `suggest <seed> --use-case <type>` | Generate scored, buyable domain candidates |\n| `score <name>` | Heuristic score breakdown for a single bare name |\n\nRun any command with `--help` for full flags.\n\n## How it works\n\nEvery `check` fans out asynchronously to five sources at once:\n\n```\n                                 ┌──────────────────┐\n                                 │   tld_classifier │\n                                 │  GTLD / GDPR /   │\n                                 │   OPEN / UNKNOWN │\n                                 └────────┬─────────┘\n                                          │\n       ┌──────────────────┬───────────────┼──────────────────┬──────────────────┐\n       ▼                  ▼               ▼                  ▼                  ▼\n  ┌─────────┐       ┌───────────┐   ┌──────────┐      ┌──────────┐       ┌──────────┐\n  │  RDAP   │       │   WHOIS   │   │  AuthDNS │      │ DNS A/   │       │   TLS    │\n  │ (ICANN) │       │ (port 43) │   │   (NS)   │      │   AAAA   │       │  Cert    │\n  └────┬────┘       └─────┬─────┘   └────┬─────┘      └────┬─────┘       └────┬─────┘\n       │                  │              │                 │                  │\n       └──────────────────┴──────────────┴─────────────────┴──────────────────┘\n                                          ▼\n                                 ┌──────────────────┐\n                                 │      verdict     │\n                                 │  Available /     │\n                                 │  Taken / …       │\n                                 │  + confidence    │\n                                 └──────────────────┘\n```\n\nWhether a domain is free or taken depends on **which** sources are authoritative for that TLD:\n\n- **gTLDs** (`.com`, `.net`, `.io`, `.ai`, `.app`, `.pro`, `.club`, …) — RDAP is mandatory under ICANN. RDAP `no-object` = 100% available.\n- **GDPR ccTLDs** (`.de`, `.eu`, `.at`, `.ch`, `.es`, `.li`, …) — registry redacts RDAP/WHOIS. An authoritative NS lookup against `a.nic.de` / `x.dns.eu` / etc. yields a binary answer: NS records = registered, NXDOMAIN = available.\n- **Unknown / reseller TLDs** — WHOIS server is discovered live via `whois.iana.org` and cached. If only disclaimers come back (no domain or registrar fields), the domain is treated heuristically as available.\n\n### Edge cases handled\n\n- **IDN domains** (`münchen.de`) — auto-converted to Punycode (`xn--mnchen-3ya.de`)\n- **GDPR TLDs without expiry** — `expiration_date: null` plus an `expiration_note` explaining why (correct behaviour, not a bug)\n- **`.ch` / `.li` / `.es`** — registry WHOIS port 43 blocks anonymous IPs; the authoritative DNS NS lookup is the primary source\n- **Rate limiting** (DENIC, AFNIC, SIDN) — bulk concurrency capped at 8; HTTP 429 triggers a single backoff retry\n- **IDNA failures** — invalid IDN inputs fall back to lowercase ASCII (no crash)\n\n## Naming co-pilot\n\nThe skill doubles as a naming assistant. Ask *\"suggest names for an AI phone-bot startup\"* and it:\n\n1. Reads [`skills/domain-check/references/naming_guide.md`](skills/domain-check/references/naming_guide.md) — a guide covering length sweet spots, phonetics, naming patterns, TLD strategy, LLM-citability, and a hard don't list.\n2. Generates scored candidates via `_lib/naming.py` (length, syllables, plosive starts, alliteration, trademark / typo-squat checks).\n3. Optionally bulk-checks the top N for real-world availability — so you only see names you can actually buy.\n\n```bash\npython3 scripts/domain_check.py suggest cloud --use-case indie_saas --check --check-top 5\n```\n\nSupported use cases: `tech_startup`, `ai_tool`, `dach_service`, `indie_saas`, `creative`, `developer`, `ecommerce_de`, `consumer_app`, `open_source`, `agency_dach`.\n\n## Repository layout\n\n```\ndomain-check-skill/\n├── README.md                          # You are here\n├── LICENSE\n├── images/                            # Screenshots used in this README\n├── .claude-plugin/plugin.json         # Claude Code plugin manifest\n├── gemini-extension.json              # Gemini CLI extension manifest\n└── skills/\n    └── domain-check/                  # The actual skill\n        ├── SKILL.md                   # Agent entry point (frontmatter + instructions)\n        ├── references/\n        │   └── naming_guide.md        # How to invent a great name\n        └── scripts/\n            ├── domain_check.py        # CLI entry, argparse subcommands\n            └── _lib/                  # Importable Python package\n                ├── tld_classifier.py  # TLD → GTLD_FULL / CCTLD_DSGVO / CCTLD_OPEN / UNKNOWN\n                ├── rdap.py            # RDAP client + IANA bootstrap cache (24 h)\n                ├── whois_client.py    # WHOIS socket + 30+ TLD patterns + IANA fallback\n                ├── auth_dns.py        # Native UDP DNS resolver (RFC 1035)\n                ├── presence.py        # DNS A/AAAA, HTTP/HTTPS, TLS cert with CN/SAN match\n                ├── verdict.py         # Decision tree → Available/Taken + confidence\n                ├── orchestrator.py    # async fan-out + final report assembly\n                └── naming.py          # Heuristic candidate scorer + generator patterns\n```\n\nOther skills can import the library directly:\n\n```python\nfrom _lib.orchestrator import check_domain\nreport = await check_domain(\"example.com\")\n```\n\n## Requirements\n\nZero install, zero dependencies, zero config. The entire skill runs on the **Python ≥ 3.11 standard library** — `asyncio`, `socket`, `ssl`, `urllib`, `argparse`, etc. The minimum version is required for `dict | None` syntax and `asyncio.to_thread`.\n\nIf you run an exotic Python build without the SSL module, only the `ssl` subcommand fails — everything else still works.\n\n## Platform support\n\n| Platform | Status | Notes |\n|---|---|---|\n| Linux | Tested | Primary dev platform |\n| macOS | Tested | Same commands |\n| Windows | Tested | Use `python` instead of `python3` if needed |\n| WSL2 | Tested | Treat as Linux |\n| Docker | Works | `python:3.11-slim` is enough |\n\n## Performance\n\n- Single check: typically 2–4 s (all five sources run concurrently)\n- Bulk: 30 domains in ~10–15 s (concurrency 8, each domain again fans out per source)\n- Cache hits: IANA RDAP bootstrap cached 24 h; WHOIS-server discovery cached persistently in temp dir\n\n## Agent Skills standard compliance\n\nThis skill follows the [Agent Skills open standard](https://agentskills.io). The same `SKILL.md` works in any compliant tool:\n\n- [Claude Code](https://code.claude.com/docs/en/skills) (Anthropic) — first-class\n- [Codex CLI](https://developers.openai.com/codex/skills) (OpenAI) — first-class\n- [Gemini CLI](https://geminicli.com/docs/cli/skills/) (Google) — first-class\n- [OpenCode](https://opencode.ai/docs/skills/) — first-class\n- Cursor, Cline, Windsurf, GitHub Copilot (via VS Code) — community / partial\n\nThe skill is intentionally written to the lowest common denominator of the standard — only `name` and `description` in the frontmatter, all logic in plain Markdown plus Python scripts.\n\n## Development\n\n```bash\ngit clone https://github.com/PleasePrompto/domain-check-skill.git\ncd domain-check-skill/skills/domain-check\n\npython3 scripts/domain_check.py check example.com\npython3 scripts/domain_check.py suggest lumen --use-case ai_tool --check --check-top 10\n```\n\nThere's no test suite yet — contributions welcome.\n\n### Adding a new TLD\n\n1. Add the TLD to `_lib/tld_classifier.py` in the right bucket (`GTLD_FULL`, `CCTLD_DSGVO`, `CCTLD_OPEN`).\n2. If it has a quirky WHOIS format, add a parser pattern in `_lib/whois_client.py`.\n3. If it's a GDPR ccTLD, the `auth_dns.py` resolver should already handle it — just verify the registry NS list.\n\n### Adding a naming pattern\n\nEdit `_lib/naming.py` — patterns are simple Python functions returning candidate strings. The scoring heuristics live in the same file.\n\n## Contributing\n\nPRs welcome. Please:\n\n1. Open an issue first for non-trivial changes.\n2. Keep the **zero-dependency** rule — no `pip install` ever.\n3. Keep the cross-platform rule — no shell-outs to `whois` / `dig` / `host` (those aren't on Windows).\n4. Run `python3 scripts/domain_check.py check <a-bunch-of-tlds>` from `skills/domain-check/` before submitting.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n\n## Acknowledgements\n\n- Anthropic for the [Agent Skills open standard](https://agentskills.io)\n- IANA for the public RDAP bootstrap registry\n- DENIC, EURid, SWITCH, AFNIC, SIDN — and every ccTLD registry that still answers authoritative NS queries truthfully when GDPR forces them to redact everything else\n",
  "bytes": 14699,
  "sha": "b90d1c3de956f8ea4ee435dcbc3fb8cb1c5da3c8adb68487c81b7c60e3f2e672",
  "repo_slug": "pleaseprompto/domain-check-skill",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_pleaseprompto_domain_check_skill_c74b9383/readme"
}