Un jeu de géographie quotidien. Une silhouette de pays, six essais, et à chaque proposition la distance et le cap qui vous séparent de la réponse.
Le même pays pour tout le monde, chaque jour, sans compte et sans publicité. Un jour manqué n'est pas perdu : toutes les parties passées restent jouables depuis la page Archives, un calendrier où l'on choisit sa date. Le jeu commence au 1er janvier 2026 : 232 parties sont jouables dès l'ouverture.
Un site entièrement statique. Pas de base de données, pas d'API, pas de session. Le pays du jour est déduit de la date par une permutation déterministe, calculée dans le navigateur : deux joueurs à l'autre bout du monde tombent sur le même pays sans qu'aucun serveur n'ait à le leur dire.
C'est aussi ce qui rend les archives gratuites : countryOfDay('2026-09-14')
donne la même réponse sur toutes les machines et pour toujours. Il n'y a rien à
stocker, donc rien à sauvegarder et rien qui puisse tomber en panne.
Les essais vivent dans le localStorage et n'en sortent jamais.
| Cadre | Next.js 16, App Router, output: 'export' |
| Styles | Tailwind CSS v4, thème clair/sombre/système |
| Langues | français, anglais, espagnol, allemand — slugs traduits |
| Données | Natural Earth 110m (domaine public), 168 pays souverains |
| Production | une image nginx de 26 Mo, sans privilèges, en lecture seule |
npm install
npm run dev # http://localhost:3004Ou dans Docker, pour retrouver la version de Node de la production :
docker compose -p azimut -f docker-compose.dev.yml up -d --buildnpm run check # typecheck, lint, buildnpm run build régénère au passage nginx/redirects.conf depuis
src/i18n/routes.ts, puis élague out/404/ et out/_not-found/ — deux URL
qui répondraient 200 et que Google compte comme des erreurs.
cp .env.example .env # puis renseigner NEXT_PUBLIC_SITE_URL
docker compose -p azimut up -d --buildNEXT_PUBLIC_* sont inlinées à la construction. Les passer
au démarrage du conteneur n'a aucun effet : une NEXT_PUBLIC_SITE_URL fausse
donne un site qui s'affiche parfaitement et se référence sur le mauvais domaine.
Le conteneur écoute sur 127.0.0.1:3007 et attend un proxy inverse devant lui
pour le TLS.
npm run countries # scripts/build-countries.mts -> src/data/countries.tsLe script projette chaque pays dans un carré de 100 unités, écarte les territoires trop éloignés de la masse principale — la Guyane pour la France, par exemple — et adapte la simplification à la taille du pays. Chaque silhouette sort centrée sur (50, 50), ce que la CI vérifie.
La question posée étant « quel est ce pays ? », la table ne garde que ce qui se
gouverne soi-même : l'Antarctique, le Groenland, Porto Rico et les autres
dépendances sont écartés, avec leur raison, en tête de build-countries.mts.
npm run check:schedule refuse ce genre de changement.
src/
app/ routes (deux layouts racines : / et /[locale]/)
components/ Radar, Console, GuessInput, StatsPanel…
data/ countries.ts — GÉNÉRÉ, ne pas modifier à la main
i18n/ dictionnaires et table des slugs traduits
lib/ géodésie, tirage du jour, stockage, référencement
views/ GameView, RulesView, AboutView
nginx/ configuration servie en production
scripts/ génération des pays, des redirections, des images de partage
MIT — voir LICENSE.
Les frontières viennent de Natural Earth, dans le domaine public.