Ethiopian/Eritrean name intelligence for Kotlin and Android: parsing, fidel transliteration, spelling-variant generation, and patronymic-aware fuzzy matching with an explanation for every score.
# habesha-names (Kotlin)
**Ethiopian/Eritrean name intelligence for Kotlin and Android:** parsing,
fidel transliteration, spelling-variant generation, and patronymic-aware fuzzy
matching with an explanation for every score.
> A Kotlin port of the Python library
> `habesha-names` by **Robel
> Shemeles**, used under the MIT License. See UPSTREAM.md for
> provenance, what is reproduced unchanged, and how fidelity is verified.
> **Status: complete.** All nine public functions are ported and
> differential-tested against upstream, the 1,752-pair golden corpus passes, and
> the Compose UI layer is in place.
## Why this exists
Habesha names break every global identity system:
1. **No family names.** A full name is given name + father's given name (+
grandfather's). "First name / Last name" fields are semantically wrong.
2. **No standard romanization.** ጸሐይ → Tsehay / Tsehai / Sehay / Tzehay. One
person, four database records.
3. **Compound given names.** "Haile Mariam" can be one given name
(Hailemariam) or given + patronym. Naive tokenizers guess wrong.
4. **Abbreviation conventions.** Gebremedhin → G/Medhin, G.Medhin, Gebre
Medhin — all common in official documents.
5. **Fidel homophones.** ሀ/ሐ/ኀ, ሰ/ሠ, ጸ/ፀ, አ/ዐ are pronounced identically, and
spelling varies by writer.
Intended for KYC/AML and sanctions screening, remittance platforms, HR and
payroll, humanitarian registration, and deduplication pipelines.
## Design principles
Inherited from upstream, and non-negotiable here too:
| Principle | Why |
|---|---|
| **No third-party runtime dependencies** | Adoption without supply-chain review friction. The published POM lists only `kotlin-stdlib`. |
| **Deterministic** — no ML, no network, no device-dependent data | Compliance and audit requirements |
| **Explainable** — every score ships an explanation object | An analyst has to justify a match |
| **Data as reviewable assets** | Linguistic data lives in JSON with `verified` flags, never hand-typed into code |
| * …