But : carte narrative immersive, fiable et maintenable, utilisée en jeu et comme référentiel vivant de l’univers.
Axes : qualité des données, excellence UX, industrialisation (CI/CD & ops).
- Front unifié (Leaflet + modules
DataService,MapController,UiController) orchestré parjs/main.js. :contentReference[oaicite:0]{index=0} - Validation centralisée des datasets + nettoyage massif (images/audio/JSON). :contentReference[oaicite:1]{index=1}
- Galerie média et audio robustes (fallback, hover, etc.). :contentReference[oaicite:2]{index=2}
- Persistance locale (filtres, vue carte, favoris). :contentReference[oaicite:3]{index=3}
- Editeur in-app (CRUD Lieux) avec réécriture dans
assets/locations.json. :contentReference[oaicite:4]{index=4} - Auth Discord OAuth2 + sessions signées + panneau admin (rôles). En prod. :contentReference[oaicite:5]{index=5}
- Temps réel par SSE (
/api/events/stream). En prod. :contentReference[oaicite:6]{index=6} - Pipeline CI rétabli + déploiement continu sur VPS (rsync + PM2 + Nginx). En prod.
- Healthchecks prod :
GET /auth/session,GET /api/annotations,GET /api/events/stream(200 attendu). - Stockage persistant des sessions entre redémarrages.
- Workflows GitHub Actions : lint/tests + déploiement (rsync) + reload PM2.
- UI admin : retours d’erreurs & télémétrie (inclure 4XX/5XX des routes).
- Doc OAuth/Discord “opinionated” + check-lists CI.
- Bouton “Download ZIP”
- Vrai panneau admin séparer avec centralisation de la Gestion utilisateurs, téléchargement assets, alerte de validation, erreurs, télémétrie etc
- Possibilité de pouvoir ajouter/choisir les tags directement depuis ajouter un lieu et modifier un lieu
- Masquer bouton Ajouter un lieu pour guest et user + masquer bouton Ouvrir le panneau admin pour guest et user
- Polish UI
- Amélioration du player audio, meilleur gestion de la lecture, meilleur gestion du volume, possiblités de loop etc
- Ajout d'un champ famille nobles dans les lieux
- Possiblités de créer des liens interlieux pour passer d'un lieu a l'autre directement depuis les textes des lieux
- Création automatique de suggestion d'hyperlien dans les textes avec posibilités d'appliquer ou non la suggestions
- Déplacer le cadre "connexion" dans un coin de la page (surement en haut a droite) et peut-être modifier la forme pour transformer ça en vrai bouton "profil" avec centralisation des informations de l'utilisateur et un début de personnalisation de profil
- Création et gestion de groupe depuis panneau admin pour ensuite attribuer les groupes de jdr au profil utilisateur
- Possiblités de placement des différents groupes sur la carte avec visualisation des utilisateurs a l'intérieur du groupe
- Dans le profil utilisateur création de personnage avec nom, bio, avatar et groupe
- Les personnages associés aux utilisateur apparaitrons dans les groupes sur la carte
- Dans le profil possiblités de renseigner ces disponibilités a la semaine, remonter des information coté admin pour analyse et trouver les meilleurs créneaux de jeux selon les utilisateurs
- Tableau de bord live (compteurs SSE/latences) côté admin.
- Polish UI
- Carte profil plus claire: avatar grand, pseudo, rôle, groupe(s) en chips, statut/présence.
- Multi‑personnages: carrousel + filtres, tag “actif”, duplication rapide, import/export.
- Personnalisation: bannière, couleur d’accent, bio riche (markdown léger), liens sociaux.
- Actions rapides: changer thème, raccourcis admin, accès “Mes lieux favoris”.
- Feedback clair: état de sauvegarde, erreurs inline, historique des edits récents.
- Sécurité/compte: bouton “révoquer session”, infos Discord, date dernière connexion.
- Polish UI
- Créer une page d’accueil dédiée avant la carte (route
/). - Déplacer l’accès carte sur une route dédiée (
/map) ou équivalent sans casser l’accès direct. - Ajouter un CTA principal “Entrer sur la carte”.
- Ajouter un bouton secondaire “Continuer sans se connecter” (lecture seule).
- Ajouter Connexion Discord sur la page d’accueil.
- Afficher état session si connecté (avatar, pseudo, rôle, bouton “Aller à la carte”).
- Ajouter une section courte de présentation (univers + objectif de la carte).
- Ajouter une section Réseaux / Communauté : YouTube, Discord, Reddit.
- Ajouter un footer avec copyright, crédits, contact, mentions du projet.
- Design responsive propre (mobile + desktop).
- Hero immersif (visuel/illustration + tagline).
- Bloc Fonctionnalités (exploration, quêtes live, groupes, audio, annotations).
- Bloc Comment commencer (3 étapes simples).
- Bloc Nouveautés (derniers événements/ajouts majeurs).
- CTA Rejoindre le Discord.
- CTA Voir le contenu YouTube.
- Bloc “Reprendre” pour utilisateur connecté (favoris / accès rapide carte).
- Message d’état clair si API/session indisponible.
- Réutiliser
/auth/sessionpour hydrater l’accueil. - Gérer les états
guest / user / adminsur l’accueil. - Gérer redirects login propres (
/auth/discord/login?redirect=/mapou retour accueil). - Ajouter bouton Se déconnecter depuis l’accueil.
- Afficher infos compte minimales (provider, Discord, dernière connexion).
- Prévoir accès rapide admin (si admin connecté).
- Externaliser les URLs sociales (config JSON ou
.env) pour éviter le hardcode. - Icônes sociales accessibles (labels/aria).
- Liens externes sécurisés (
target="_blank"+rel="noopener noreferrer"). - Footer avec crédits assets (images/audio/icônes).
- Mention “fan project” / cadre IP (si nécessaire).
- Lien vers support / bugs / contact.
- Ne pas charger Leaflet + assets carte lourds sur l’accueil (chargement à la demande).
- Meta
title+descriptiondédiés à l’accueil. - Open Graph (image de partage, titre, description).
- Structure HTML sémantique (
header,main,section,footer). - Navigation clavier complète + focus visibles.
- Support
prefers-reduced-motion. - Vérifier contraste et lisibilité mobile.
- Direction artistique forte (hero, textures, typo, ambiance).
- Animations légères (entrées, hover CTA, transitions sections).
- Version mobile soignée (CTA visibles sans trop scroller).
- États de chargement élégants (session/auth/API).
- Cohérence visuelle avec la carte et le menu profil.
- Preview du flux temps réel sur l’accueil (mini bloc live).
- Mise en avant de lieux/continents (cards).
- Widget communauté (ex: lien invitation Discord enrichi).
- Écran d’accueil personnalisable côté admin (textes/liens/hero).
- Phase 1 :
/+ CTA carte + login + footer/socials. - Phase 2 : états de session + redirects auth.
- Phase 3 : contenu (hero, fonctionnalités, nouveautés).
- Phase 4 : perf/SEO/accessibilité.
- Phase 5 : polish UI final.
- Refaire le hero en version premium plein ecran.
- Ajouter un fond illustre immersif avec profondeur, brume et halos.
- Ajouter un render personnage HD integre au hero.
- Ajouter une preview mockup de la carte avec mini fiche lieu flottante.
- Ajouter une preuve sociale visuelle (bloc communauté, widget Discord, avatars).
- Ajouter un header plus premium (logo, navigation courte, CTA clairs).
- Brancher les visuels/textes hero dans la configuration admin de l'accueil.
- Finaliser responsive mobile/tablette de la landing premium.
- Polish final : ombres, micro-interactions, animations legeres, coherence typographique.
- Palette : bleu nuit, ivoire, or doux, cyan froid pour les accents interactifs.
- Typographies : une fonte editoriale pour les titres + une fonte UI tres lisible pour l'interface.
- Composition : grand titre centre, sous-texte court, CTA alignes, preuve sociale sous les CTA.
- Showcase : carte en mockup central avec perspective legere et overlays narratifs.
- Personnage : silhouette detouree cote droit avec halo discret et ancrage visuel fort.
- Background : illustration panoramique avec gradients, texture et profondeur atmospherique.
- UI tone : sobre, premium, epure, plus 'univers vivant' que 'dashboard'.
- Un fond hero large HD (desktop + mobile).
- Un render personnage detoure propre (PNG/WebP).
- Un screenshot tres propre de la carte pour le mockup.
- Fix la suppression des annotations
- Sur la carte ajouter un bouton pour revenir a l'acceuil
- Possibilité de fermer/réduire le panneaux "Flux temps réel"
- Frise chronologique complète (axe horizontal gauche -> droite, année, titre, texte, médias, liens vers la carte)
- Etat actuel : MVP technique livré (page dédiée, admin, médias, filtres, liens carte <-> frise, tests UI).
- Avancement récent : regroupement visuel par période ajouté dans la frise horizontale.
- Avancement récent : état de la frise partageable par URL (événement actif + filtres synchronisés).
- Avancement récent : navigation rapide par période ajoutée dans la page chronologie.
- Avancement récent : période active et accent du panneau détail synchronisés pour une lecture plus premium.
- Avancement récent : bandeau de lecture active ajouté dans la frise pour ancrer le contexte courant.
- Avancement récent : enrichissement éditorial des événements, regroupements avancés par époque et raffinement du détail de lecture.
- Avancement récent : affichage des images fiabilisé via chemins médias normalisés et noms de fichiers alignés avec les assets réels.
- Recommandation produit : page dédiée
/timelined'abord, intégration légère dans la carte ensuite. - P4.1 - Cadrage produit V2 de la frise : tri chronologique ascendant, regroupement visuel par périodes contiguës, densité moyenne (carte résumée + détail riche), page dédiée comme point d'entrée principal, état partageable par URL, personnalisation éditoriale avancée limitée à l'accent, l'image, les tags, les lieux liés et la visibilité.
- Décision P4.1 - La carte reste un point d'entrée secondaire vers la frise, sans intégrer la timeline complète dans l'interface principale de navigation.
- Décision P4.1 - Les évolutions V2 hors périmètre immédiat sont : replay cartographique, exports, calendriers complexes, embranchements narratifs et filtres ultra spécialisés.
- P4.2 - Modèle de données chronologie :
id,annee,titre,resume,texte,epoque,periode,tags,image,mediaAlt,lieux lies,ordre,visible. - P4.3 - Source de données / persistance : fichier JSON ou API admin dédiée pour CRUD, ordre manuel, publication/masquage.
- P4.4 - Page dédiée chronologie : route
/timeline, header cohérent avec l'accueil et la carte, CTA retour accueil/carte. - P4.5 - UI frise horizontale MVP : navigation gauche -> droite, cartes événement, scroll/drag horizontal, état vide, responsive propre.
- P4.6 - Détail événement : année, titre, texte long, image optionnelle, tags, lieux liés, CTA "Voir sur la carte".
- P4.7 - Admin chronologie : créer / éditer / supprimer / réordonner les événements, gérer visibilité, aperçu rapide.
- P4.8 - Lien frise -> carte : ouvrir la carte sur un lieu ou groupe de lieux liés depuis un événement.
- P4.9 - Lien carte -> frise : depuis un lieu, afficher plus tard les événements historiques liés dans un panneau ou une section dédiée.
- P4.10 - Filtres chronologie : époque, région, faction, type d'événement, recherche texte.
- P4.11 - QA chronologie : accessibilité clavier, performances, mobile/tablette, validation des contenus et tests navigateur ciblés.
- Page dédiée : meilleure lisibilité, plus de place pour une vraie frise horizontale, plus simple à rendre premium et responsive.
- Décision recommandée : construire la version complète sur page dédiée, puis ajouter un point d'entrée compact sur la carte.
- MVP recommandé : année + titre + texte + image optionnelle + lieux liés + bouton "Voir sur la carte".
- Séparer l'administration en trois panneaux dédiés : accueil, chronologie et carte, pour éviter de tout piloter depuis le panneau admin de la carte.
- Constat actuel : l'admin carte concentre encore trop de responsabilités transverses (carte, accueil, frise), ce qui nuit à la lisibilité et à la maintenabilité.
- Cible produit : un panneau admin par surface fonctionnelle, accessible depuis la page concernée, avec auth/rôles mutualisés mais périmètres clairement séparés.
- Décision d'architecture : conserver une base UI/admin mutualisée quand c'est pertinent, mais découper les entrées, états et handlers par domaine (
home,timeline,map). - P5.1 - Cadrage fonctionnel : périmètres définis pour éviter tout recouvrement flou entre accueil, chronologie et carte.
- Inventaire actuel : le panneau admin de
/mapcontient aujourd'huiStatut,Actions,Accueil,Chronologie,Disponibilites joueurs,Live,Alertes de validationetTélémétrie / erreurs. - P5.1.a - Admin accueil : hero, CTA, liens sociaux, blocs communauté, textes, visuels, mises en avant, support/dons, footer, patch notes et configuration éditoriale de
/. - Décision P5.1.a - Le futur panneau admin accueil reprend l'actuelle section
Accueildu panneau carte, sans logique lieux/carte/temps réel. - P5.1.b - Admin chronologie : méta de
/timeline, événements, périodes, médias, tags, lieux liés, ordre, visibilité et aperçu rapide de la frise. - Décision P5.1.b - Le futur panneau admin chronologie reprend l'actuelle section
Chronologiedu panneau carte, sans outils runtime de la carte. - P5.1.c - Admin carte : lieux, annotations, quêtes, groupes JDR, couches, assets, disponibilités, live metrics, validation et télémétrie, c'est-à-dire tout ce qui reste opérationnellement lié à l'expérience carte ou au pilotage en jeu.
- Décision P5.1.c - En l'absence d'un 4e panneau "ops",
Gestion utilisateurs,Gestion groupes,Disponibilites,Live,AlertesetTélémétrierestent rattachés à l'admin carte pour cette phase. - Règle P5.1 - Aucun écran admin ne doit éditer des données dont il n'est pas propriétaire : pas d'édition accueil depuis
/map, pas d'édition frise depuis/map, pas d'édition lieux depuis/ou/timeline. - Règle P5.1 - Auth, permissions, feedback de sauvegarde, conventions visuelles et composants de formulaire peuvent rester mutualisés entre les trois panneaux.
- P5.2 - Points d'entrée UI : accès admin dédié sur l'accueil et sur la page chronologie, avec deep link vers la bonne section du panneau admin carte en attendant la séparation complète.
- P5.3 - Isolation des états front : la carte ouvre désormais le panneau admin avec un scope explicite (
map,home,timeline) et ne précharge plus l'état accueil/chronologie hors du contexte demandé. - P5.4 - Isolation des handlers front : la logique admin
accueiletchronologieest maintenant regroupée dans des modules dédiés,uiControllergardant seulement l'orchestration du panneau et des wrappers de transition. - P5.5 - Base UI mutualisée : un socle partagé gère maintenant les patterns UI communs des admins (
status, erreurs inline, disable des champs, boutons reload/save), prêt à être réutilisé par les trois panneaux. - P5.6 - API / persistance accueil : l'admin accueil pointe maintenant vers un endpoint dédié
/api/admin/home-config, adossé à la même persistanceassets/site-config.json, avec compatibilité transitoire conservée sur l'ancien endpoint générique. - P5.7 - API / persistance chronologie : l'admin chronologie pointe maintenant vers un endpoint dédié
/api/admin/timeline-config, adossé à la même persistanceassets/timeline.json, avec alias legacy/api/admin/timelineconservé pendant la transition. - P5.8 - Recentrage admin carte : l'accueil et la chronologie ont maintenant leurs panneaux admin dédiés sur
/et/timeline, les anciens deep links sont redirigés vers ces panneaux, et les sectionsAccueil/Chronologieont été retirées du panneau admin carte. - P5.9 - Navigation admin cohérente : intitulés harmonisés (
Admin accueil,Admin chronologie,Admin carte), raccourcis croisés ajoutés dans les trois surfaces, et compatibilité conservée pour les anciens liens vers/map/?adminSection=.... - P5.10 - QA et non-régression : tester l'ouverture/fermeture, les sauvegardes, les permissions et les parcours admin sur les trois surfaces.
- Couverture Playwright etendue sur les parcours admin/invite, les redirections legacy, les raccourcis croises et les sauvegardes home/timeline mockees.
- Ordre recommandé :
- Phase 1 : cadrage des périmètres + inventaire des sections admin existantes.
- Phase 2 : créer les points d'entrée accueil/chronologie et la base UI mutualisée.
- Phase 3 : brancher le panneau admin accueil.
- Phase 4 : brancher le panneau admin chronologie.
- Phase 5 : nettoyer et recentrer le panneau admin carte.
- Phase 6 : QA complète et polish.
- Couverture UI complete relancee sur Chromium et Firefox, avec verrouillage des fermetures clavier, du retour focus au declencheur, du scroll lock et du comportement fullscreen des panneaux admin dedies.
- Recentrer les fiches lieux sur une structure claire :
descriptioncourte,lorelong,histoirelongue. - Cesser d'utiliser
description,loreethistoirecomme zones interchangeables dans l'édition des lieux. - Définir
descriptioncomme résumé court officiel affiché dans la carte et les aperçus. - Définir
lore/histoirecomme sources narratives principales pour générer ce résumé. - Ajouter dans l'admin lieu un bouton
Generer la descriptiondepuislore/histoire. - Utiliser une assistance IA pour proposer une description courte, homogène et non hallucinée.
- Conserver une validation humaine systématique : la description générée reste éditable avant sauvegarde.
- Empêcher l'écrasement silencieux d'une description existante sans confirmation explicite.
- Définir un format cible pour la génération : 2 a 4 phrases, ton neutre, informatif, sans invention.
- Clarifier l'UI admin avec aide contextuelle sur le rôle de chaque champ narratif.
- Prévoir un mode
Regenereret un modeAmeliorer la description existante. - Tester la cohérence sur plusieurs lieux aux fiches hétérogènes avant généralisation.
- Dans modifier un lieu et Creer un lieu, pour Type, ajouter l'aperçu de chaque icone
- Possiblités de pouvoir peindre sur la carte de manière éphémère pour dessiner des schémas, créer des routes, instruction etc
- Carte chronologique (replay des lieux/événements).
- Partage/Export (JSON + capture visuelle).
- Marqueurs évolutifs (temps/événements).
- Markers thématiques/stylés par type + légende.
- Quêtes interactives avec états visuels et transitions.
- Narateur audio
- Polish UI
- Modularisation fine de
UiControlleret nettoyage des artefacts legacy. - Harmonisation encodages (UTF-8) & lint assets. :contentReference[oaicite:7]{index=7}
- Fiabiliser le compteur Discord automatique de l’accueil (invite/widget/API) avec fallback propre.
- Automatiser les patch notes de l’accueil depuis GitHub ou l’historique git de production.
- Polish UI
- Domaine :
https://cartehesta.dannytech.fr - Front : fichiers statiques servis par Nginx depuis
/srv/cartehesta/app(où se trouveindex.html). - API Node (PM2) :
carte-apiécoute 127.0.0.1:4173. - Proxy Nginx :
/api/*→http://127.0.0.1:4173/api/*(JSON + SSE)/auth/*→http://127.0.0.1:4173/auth/*(OAuth, sessions)
- HTTPS : Let’s Encrypt (Certbot), Nginx TLS.
Arborescence serveur (prod)
/srv/cartehesta/app ├── index.html ├── js/ ... # front ├── assets/ # images, audio, JSON (déployés) ├── server/ # routes Express /auth, /api, utils ├── .env # variables prod (voir plus bas) └── (pm2) process: carte-api
Fichier : /srv/cartehesta/app/.env
env
NODE_ENV=production HOST=127.0.0.1 PORT=4173 BASE_URL=https://cartehesta.dannytech.fr ORIGIN=https://cartehesta.dannytech.fr
SESSION_SECRET=xxxxxxxxxx COOKIE_NAME=sid COOKIE_SECURE=true COOKIE_SAMESITE=lax SESSION_TTL_MS=43200000
DISCORD_CLIENT_ID=xxxxxxxxxx DISCORD_CLIENT_SECRET=xxxxxxxxxx DISCORD_REDIRECT_URI=https://cartehesta.dannytech.fr/auth/discord/callback DISCORD_SCOPES=identify DISCORD_ADMIN_IDS=1172705521317449809
⚠️ Après toute modification du.env:cd /srv/cartehesta/app && pm2 restart carte-api --update-env && pm2 save
Fichier : /etc/nginx/sites-available/cartehesta.conf (symlinké vers sites-enabled/)
nginx
server { listen 80; listen [::]:80; server_name cartehesta.dannytech.fr; return 301 https://$host$request_uri; }
server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name cartehesta.dannytech.fr;
root /srv/cartehesta/app; index index.html;
location ^~ /node_modules/ { deny all; }
location /assets/ { try_files $uri =404; } location /js/ { try_files $uri =404; } location /css/ { try_files $uri =404; } location /images/ { try_files $uri =404; }
location / { try_files $uri $uri/ /index.html; }
location /api/ { proxy_pass http://127.0.0.1:4173/; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_buffering off; proxy_cache off; proxy_set_header Connection ""; proxy_read_timeout 1h; }
location /auth/ { proxy_pass http://127.0.0.1:4173/; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_buffering off; proxy_cache off; proxy_set_header Connection ""; proxy_read_timeout 1h; }
ssl_certificate /etc/letsencrypt/live/cartehesta.dannytech.fr/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/cartehesta.dannytech.fr/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; }
Reload :
sudo nginx -t && sudo systemctl reload nginx
-
Tu travailles en local (VS Code + Git).
-
Commit & push sur
main→ GitHub Actions déclenche :- rsync des fichiers vers
/srv/cartehesta/app(exclusions.git,node_modules, etc.) pm2 reloaddecarte-api
- rsync des fichiers vers
-
Le site est à jour en prod.
- Si tu modifies un Lieu via l’éditeur in-app (autorisations Discord requises), l’API écrit en prod dans
assets/locations.json(et médias dansassets/images|audio). - Bon réflexe : périodiquement, pull ou rsync les fichiers prod → local pour garder ton repo aligné (ou ajoute un job “pull-back” si tu préfères).
bash pm2 ls pm2 logs carte-api --lines 200 pm2 restart carte-api --update-env pm2 save
bash curl -i https://cartehesta.dannytech.fr/auth/session curl -i https://cartehesta.dannytech.fr/api/annotations curl -i https://cartehesta.dannytech.fr/api/events/stream
curl -I https://cartehesta.dannytech.fr/js/main.js→content-type: application/javascriptsudo tail -f /var/log/nginx/access.log /var/log/nginx/error.log- Erreur 502 : vérifier que PM2 tourne et que
PORT=4173est correctement proxifié.
ORIGINetBASE_URL=https://cartehesta.dannytech.frCOOKIE_SECURE=true(HTTPS),SameSite=lax- Après modif
.env→pm2 restart carte-api --update-env
bash sudo certbot renew --dry-run
bash
rsync -avz --delete --exclude ".git/" --exclude ".github/" --exclude "node_modules/"
./ debian@:/srv/cartehesta/app/
ssh debian@ "cd /srv/cartehesta/app && pm2 restart carte-api --update-env && pm2 save"
-
Pas de données/credentials en clair dans le code.
-
JSON validés (
assets/locations.json,assets/types.json) avant merge. -
Test manuel post-déploiement :
- carte s’affiche (200 sur
index.htmletmain.js), /auth/sessionretourne l’objet user si connecté (sinon{authenticated:false}),/api/annotations200 (JSON),/api/events/stream200 (flux texte “event: …”).
- carte s’affiche (200 sur
- Backlog / idées :
ROADMAPbackup,idees.txt - Données :
assets/locations.json,assets/types.json - Tests :
tests/,test-results/(legacy) - Historique et chantiers : cf. sections 1 & 2 de ce fichier.