Onomly
AI brand-naming and validation engine — generate, score, and clear candidate names across domain, trademark, and social channels.
Onomly (internal package: launch_engine) is a Python framework that turns a naming brief into a defensible shortlist. It generates brand-name candidates with an LLM, applies phonetic and semantic filters, scores each candidate, and then validates availability through pluggable adapters (RDAP domain lookup, trademark gateway, social-handle checks) with SQLite caching, token-bucket rate limiting, and retry-with-backoff.
The brand name Onomly is a real-word blend (from onomatics / onomastics — the study of names — plus a friendly "-ly" suffix). It was chosen after the first coined name ("KLYDRIX") read as too invented; see NAMING.md for the full brief, shortlist, validation evidence, and decision record.
Features
- Divergent → Convergent generation — LLM generates diverse candidates across 8 name typologies, then scores and ranks them.
- Phonetic filtering — syllable, length, and avoided-sound constraints applied mid-pipeline.
- Pluggable validation adapters — Domain (RDAP), Trademark (manual-review gateway), and Social (X / Instagram / LinkedIn).
- Resilient pipeline — per-adapter rate limiting (token bucket), exponential-backoff retry on transient errors, and TTL-based SQLite caching.
- CLI —
generate-names,validate,cache, andadapterscommands with table / JSON / CSV output. - Async-first — built on
asynciothroughout;pydanticmodels for all I/O contracts.
Installation
pip install onomly
For development:
git clone https://github.com/EAbaracus/onomly.git
cd onomly
pip install -e ".[dev]"
Note on package naming: the importable package is
launch_engine(kept stable to avoid breaking the existing module graph). The installed console script and published distribution name isonomly.
Quick Start
First-run: choose your model
Onomly needs an LLM. Before the first run, pick one interactively:
onomly configure
This prints a numbered list of available models (9router free models, local Ollama, OpenAI, Anthropic) and saves your choice to onomly/config.json under your config dir (%LOCALAPPDATA%/onomly on Windows, ~/.config/onomly on Linux). No secrets are stored — only the model selection; API keys come from the environment (or 9router, which needs none).
You can also list the catalog non-interactively:
onomly models
If you skip configure, commands fall back to the default model (9router free) and print a one-line hint.
CLI
# Generate candidates from a brief
onomly generate-names \
--project-codename "my_saas" \
--description "AI agent orchestration platform" \
--target-markets "USA,EU" \
--industry "Technology" \
--output-format table
# Override the saved model for a single run
onomly generate-names \
--project-codename "my_saas" \
--description "AI agent orchestration platform" \
--target-markets "USA,EU" \
--industry "Technology" \
--llm-provider openai --llm-model gpt-4o-mini
# Validate a previously generated candidate file
onomly validate \
--candidates-file candidates.json \
--target-markets "USA,EU" \
--industry "Technology" \
--output-format json
Python
import asyncio
from launch_engine.engine import LaunchEngine
from launch_engine.modules.naming.brief import NamingBrief
async def main():
engine = LaunchEngine(
llm_provider="ollama",
llm_model="qwen3:14b",
cache_db_path="klydrix_cache.db",
)
brief = NamingBrief(
project_codename="my_saas",
description="AI agent orchestration platform",
target_markets=["USA", "EU"],
industry="Technology",
candidate_count=10,
)
candidates, results = await engine.run_full_pipeline(brief)
for c in candidates.candidates:
print(c.name, c.typology, c.internal_assessment.score)
asyncio.run(main())
Architecture
KLYDRIX follows a modular pipeline architecture:
- Brand Naming Module (
launch_engine/modules/naming/) — brief parsing, divergent LLM generation, phonetic mid-filter, convergent LLM scoring. - LLM Adapter (
launch_engine/llm.py) — provider-agnostic calls via LiteLLM (ollama, openai, anthropic, 9router). - Validation Pipeline (
launch_engine/validation/) — orchestrates adapters with concurrency control, rate limiting, retry, and caching. - Cache Layer (
launch_engine/cache.py) — SQLite-backed TTL cache keyed by content hash. - CLI (
launch_engine/cli/) — Typer-based command surface.
Data Flow
NamingBrief
│
▼
BrandNamingModule.run()
├─ _divergent_generate() → LLM → NameCandidate[]
├─ _midfilter() → phonetic + avoid-term filter
└─ _convergent_score() → LLM → scored & ranked NameCandidateList
│
▼
ValidationPipeline.validate_all()
└─ for each (candidate, adapter): rate-limit → retry → cache → ValidationResult
Development
pip install -e ".[dev]"
pytest # run the suite
black --check . # formatting
ruff check . # lint
mypy . # types
Documentation
- NAMING.md — how the KLYDRIX name was chosen (brief, shortlist, validation, decision).
- CONTRIBUTING.md — dev setup and PR process.
License
Apache 2.0 — see LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file onomly-0.1.1.tar.gz.
File metadata
- Download URL: onomly-0.1.1.tar.gz
- Upload date:
- Size: 38.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
71f55e7b8b982c1d4a7ca525cdead86e0df060ffa9935e4bdbe240f26089e5cb
|
|
| MD5 |
2092485771b46e6570436210c6fa53d7
|
|
| BLAKE2b-256 |
5b8337289f87f5152444e885f2ab64ea2f723691b121b2232e76423ea06f0830
|
File details
Details for the file onomly-0.1.1-py3-none-any.whl.
File metadata
- Download URL: onomly-0.1.1-py3-none-any.whl
- Upload date:
- Size: 37.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d82c44c36faf53953dce19b4f0732eda49cfe71475341eaccdc7b0815ab5149d
|
|
| MD5 |
9233f06c3e1c0f678e28f84abd40bf0c
|
|
| BLAKE2b-256 |
1aa1f48fbeac8a7a8b1ecfe25ad85cc0772abff5a4ad6a79a19ac928b068cfe6
|