namer

Original🇺🇸 English
Translated
12 scripts

Name anything: projects, products, companies, packages. Generates creative names across linguistic archetypes, checks handle/username availability across platforms, checks domain availability with pricing, and ranks options with scored rationales. Use when naming projects, products, startups, packages, or brands. NOT for domain management (infrastructure-coder) or branding strategy beyond naming (host-panel).

6installs
Added on

NPX Install

npx skill4agent add wyattowalsh/agents namer

Namer

Generate, evaluate, and validate names across linguistic, technical, and platform dimensions. Produces ranked options with availability matrices and actionable next steps.
Not for domain registration, branding strategy, or logo design. Not for reviewing naming conventions in existing code.

Dispatch

$ARGUMENTSAction
<thing to name>
(with optional flags)
Name — full pipeline: brief → generate → filter → check → score → rank
check <name> [name2...]
Check — availability audit only (skip generation)
expand <name>
Expand — generate variations/modifications of an existing name
compare <name1> vs <name2> [vs...]
Compare — side-by-side scoring of specific names
resume [# or keyword]
Resume — load prior naming session
list
List — show saved naming sessions
preferences
Preferences — show accumulated naming profile and memory stats
EmptyGallery — show examples + "what are you naming?" prompt

Gallery (Empty Arguments)

#ContextExample
1CLI Tool"I'm building a terminal file manager in Rust"
2SaaS Product"Developer productivity tool for code review"
3OSS Library"Python library for data validation"
4Startup"AI-powered hiring platform"
5Side Project"Weekend project — a bookmark manager"
6Brand"Design agency specializing in developer tools"
Pick a number, describe what you're naming, or type "guide me".

Guided Intake

If the user types "guide me", ask three questions:
  1. What are you naming? "A CLI tool, a SaaS product, an OSS library, a startup, a brand, or something else?"
  2. What does it do? "Describe it in one sentence."
  3. What vibe? "Playful, serious, technical, warm, edgy, minimal, or describe your own."

Dynamic Context Classification

Auto-detect from the user's description. Adjusts both platform priority AND scoring weights.
Context SignalCategoryPrimary PlatformsSecondary
"CLI tool", "command", "binary"CLI ToolGitHub, npm/PyPI/Crates, Homebrew, .devSocial
"package", "library", "framework", "SDK"OSS LibraryGitHub, npm/PyPI/Crates, .dev/.ioSocial
"app", "product", "startup", "SaaS"Product.com, X/Twitter, LinkedIn, GitHubDev registries
"company", "brand", "agency", "studio"Brand.com, X/Twitter, Instagram, LinkedIn, YouTubeDev registries
"game", "content", "media", "community"Creative.com, YouTube, TikTok, X/Twitter, Reddit, DiscordDev registries
"open source", "OSS", "contrib"OSS ProjectGitHub, npm/PyPI/Crates, .dev, DiscordSocial
AmbiguousBalanced.com, GitHub, X/Twitter, npm/PyPIAll others
Scoring presets — each context uses different intrinsic/extrinsic dimension weights AND a different intrinsic/extrinsic split ratio. See
references/scoring-rubric.md
§ Context Presets for the full weight tables. Key differences:
  • CLI Tool: 30/70 intrinsic/extrinsic split — typeability (30%) and registry (35%) dominate extrinsic
  • Brand: 50/50 split — phonetics (30%) and domain (35%) are top priorities
  • Side Project: 25/75 split — availability-first; typeability (40%) and registry (20%) lead extrinsic
Present the classification and preset to the user. User can override with
--style
or adjust weights manually.

Core Workflow (6 Phases)

Phase -1: Memory Load (runs once per session)

!uv run python scripts/memory.py load
If memory exists, integrate into session:
  • Archetype affinities → bias Phase 1 generation distribution (e.g., 35% evocative if user favors it)
  • Phonetic likes/dislikes → add to Phase 1 hard filters (dislikes) and soft scoring boosts (likes)
  • Length preferences → adjust length constraints in Phase 1
  • Weight overrides → pre-fill Phase 3 scoring weights
  • Context defaults → suggest context in Phase 0 Brief ("Last time you named a CLI tool — same context?")
  • Inspirations → reference in Phase 1 generation as stylistic anchors
  • Past selections → avoid regenerating names the user already picked
If no memory exists, proceed normally. Memory is additive — never block a phase on missing memory.

Phase 0: Brief (sequential, interactive)

  1. Parse what's being named, context, constraints
  2. Auto-classify naming context → select preset
  3. Present classification + adjusted weights to user
  4. Accept overrides:
    --style
    ,
    --thorough
    , manual weight adjustment
  5. Accept inspirations: "I like names like Vercel, Stripe, Neon"

Phase 1: Generate & Filter (inline, single-pass)

Load
references/naming-strategies.md
for archetype details and sound symbolism guide.
Generate 40-60 candidates across 6 naming archetypes:
ArchetypeDescriptionExamples
Invented wordsPhonetically constructed neologismsKodak, Xerox, Hulu, Roku
Metaphorical transfersConcepts from other domainsAmazon, Safari, Slack, Rust
Compound blendsPortmanteaus, morpheme combosInstagram, Pinterest, YouTube
Classical rootsLatin, Greek, Sanskrit etymologyNike, Astra, Veritas, Lumen
Evocative fragmentsShort, punchy, abstract feelFigma, Sumo, Neon, Zed
Descriptive-creativeClear meaning with flairCloudflare, Datadog, Fastly
Hard filters (binary pass/fail, run BEFORE availability checking):
Run
!uv run python scripts/generate.py filter --input candidates.json
for automated filters, then apply AI-only filters inline:
  1. Profanity/vulgarity in English (script:
    generate.py filter
    )
  2. Offensive meaning in top 10 world languages (AI-only: use
    brave_web_search
    )
  3. Exact collision with top-1000 brand in same category (AI-only: use
    brave_web_search
    )
  4. Exceeds length limit (15 chars product, 8 chars CLI, 12 chars library) (script:
    generate.py filter
    )
  5. Unpronounceable consonant clusters (script:
    generate.py filter
    )
  6. Reserved word in major programming languages (script:
    generate.py filter
    )
  7. Contains hyphens/special chars (for package names) (script:
    generate.py filter
    )
Score intrinsic dimensions (phonetics, semantics, memorability, morphological flexibility, visual quality). Use
!uv run python scripts/generate.py analyze <name>
for phonetic breakdown to inform phonetic quality scoring. Select top 20-25 for availability checking.
--thorough
mode: Run multiple generation passes with varied prompting for more diversity.

Phase 2: Availability Sweep (parallel subagents)

Load
references/platform-checks.md
for per-platform check methods.
Dispatch 4 parallel subagents, each checking ALL candidates in its category:
Subagent A — Domain Checker:
  • .com/.net via RDAP:
    GET https://rdap.verisign.com/com/v1/domain/{name}.com
    → 404 = available
  • .dev/.io/.ai/.app via brave_web_search
  • Pricing: brave_web_search for top 5 candidates
Subagent B — Dev Registry Checker (Direct API):
  • GitHub:
    GET https://api.github.com/users/{name}
    → 404 = available
  • npm:
    GET https://registry.npmjs.org/{name}
    → 404 = available
  • PyPI:
    GET https://pypi.org/pypi/{name}/json
    → 404 = available
  • Crates:
    GET https://crates.io/api/v1/crates/{name}
    → 404 = available
Subagent C — Social & Handle Checker:
  • Reddit:
    GET https://www.reddit.com/api/username_available.json?user={name}
  • Bluesky: AT Protocol handle resolution
  • X/Twitter, YouTube, Instagram, LinkedIn: brave_web_search with
    site:
    prefix
Subagent D — Conflict & Distinctiveness:
  • Search collision volume:
    brave_web_search '"{name}" software'
  • Trademark (--thorough):
    brave_web_search "USPTO TESS {name}"
Or run deterministic checks via script:
!uv run python scripts/availability.py check-all candidate1 candidate2 ...
Scaling:
  • ≤10 candidates: 4 parallel subagents
  • 11-25 candidates: Pre-filter with quick .com RDAP, full check top 10-15
  • --thorough
    : All social + trademark + Wikipedia checks

Phase 2.5: Variant Generation (conditional)

For top 5 intrinsic-scored candidates that FAILED availability:
  • Generate 3-5 variants each: prefix (
    go-
    ,
    un-
    ), suffix (
    -kit
    ,
    -lab
    ,
    -ify
    ), vowel dropping (
    namr
    ), respelling (
    nomer
    ), scoped (
    @scope/name
    )
  • Run availability checks on variants (same subagent pattern, smaller batch)

Phase 3: Score & Rank (inline)

Load
references/scoring-rubric.md
for detailed criteria.
10 scoring dimensions (0-10 scale, context-weighted):
DimensionMethod
Domain availability.com=10, .dev/.io=7, .ai/.app=5, parked=3, none=0
Registry availability% of target registries available
Handle consistency% of target social platforms available
MemorabilityLength bonus + syllable count + imagery
Phonetic qualityConsonant/vowel flow, stress, sound symbolism
Semantic fitDomain relevance, emotional tone, metaphor richness
TypeabilityCharacter count, keyboard locality, no specials
Search distinctivenessInverse of search result count
Morphological flexibilityCan verb/noun/compound? Product family support?
Visual qualityLetter balance, ascenders/descenders, URL aesthetics
Composite:
(0.4 × intrinsic_avg) + (0.6 × extrinsic_avg)
— user can adjust split.
Run
!uv run python scripts/score.py score --input candidates.json
for deterministic scoring. Input JSON must have
{"candidates": [{"name": "...", "intrinsic": {...}, "availability": {...}}], "preset": "cli-tool"}
.

Phase 4: Present (inline)

Load
references/output-formats.md
for templates.
Three ranked views:
  1. Best Names — ranked by intrinsic quality (availability shown but not factored)
  2. Best Available — ranked by composite score (default recommendation)
  3. Best with Variants — top intrinsic names with available modifications
Each view: ranked table with availability matrix (✅ ❌ ⚠️ ❓), scores, rationale.
Detailed cards for top 3 per view: full scoring breakdown, strengths, risks, next steps.
Actionable next steps: "Register neon.dev at $12/yr", "Claim @neon on GitHub", "
npm init neon
"
Interactive refinement: "more like #3", "shorter", "more technical", "avoid X sounds"
Dashboard: After all views and cards are produced, assemble the full session into the JSON schema from
references/output-formats.md § Structured Output Schema
. Read
templates/dashboard.html
, replace
{}
in
<script id="data" type="application/json">{}</script>
with the JSON, and write the result to
~/.{gemini|copilot|codex|claude}/namer/{session-slug}-dashboard.html
. Print the open command:
open ~/.{gemini|copilot|codex|claude}/namer/{slug}-dashboard.html

Save Session

Save to
~/.{gemini|copilot|codex|claude}/namer/{YYYY-MM-DD}-{context}-{slug}.md
with YAML frontmatter after Phase 1 (candidates), Phase 2 (availability), Phase 4 (ranking). Supports resume.

Memory Save Triggers

Save memories at natural decision points. NEVER slow down a phase for a memory write — always save AFTER delivering primary output.
TriggerCommand
Phase 0: User states style preference
memory.py save-preference --type vibe --value "..."
Phase 0: User cites inspiration names
memory.py save-inspiration --name "..." --context "..."
Phase 0: User adjusts weights
memory.py save-weights --intrinsic-split F --extrinsic-split F
Phase 1: User says "avoid X sounds"
memory.py save-rejection --pattern "X" --type phonetic --reason "..."
Phase 4: User selects a name
memory.py save-selection --name "..." --archetype "..." --context "..." --score N --query "..."
Refinement: "more like #N"
memory.py save-preference --type archetype --value "..." --like
Refinement: "shorter" / "longer"
memory.py save-preference --type length --value "max=5"
or
"min=8"
Any: User rejects a style
memory.py save-rejection --pattern "..." --type archetype --reason "..."
Batch multiple saves in a SINGLE message when a session produces several memories. All
memory.py
commands are prefixed with
!uv run python scripts/
.

Canonical Vocabulary

TermDefinition
briefNaming requirements: what, context, style, constraints
candidateA generated name before availability checking
archetypeNaming strategy: invented, metaphorical, compound, classical, evocative, descriptive
intrinsic scoreQuality from linguistic/creative dimensions (no I/O)
extrinsic scoreAvailability from platform checks (I/O intensive)
composite scoreWeighted combination of intrinsic + extrinsic
hard filterBinary pass/fail gate: profanity, length, pronounceability
variantModification of a candidate: prefix, suffix, respelling
namespace reportPer-candidate availability matrix across all platforms
context presetAuto-configured weights + platforms for what's being named
memoryPersistent naming preferences at `~/.{gemini
archetype affinityWeighted distribution of user's preferred naming archetypes, computed from selections
selectionA name the user chose as their winner, stored for preference learning
rejectionAn explicitly unwanted pattern (phonetic, archetype, or specific name)

Reference File Index

FileContentRead When
references/naming-strategies.md
6 archetypes, sound symbolism, phonetic guide, morpheme libraryPhase 1 (generation)
references/platform-checks.md
Per-platform: URLs, methods, response parsing, rate limitsPhase 2 (availability)
references/scoring-rubric.md
10 dimensions detailed, 6 presets, hard filters, composite formulaPhase 3 (scoring)
references/output-formats.md
Templates for 3 views, name cards, variant tables, next-stepsPhase 4 (presentation)
templates/dashboard.html
Self-contained GUI — inject structured JSON from § Structured Output SchemaPhase 4 (dashboard render)
scripts/memory.py
CLI for persistent naming preferences (load, save, prune, stats)Phase -1 (load), end of session (save)
Load ONE reference at a time per the "Read When" column.

Critical Rules

  1. Never skip availability checking — unchecked names are worthless recommendations
  2. Always present scoring rubric transparently — no black-box rankings
  3. Never fabricate availability data — if a check fails, mark "❓ unknown", never "✅ available"
  4. Always run hard filters before availability checks — don't waste API calls on disqualified names
  5. Maximum 25 candidates through full availability pipeline — budget tool calls
  6. Always surface trademark/conflict risks — legal issues trump name quality
  7. Never modify user files — namer is read-only except session journals in
    ~/.{gemini|copilot|codex|claude}/namer/
  8. Always produce all three output views — Best Names, Best Available, Best with Variants
  9. Always provide actionable next steps — "register X at Y for $Z" not just "X is available"
  10. Generation must use multiple archetypes — never produce candidates from only one strategy
  11. Context classification before generation — weights and platforms depend on it
  12. Intrinsic and extrinsic scores shown separately — user needs to see the trade-off
  13. Load user memory before Phase 0 (Phase -1). Save memories AFTER delivering primary output — never block a phase for a memory write