Skip to content

Repository files navigation

Azimut

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.

azimut.page

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.


Ce que c'est techniquement

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

Démarrer

npm install
npm run dev          # http://localhost:3004

Ou dans Docker, pour retrouver la version de Node de la production :

docker compose -p azimut -f docker-compose.dev.yml up -d --build

Vérifier

npm run check        # typecheck, lint, build

npm 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.

Mettre en production

cp .env.example .env         # puis renseigner NEXT_PUBLIC_SITE_URL
docker compose -p azimut up -d --build

⚠️ Les variables NEXT_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.

Régénérer la table des pays

npm run countries    # scripts/build-countries.mts -> src/data/countries.ts

Le 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.

⚠️ Le contenu ET L'ORDRE de cette table déterminent le pays de chaque jour. Ajouter un pays au milieu décale toute la suite et réécrit silencieusement les archives déjà jouées. npm run check:schedule refuse ce genre de changement.

Structure

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

Licence

MIT — voir LICENSE.

Les frontières viennent de Natural Earth, dans le domaine public.

About

Jeu de géographie quotidien : devinez le pays du jour à sa silhouette. Distance et cap à chaque essai, six tentatives, quatre langues. Next.js en export statique, aucun serveur, servi par nginx.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Used by

Contributors

Languages