domain-check — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited domain-check (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Platform-independent domain checker. Answers the binary question Available / Taken with high confidence (100% when all sources agree) and, for taken domains, returns the most relevant details inline: SSL certificate, server IP, expiration date.
As the very first action — before generating, recommending, suggesting, scoring, or curating ANY domain names — you MUST `Read references/naming_guide.md` in full. Non-skippable. One Read tool call, ~3,300 words.
This rule fires on all of these triggers, not just on suggest:
suggest subcommand invocationsThe guide is the single source of truth. The Python `score_name()` heuristics are a sanity helper, NOT a substitute for the guide. Skipping the guide produces generic voicebotify / cloudhub slop that doesn't match the user's actual project.
Workflow for any naming request:
Read references/naming_guide.md — non-skippable, before any candidate is writtenvoicebot+ify)bulk to check availability — suggest output is only a starting point, never the final listNo dependencies. No venv. No pip/uv/pipx required.
The entire skill runs on the Python ≥ 3.11 standard library (needed for dict | None syntax and asyncio.to_thread). Module imports used by the skill: argparse, asyncio, dataclasses, datetime, hashlib, io, json, os, pathlib, re, secrets, socket, ssl, struct, sys, tempfile, time, typing, urllib. All stdlib.
If you run an exotic Python build without the SSL module, only the ssl subcommand will fail; the rest still works.
All commands are run from this skill's directory (the agent will cd there automatically). Same invocations on Linux, macOS, and Windows:
python3 scripts/domain_check.py check example.com
python3 scripts/domain_check.py bulk example.com example.org example.net
python3 scripts/domain_check.py ssl example.com
python3 scripts/domain_check.py resolve https://example.com/pathOn Windows, use python instead of python3 if needed.
check <domain>Single-domain check, JSON output.
For "Taken" the response contains:
verdict: "Taken", confidence, summaryexpiration_date (ISO date) or expiration_note (e.g. "DENIC confirms the registration but does not expose the expiry date publicly (GDPR).")registrar, nameservers, ip_addressesssl: { issuer, subject, valid_to, days_until_expiry, fingerprint_sha256, ip_address, matches_hostname, ... }evidence: [...] — list of all 5–6 sources with source/strength/reasonFor "Available" a compact response: verdict: "Available", confidence, summary, evidence. No SSL/IP blocks (irrelevant).
For "Reserved" / "Unclear": verdict plus rationale in summary plus evidence for diagnosis.
bulk <d1> <d2> … OR --file <path> OR --stdinUp to 8 domains in parallel. NDJSON output (one line per domain) — pipe-friendly. Alternatives:
--format=json → a single JSON array--format=table → human-readable tablepython3 scripts/domain_check.py bulk --file domains.txt --format=table
echo -e "example.com\nexample.org" | python3 scripts/domain_check.py bulk --stdinssl <hostname> [--port 443]SSL certificate only. Returns issuer, subject, SAN, valid_from/to, days_until_expiry, SHA-256 fingerprint, protocol, cipher, and the effective IP of the TLS connection.
resolve <url-or-host>Extracts the hostname from a URL and resolves IPv4 + IPv6, plus reverse DNS for the first 3 IPs. Accepts https://example.com/path, example.com:443, example.com.
Whether a domain is "Available" or "Taken" depends on which sources are authoritative for the given TLD:
.com, .net, .io, .ai, .app, .pro, .club, …): RDAP is mandatory under ICANN — RDAP no-object = 100% available..de, .eu, .at, .ch, .es, …): the registry typically redacts RDAP/WHOIS entirely. Here an authoritative DNS NS lookup against the registry NS (a.nic.de, x.dns.eu, …) yields a binary answer: NS records = registered, NXDOMAIN = available.whois.iana.org and cached persistently. If the response contains only disclaimers (no domain/registrar fields), the domain is treated heuristically as available.münchen.de): automatically converted to Punycode (xn--mnchen-3ya.de).expiration_date is null and expiration_note explains why. This is correct behaviour, not a bug.scripts/
├── domain_check.py # CLI entry point, argparse subcommands
└── _lib/ # importable Python package
├── tld_classifier.py # TLD → GTLD_FULL / CCTLD_DSGVO / CCTLD_OPEN / UNKNOWN
├── rdap.py # RDAP client with IANA bootstrap cache (24h)
├── whois_client.py # WHOIS socket + 30+ TLD patterns + IANA discovery + heuristic fallback
├── auth_dns.py # native UDP DNS resolver (RFC 1035) for TLD registry NS
├── presence.py # DNS A/AAAA, HTTP/HTTPS, TLS cert with CN/SAN match
├── verdict.py # decision tree: Available/Taken with confidence
└── orchestrator.py # async fan-out + user-friendly final reportOther skills can import the library modules directly:
from _lib.orchestrator import check_domain
report = await check_domain("example.com")The skill also helps you come up with good names, not just check existing ones.
Read `references/naming_guide.md` — a practical guide covering:
suggest <seed> --use-case <type>Generate scored domain candidates from a seed keyword. Patterns: Greek/Latin roots, Hybrid Neoclassic, Suffix-Stack, Compound, Mutation, Action-Verb-Compound. Each candidate gets a 0.0–1.0 score from the heuristics in _lib/naming.py (length, syllables, phonetics, plosive starts, alliteration, trademark/typo-squat checks). Use cases: tech_startup, ai_tool, dach_service, indie_saas, creative, developer, ecommerce_de, consumer_app, open_source, agency_dach.
python3 scripts/domain_check.py suggest graph --use-case ai_tool --count 20
python3 scripts/domain_check.py suggest cloud --use-case indie_saas --check --check-top 5The --check flag runs availability checks on the top candidates so you only see names that are actually buyable.
score <name>Score a single bare name (no TLD) and see the heuristic breakdown — useful when you already have an idea and want a sanity check.
python3 scripts/domain_check.py score lumenforgeThe scorer is a sanity helper, not the truth — strong real brands like zoom, slack, stripe all live below 0.8 because the heuristics penalise short or low-vowel names. Use the score to spot obvious red flags (hyphens, digits, hard clusters), not as a gatekeeper.
references/naming_guide.md — what makes a great domain name (the creative side)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.