Panoramica
A brand naming system for companies, apps, podcasts, nonprofits, communities, and personal brands. The user names what they are naming and what problem they solve; the system generates candidates, scores them, radio-tests them, checks domains and conflicts, screens trademarks, and returns a shortlist, not a dump of syllable soup.
Cosa è stato costruito
A full naming pipeline with two generation modes. Local mode runs deterministic generators driven by curated YAML lexicons and naming philosophies. BYOK mode uses the visitor's own AI provider key, for that request only; when AI is on, every name comes from the provider, with no local filler. Production ships inside this site at /apps/namegen with a Nitro API behind it. The original Python application remains the open-source reference and the self-host path.
A chi è rivolto
Founders, operators, and creators who need a shortlist of ownable names before they buy a domain or file a mark, not a thesaurus of product descriptions.
Contesto aziendale
Naming tools usually fail in one of two ways: they emit soft invented sludge, or they pretend host-paid AI is free. Namegen's job was to raise the quality bar with hard gates, keep AI optional and user-funded, and avoid a second deploy and subdomain for the live product.
Architettura
A stepped client orchestrates a server pipeline. Generation is one stage; domains, conflicts, and trademarks are separate stages, so the UI can show honest progress and survive partial failure.
Why stepped stages and hard invariants
Generation and checks are separate endpoints against one run row, so the client can step through them and a slow RDAP pass or a failed trademark stage degrades to a partial result instead of a spinner that lies. Two invariants bind the whole pipeline: when BYOK is enabled the run is AI-only, so a weak provider response fails loudly as ai_failed rather than being padded with local filler; and API keys travel only as session-scoped request headers, never into the database or the logs.
Componenti
The system is built from nine components. Each is documented the same way: why it exists, how it is built, what constrains it, and what it trades away.
›C1Brief composer & entity context
- Perché esiste
- A software company and a local furniture retailer should never get the same kind of names. What you are naming is the primary brand-context signal, so the entity picker leads the form.
- Architettura
- An entity picker with fourteen types plus a problem textarea; optional brand preferences (philosophy, language, audience, liked brands, avoid list) and an advanced drawer (length, count, TLDs, BYOK). The server normalizes entity, style, and language, then infers category, keywords, and tone into a composed brand brief.
- Vincoli
- Entity and problem are required. Entity rules drive max length, spaces, and how the LLM prompt is framed. Preferences must change the output, not just decorate the brief.
- Casi limite
- Legacy aliases normalize (brandable becomes invented, market codes become languages). An empty problem with only a brand brief still composes. A custom Other language passes through.
- Compromessi
- Progressive disclosure keeps the first action one click; more control lives behind drawers so the composer stays a single composition.
›C2Naming philosophies
- Perché esiste
- One algorithm with a style slider collapses to the same invented names. Philosophies are distinct strategies, not weights on one method.
- Architettura
- Four philosophies: Invented (Figma and Canva energy), Real Words (Stripe, Cursor, Ramp), Compound (Basecamp, Mailchimp, GitHub), and Descriptive (SurveyMonkey and PayPal, still ownable). Style quotas drive the local generator; LLM prompts are opinionated per philosophy, with positive and negative examples, hard avoid lists, and liked-brand patterns rather than the brands themselves.
- Vincoli
- Real-word candidates must pass curated lexicon checks. Soft inventeds are banned on the AI path. Entity rules can override length and spacing.
- Casi limite
- An AI asked for inventeds that returns product phrases gets culled by the gates. A compound that is not two recognizable halves fails the accept rules.
- Compromessi
- Stricter philosophies mean fewer names. Preferred over a long list of sludge.
›C3Generation pipeline
- Perché esiste
- Orchestrates create, generate, and checks as a status machine the UI can step through honestly.
- Architettura
- Load the favorite-signal and preference profiles; run local generation or the LLM, exclusively; filter every name, ban soft inventeds, apply avoid tokens, and score with a tier bonus for the provider's own top picks; cull to a shortlist of 12 to 24; radio-test the top names; persist candidates with safe LLM metadata only, provider, model, and counts, never keys.
- Contratto API
// stepped UI path: one run row, separate stages POST /api/namegen/runs { run_pipeline: false } POST /api/namegen/runs/:id/generate + X-LLM-* headers POST /api/namegen/runs/:id/check-domains · check-conflicts · check-trademarks GET /api/namegen/runs/:id → results DTO
- Casi limite
- Provider JSON that will not parse returns ai_failed, with no silent fallback. A quality cull that would empty the set falls back to keeping the best of what passed the structural filter. Favorites can be toggled while a run is open.
- Compromessi
- Stepped calls cost more round trips than a one-shot pipeline, and buy honest progress and partial recovery.
›C4Local name generator
- Perché esiste
- A usable product with AI off: free, deterministic, offline-capable generation.
- Architettura
- Six methods (descriptive, compound, invented, evocative, suggestive, real word) driven by curated YAML assets: a vocabulary, a brand lexicon, a real-word lexicon, and syllable tables. Language preferences bend phonotactics and endings.
- Vincoli
- Must respect entity max length and philosophy quotas, and must never emit blocklisted or unpronounceable strings.
- Casi limite
- Exhausted lexicon uniqueness, over-long compounds, and category stems that turn descriptive mode into SEO sludge.
- Compromessi
- Curated lexicons beat open-ended invented generation for commercial feel, and they bound creativity to what is in the lists.
›C5BYOK LLM layer
- Perché esiste
- Optional AI lift without the host paying inference or storing user keys.
- Architettura
- The key lives in sessionStorage and travels only as request headers on the generate call. The server prefers the request key; host keys are honored only when a private-deploy flag is set, and the public default is off. Providers: Anthropic, OpenAI-compatible, xAI, and Gemini. The prompt asks for structured JSON, naming directions plus names with tiers, and the AI target is capped per run.
- Vincoli
- Public deploys carry no server keys. Keys never touch query strings, logs, or the database. AI on means no local filler.
- Casi limite
- A key with no provider, an invalid model override, provider rate limits, malformed JSON, and the batch where every AI name fails the gates.
- Compromessi
- Ephemeral headers are simple and honest: the key exists for that tab session, by design, and there is no multi-user key vault to secure.
›C6Quality gates
- Perché esiste
- The product is a shortlist, not a brainstorm dump. Soft inventeds fail the commercial test: would you say we use this at work every day?
- Architettura
- Four gates in series. A structural filter checks length, blocklist, consonant clusters, and syllable limits. A soft-invented ban holds a banned set, product endings like ify and bot, and soft Latinate tails, with a small classical whitelist. A brand-quality check applies method-specific accept rules. A weighted scorer applies philosophy overrides, preference penalties and bonuses, and a favorite-affinity bonus.
- Vincoli
- Gates run on both the local and AI paths. Credibility floors are stricter for the invented and real-word styles.
- Casi limite
- Odd but good coinages can be over-rejected; real adverbs that happen to end in ly; multi-word names that need higher syllable limits.
- Compromessi
- Aggressive bans improve first-impression quality and discard some creative edges. The right trade for a founder-facing shortlist.
›C7Radio, domains, conflict, trademarks
- Perché esiste
- A pretty name that fails spelling, the dot-com check, or a famous mark is not a shortlist candidate.
- Architettura
- Radio is a heuristic spell-after-hearing score with alternate spellings and an explanation. Domains use RDAP only, which is free, with capped concurrency and a week-long cache. Conflict is a deterministic blocklist over exact matches and brand stems. Trademark screening runs exact, spelling, and phonetic matching with Nice-class weighting from the brief, and reads out as low, medium, or high risk. The default dataset is a labeled sample; a real USPTO import is an operator option.
- Casi limite
- RDAP timeouts surface as an error status rather than a fake available. Premium domain hints, dead versus live marks, and same-industry versus unrelated classes.
- Compromessi
- Free RDAP and a labeled sample dataset keep the public tool zero-cost. Every check is informational: it is a filter, never registrar truth and never legal advice.
›C8Persistence & favorite learning
- Perché esiste
- Sessions, export, and soft learning from starring, without a heavy data platform.
- Architettura
- SQLite via better-sqlite3: a runs table (brief, settings, status), candidates (scores, domains, conflict, radio, trademark, favorite), a domain cache, and favorite signals that store only anonymized name shape, length, ending, and style, feeding an affinity bonus on later runs.
- Vincoli
- No API keys in the database, ever. The hosting filesystem is ephemeral without a volume, so runs do not survive deploys unless the database path points at persistent storage.
- Casi limite
- Uniqueness per run and name, migration columns for the radio and trademark fields, and favorite-toggle races.
- Compromessi
- SQLite is enough for a personal-site tool; multi-instance hosting would need an external store and a shared rate limit.
›C9On-site Nitro port & open-source split
- Perché esiste
- The planned names subdomain never got DNS, and BYOK removed the cost reason to stay separate. The real barrier was stack isolation, Python versus Nuxt, and a TypeScript port dissolved it.
- Architettura
- A faithful port of the Python services into Nitro server utilities plus a Vue UI at /apps/namegen, with the YAML lexicons shipped as server assets. The apps shelf launches the on-site route; View Source points at the public Python repository, which stays the MIT reference and self-host path.
- Compromessi
- Dual maintenance of a TypeScript production app and a Python reference, against one deploy and one domain. On-site TypeScript won for production UX and operations.
Output visivo
The exhibits this record will carry, captured from the live tool. Every frame below is a slot awaiting a real screenshot; nothing here is mocked.
The composer
Entity, problem, and one Generate action; preferences stay collapsed until asked for.
Naming philosophy control
Invented, Real Words, Compound, Descriptive, each with its hint copy.
BYOK advanced drawer
AI on, provider selected, key field, and the status chip.
Progress states
Generating, then checking domains, conflicts, and trademarks, as separate honest stages.
Direction cards and results table
Favorites, source badges for AI and Local, scores, domain pills, trademark risk, and radio.
Usable-only filter and CSV export
The shortlist posture: cut to what survives, then take it with you.
Sample trademark disclaimer
The honesty line: the demo dataset is a sample, not a USPTO search.
Impatto
What the system changed, by audience.
- Business
- A public naming utility ships on the personal site with no second SaaS bill for inference.
- The reference implementation is open source under MIT while production runs on-site.
- Cliente
- A problem-first brief instead of describe your startup.
- Philosophies that actually change the shape of the names.
- Domains and trademark risk on the same shortlist view.
- Operazioni
- One deploy with the site and no orphan subdomain.
- BYOK means abuse cost is mostly CPU and RDAP calls, not API spend.
- Ingegneria
- Hard quality gates as product behavior, not prompt hope.
- An AI-only invariant whenever BYOK is enabled.
- A clear split between the live TypeScript app and the Python reference.
- Scala
- Shortlists are intentionally small, 12 to 24 names per run.
- The API is rate limited per IP and RDAP concurrency is capped.
Documenti tecnici
Documents this record seeds. Each becomes a dated entry as it is written.
Case study
The complete arc, compressed.
- Problema
- Founders drown in bad name generators: keyword piles, soft inventeds, and tools that hide an API meter behind the word free.
- Obiettivo
- A shortlist of names worth building around, shaped by what you are naming and the problem you solve, with domain and trademark context and optional AI the host does not pay for.
- Vincoli
- No host LLM keys on the public deploy; deterministic quality gates; a free domain path via RDAP; trademark screening that never pretends to be legal clearance; and no dependency on an unpublished subdomain.
- Approccio
- A problem-and-entity brief, philosophy-specific generation, local or BYOK, hard quality gates, then radio, domain, conflict, and trademark checks into one comparison table. Later, port the Python engine to Nitro and TypeScript and host it on-site.
- Architettura
- Vue client, Nitro API, a stepped pipeline over SQLite and YAML lexicons; keys live only in the session and in request headers.
- Compromessi
- Aggressive soft-invented rejection, AI-only generation when enabled, a sample trademark dataset by default, a dual codebase, and ephemeral SQLite without a volume.
- Esito
- The pipeline runs in production at /apps/namegen. The apps shelf launches it in-site, the MIT Python repository remains the reference and self-host path, and the dead subdomain plan is retired.
- Lezioni
- Quality is a gate stack, not a better prompt.
- Free AI on a public tool is a cost center and an abuse magnet; BYOK is the product decision.
- A second deploy for DNS aesthetics is not free; if the site can host it, host it.
- When AI is on, do not dilute failure with local filler.
- Futuro
- A persistent volume or external database so runs survive deploys, a documented USPTO dataset path for operators, and either shared fixtures that keep the Python and TypeScript engines aligned or a formal freeze of Python as the reference.
