No description
  • Rust 83.1%
  • CSS 16.1%
  • HTML 0.8%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
fabian 5e8b628990 Première version de Nia Genomo
Webapp qui mélange deux noms de famille en un nom pour l'enfant,
d'après le design « Nia Genomo — design de la webapp ».

- genomo-core : moteur de mélange en Rust pur, déterministe (même
  graine, mêmes noms), avec partage égal des lettres et lettre commune
  pour les longueurs impaires, filtre de prononçabilité et part de
  hasard réglable.
- genomo-web : interface Leptos compilée en WebAssembly ; tout se
  passe dans le navigateur, favoris dans le localStorage, pas de
  cookie, polices auto-hébergées.
- genomo-server : serveur axum optionnel (POST /api/mix) pour déplacer
  le calcul hors du navigateur (feature `remote` de genomo-web).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 19:37:29 +02:00
crates Première version de Nia Genomo 2026-10-05 19:37:29 +02:00
.gitignore Première version de Nia Genomo 2026-10-05 19:37:29 +02:00
Cargo.lock Première version de Nia Genomo 2026-10-05 19:37:29 +02:00
Cargo.toml Première version de Nia Genomo 2026-10-05 19:37:29 +02:00
README.md Première version de Nia Genomo 2026-10-05 19:37:29 +02:00

Nia Genomo

Deux noms de famille, réunis en un seul. Nia Genomo prend autant de lettres à chaque nom, les recombine en gardant leur ordre d'origine, et ne garde que les noms qui se prononcent facilement.

Pour une longueur impaire, une lettre commune aux deux noms sert de jointure et compte pour chacun : 7 lettres = 4 de Lefebvre + 4 de Moreau, dont le E en commun. Si les noms n'ont aucune lettre commune, ou si l'un est trop court, chaque nom donne la même proportion de ses lettres (4 + 3). Voir plan dans genomo-core/src/mix.rs.

Tout se passe dans le navigateur : pas de compte, pas de cookie, pas de mesure d'audience, pas de requête vers un service tiers (les polices sont hébergées avec l'app). Les favoris sont gardés dans le localStorage de l'appareil.

Organisation

crates/
  genomo-core/    Le moteur de mélange. Rust pur : ni navigateur, ni réseau.
  genomo-web/     L'interface (Leptos), compilée en WebAssembly par trunk.
  genomo-server/  Optionnel : un serveur HTTP qui fait le mélange à la place du navigateur.

L'interface ne parle au moteur qu'à travers genomo-web/src/mixer.rs, avec deux types sérialisables définis dans genomo-core : MixRequest et MixResponse. Le moteur est déterministe : même requête, même graine, mêmes noms, que le calcul soit fait par le navigateur ou par le serveur. C'est ce qui permet de partager un mélange par un simple lien (?a=…&b=…&n=7&s=<graine>).

Prérequis

rustup target add wasm32-unknown-unknown
# trunk : binaire précompilé (cargo install trunk échoue avec certaines versions de GCC)
# https://github.com/trunk-rs/trunk/releases

Développer

cd crates/genomo-web
trunk serve --open          # http://localhost:8080, recompile à chaque modification

cargo test                  # tests du moteur (à la racine)
cargo run --example demo -- Lefebvre Moreau 7 42   # essayer le moteur dans le terminal

Les réglages du moteur (seuil de prononçabilité, part de hasard, limite d'énumération…) sont des constantes en tête de genomo-core/src/mix.rs ; les règles de prononciation sont dans genomo-core/src/phonetics.rs.

Publier

cd crates/genomo-web
trunk build --release       # tout est dans dist/

dist/ est un site statique : il se dépose tel quel sur n'importe quel hébergement (GitHub Pages, Netlify, un dossier servi par nginx…), y compris dans un sous-dossier. Aucune réécriture d'URL n'est nécessaire.

Faire le mélange sur un serveur

Si le calcul devient trop lourd pour les navigateurs (règles plus riches, noms plus longs, plus de propositions), on peut le déplacer sur un serveur sans toucher à l'interface :

# le serveur (port 8787 par défaut, variable PORT)
cargo run --release -p genomo-server

# l'interface, compilée pour l'appeler
cd crates/genomo-web
GENOMO_MIXER_URL=https://mon-serveur.example/api/mix trunk build --release --features remote

API : POST /api/mix avec une MixRequest en JSON, réponse MixResponse (200) ou MixError (422). GET /health répond ok.

{"parent_a": "Lefebvre", "parent_b": "Moreau", "length": 7, "seed": 42, "count": 6, "randomness": 25}

randomness (0 à 100, 25 par défaut) est la part de hasard. L'interface en propose trois niveaux, définis dans genomo-web/src/randomness.rs : Sage (10), Équilibré (25), Audacieux (60). Dans l'URL, c'est le paramètre h=sage ou h=audacieux ; il est omis pour « Équilibré ».

À savoir : en mode serveur, les deux noms saisis quittent l'appareil. Le serveur fourni ne stocke rien et ne journalise pas les noms ; si vous l'étendez ou le placez derrière un proxy, vérifiez que ses journaux ne gardent pas le corps des requêtes. Les favoris, eux, restent dans le navigateur dans les deux modes.