- Rust 83.1%
- CSS 16.1%
- HTML 0.8%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
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> |
||
| crates | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| README.md | ||
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.