Repository navigation
Spécifications
Codex edited this page Oct 15, 2026
·
51 revisions
| Document | Contenu |
|---|---|
| Vue d'ensemble (ci-dessous) | ce que fait le site, fonction par fonction |
| Filigrane et EXIF | spécification détaillée : exigences, conception, critères d'acceptation |
| Preuves et droits | preuve d'antériorité (empreinte, horodatage RFC 3161) et mentions de droits IPTC, page /droits
|
| PLAN.md | plan de réalisation par phases, choix techniques |
Source : docs/specs/ dans le dépôt (cette page en est une copie).
| Id | Fonction |
|---|---|
| P1 | Ouverture plein cadre : diaporama en fondu des photos choisies dans les réglages (8 au plus, dans l'ordre choisi ; à défaut les 5 premières), vignettes, glissé sur mobile, bouton pause (WCAG 2.2.2), arrêt si l'animation est réduite. |
| P2 | Filtre « deux regards » : les deux, Sébastien ou Julien, avec le nombre de photos de chacun. |
| P3 | Index des séries en grand, avec aperçu au survol ; une série vide n'est pas cliquable. |
| P4 |
Grille en quinconce, numérotation N°04 · Rue · J. |
| P5 | Filtres combinables, URL partageables (/auteur/julien, /serie/rue, /?regard=…&serie=…), sans rechargement avec JS, et fonctionnels sans JS. |
| P5b |
Ordre de la galerie : « Sélection » (ordre de la photothèque, défaut) ou « Plus récentes » (?ordre=recentes, date de première publication décroissante, colonne published_at posée par déclencheur SQLite) ; se cumule avec les filtres, suivi par la visionneuse (précédente, suivante, retour) ; URL canonique sans l'ordre. Photos publiées avant la migration 009 : date d'import. |
| P6 |
Visionneuse /photo/<adresse> : fond noir, précédente et suivante dans le filtre actif, clavier (← → Échap), glissé, légende, lieu et date. ; légende longue repliée à 3 lignes avec « Lire la suite » (la page défile, aucun défilement intérieur), titres longs coupés à la ligne. |
| P7 |
Retour à la série à l'endroit quitté : Fermer et Échap font un vrai retour arrière quand on vient de la galerie (le navigateur rend la position) ; précédente et suivante remplacent l'entrée d'historique (location.replace), si bien qu'un seul Retour ramène à la galerie ; la dernière photo vue est ramenée à l'écran. Mémoire de l'onglet (sessionStorage, 3 h) ; sans elle, liens simples. |
| P8 | Pages À propos (accroche, texte, auteurs) et 404. |
| P9 |
Droits d'utilisation en français (/droits), anglais (/en/droits) et allemand (/de/droits) : langue déclarée, sélecteur de langue, liens hreflang, présence dans sitemap.xml ; lien en pied de page de tout le site. |
| P10 |
Mesure d'audience anonyme : pages et photos vues, visiteurs par jour, provenance (nom de domaine seul) ; sans cookie, sans script, sans service tiers, sans IP conservée ; robots, admins connectés, DNT / Sec-GPC, préchargements et 404 non comptés ; compteurs effacés après 25 mois ; pays (code transmis par Cloudflare, en-tête CF-IPCountry, cru seulement derrière le proxy de confiance ; « XX » sinon), compté par visiteur unique du jour. |
| P11 | Open Graph et URL canonique absolus ; robots.txt et sitemap.xml ; polices auto-hébergées ; aucune ressource tierce. |
| P12 |
Page « Carte » (facultative, désactivée par défaut, case dans Site public) : mappemonde aux couleurs du thème (fond Natural Earth embarqué, sans service de carte : 1:110m pour le monde entier, 1:50m au premier zoom, puis tuiles 1:10m de la zone visible au-delà de × 8, jusqu'à × 40 ; frontières), vignette ronde de la photo à l'emplacement de sa ville, nombre de photos par ville, vignettes proches regroupées ; zoom (boutons, pincement, Ctrl + molette) et déplacement ; liste des lieux sous la carte ; seulement les photos publiées cochées « Afficher sur la carte » ; non publiée : introuvable (404) pour les visiteurs, aperçu pour les auteurs connectés, absente du menu et de sitemap.xml ; crédit GeoNames sur la page. |
| P13 |
Trois langues : français à la racine, anglais à /en/…, allemand à /de/… ; textes de l'interface traduits dans le code (aucune traduction automatique), dates et noms de pays localisés ; textes des auteurs traduisibles (accroche, introduction, À propos, biographies, séries, titres, légendes et lieux des photos), repli de-fr-en, en-fr-de, fr-en-de ; sélecteur (drapeau et code) au bout du menu et sur la page photo, qui ouvre la même page dans l'autre langue et retient le choix (cookie langue, seul cookie du site, posé seulement à ce moment-là) ; arrivée sur une page française : langue choisie, sinon pays (Cloudflare) puis langue du navigateur (pays francophones : français ; Allemagne, Autriche, Liechtenstein : allemand ; Belgique, Suisse, Luxembourg, Canada : navigateur ; ailleurs : anglais) ; robots, aperçus de liens et adresses /en, /de jamais redirigés ; hreflang et x-default, sitemap.xml avec les trois langues. |
| P14 |
« Je vous ai photographié » (/bonjour, /bonjour/<réf>, trois langues, noindex, hors menu) : référence de la carte (préremplie par le QR ; code de contrôle HMAC à 3 caractères = carte vérifiée) ou date, lieu et détail ; recevoir la photo, accepter (site, Instagram, expositions et tirages, prénom ; nom et e-mail exigés) ou refuser la publication (anonyme possible), message ; dernier choix gagnant, historique gardé ; /bonjour/<lettre> : QR générique d'un photographe (vêtements), demande attribuée à l'auteur ; 8 demandes par heure et par adresse, champ piège ; aucun e-mail envoyé. Photo offerte (/pour-vous/<jeton>) : lien privé de 30 jours, page dans la langue de la personne, JPEG 2048 px (jamais l'original), noindex, no-store, page « expiré » (410). |
| P15 |
Confidentialité (/confidentialite, trois langues, pied de page, sitemap.xml) : responsables conjoints et contact réglable, traitements, durées, destinataires, cookies, sécurité (deux facteurs, disques chiffrés : annoncés une fois cochés), droits, CNIL ; durées automatisées (photo de repère 6 mois, accords et refus 5 ans après la dernière photo liée, originaux supprimés effacés des sauvegardes après 90 jours). |
| P17 |
Chiffrement des données personnelles (DATA_KEY) : champs des rencontres chiffrés dans la base (AES-256-GCM), données existantes chiffrées au démarrage, état affiché ; documents RGPD dans le wiki. |
| P18 |
Mentions légales / Impressum (/mentions-legales, trois langues, /impressum et /legal-notice y renvoient, pied de chaque page, sitemap.xml) : éditeurs, adresse postale, contact, responsable (§ 18 MStV en allemand), hébergement et Cloudflare, renvois droits et confidentialité ; renseignements dans Droits & confidentialité, signalés dans « Aujourd'hui » tant qu'incomplets. |
| P19 |
J'aime et signaler (page photo) : cœur anonyme avec compteur visible, retirable (navigateur : stockage local ; serveur : un « j'aime » par adresse et par photo, gardé en mémoire 12 h, jamais en base ; 120 par heure ; refusé depuis un autre site) ; « Signaler » (/photo/<adresse>/signaler, trois langues) : inappropriée, suggestion pour le texte, autre, message et e-mail facultatif chiffrés, piège à robots, 5 par heure, effacés après 12 mois, renvoi vers /bonjour pour qui se reconnaît ; admin : « Signalements des visiteurs », tâche dans « Aujourd'hui », « j'aime » dans l'Audience de la fiche (migration 026). |
| P20 |
Recherche par mots-clés (/recherche, trois langues, lien « Rechercher » dans le menu — une loupe sur téléphone —, réglable dans Site public, activée par défaut) : parmi les photos publiées, dans les titres, légendes, lieux, villes et régions, séries, photographes et mots-clés des fiches, dans toutes les langues ; sans accents ni majuscules, début de mot, tous les mots ; le titre pèse plus que la légende ; pages de résultats noindex ; statistiques : la page seulement, jamais les mots cherchés ; mots-clés de la fiche (séparés par des virgules, 30 au plus, relecteur compris) affichés sous la légende si le réglage le demande, chacun menant à la recherche (migration 036). |
| P21 |
Voyages publics (/voyages, /voyage/<adresse>, trois langues, lien « Voyages » dans le menu dès qu'un voyage publié a une photo publiée ; aperçu noindex pour l'équipe ; sitemap.xml) : grande photo, nom, dates, photographes, texte ; carte cadrée sur le voyage (fond Natural Earth, tuiles détaillées si le cadrage est serré), itinéraire en courbes, une pastille numérotée par étape (jours consécutifs au même endroit réunis ; lieu du jour : ville la plus fréquente de ses photos publiées), encarts de date placés sans chevauchement avec trait de rappel, clic vers le jour ; récit jour par jour avec les photos publiées ; carte glissante sur téléphone. |
| P22 | Carte de la page d'une photo : si sa fiche coche « Afficher sur la carte du monde », petite carte cadrée sur sa ville (fond Natural Earth, tuiles détaillées), vignette de la photo et pastilles des autres photos « sur la carte » à moins de 250 km (une par ville, avec son nom, lien vers la photo) ; rangée « À proximité » (les plus proches, ville et distance) ; seule la ville est connue ; lien vers la carte du monde si elle est publiée ; trois langues. |
| P20 |
Partager (page photo) : bouton à côté du cœur ; sur téléphone (pointeur tactile et menu de partage disponible), le menu de partage du téléphone (Instagram, Signal, Messages…) ; sinon une fenêtre (<dialog>, feuille en bas de l'écran sur téléphone) : aperçu, WhatsApp, Facebook, Bluesky, X, Pinterest, E-mail (simples liens, aucun script tiers, aucun cookie), « Voir sur Instagram » si la photo a été postée depuis le site, lien à copier, QR (ordinateur), « Plus… » vers le menu du téléphone ; sans JavaScript, page /photo/<adresse>/partager ; on partage la page, jamais le fichier. Partages comptés sans rien savoir du visiteur (nombre par photo, moyen et jour ; refusés depuis un autre site ; 60 par heure ; scans du QR via ?partage=qr), affichés dans Statistiques et l'Audience de la fiche (migration 028). Aperçus de liens : og:description et grande carte (twitter:card). |
| P16 |
Droits des personnes : sur /bonjour, demande de copie ou d'effacement de ses données (adresse exigée pour une copie), échéance d'un mois dans l'admin ; export ZIP (données lisibles, historique, signature, images, photos liées en JPEG 2048 px, mode d'emploi dans sa langue) ; effacement (photos comprises sur demande ; refus gardé sans identité si des photos liées restent) ; rappel des posts Instagram à retirer. |
| Id | Fonction |
|---|---|
| A1 |
Connexion OIDC (Zitadel), rôle admin, déconnexion côté site et IdP ; connexion locale de test hors production. |
| A2 |
Aujourd'hui (tableau de bord) : À faire trié par urgence (urgent ✕ : demandes d'accès ou d'effacement avec leur échéance d'un mois, refus dont des photos liées sont encore publiées ; bientôt ▲ : refus dans une sortie avec des photos publiées ni liées ni exclues, nouvelles personnes, Instagram en échec ou en pause ; plus tard ○ : photos à finir, publiées sans ville, titres sans traduction, preuves en erreur), chaque ligne menant à l'écran qui la règle, urgences comptées dans le menu ; photothèque filtrable par ce qui manque (?manque=ville, ?manque=traduction) ; photos à finir, ouverture, chiffres, rythme d'import, preuves, compte connecté et son sub. |
| A3 | Photothèque : planche contact, inspecteur (une photo modifiée champ par champ, plusieurs photos classées, datées ou publiées d'un coup), sélection multiple, loupe, palette ⌘K, classement par glisser vers une série, annulation (⌘Z), recherche et filtres, suppression confirmée ; mode clair / sombre de l'admin. |
| A4 | Import : envoi photo par photo avec suivi du traitement, photos en brouillon, date de prise de vue reprise de l'EXIF, titre provisoire tiré du nom de fichier ; puis Compléter et publier le lot (champ par champ ou d'un coup, sans JS aussi). |
| A5 | Fiche photo : édition validée, publication, ordre, filigrane par photo, preuve d'antériorité, Instagram, audience de la photo. |
| A6 | Séries : cartes avec couverture, création en tête, renommage, adresse, ordre (glisser ou clavier) ; supprimer une série non vide déplace ses photos vers une autre. |
| A7 |
Photographes (/admin/auteurs) : nom, adresse, bio, lettre des cartes, lien avec le compte de connexion. |
| A8 |
Site public (/admin/site : nom du site, textes, ouverture, carte du monde) et Droits & confidentialité (/admin/droits), chaque page n'enregistrant que ses champs ; /admin/reglages redirige vers Site public : nom du site, accroche, textes, à propos ; textes des droits en FR / EN / DE (le texte par défaut est affiché, « Rétablir le texte par défaut », un texte inchangé reste « par défaut ») et contact ; photos de l'ouverture (ordre, 8 au plus, vignettes en cadre 3:2, photo entière). |
| A9 | Filigrane et EXIF : voir Filigrane et EXIF. |
| A10 | Preuves d'antériorité : empreinte et horodatage de chaque original, téléchargement et vérification de la preuve. |
| A11 | Apparence : thèmes (Atelier, Nicephos nuit et jour), aperçu réservé aux admins, emblème, icône et logo complet transformés en masque coloré par le thème, image de partage, sous-titre, favicon. |
| A12 | Statistiques : fréquentation (pages vues, visiteurs), photos les plus vues, pages, provenance ; carte des visiteurs par pays : mappemonde Natural Earth embarquée (aucun service de carte), une bulle par pays (surface proportionnelle), liste des 10 premiers. |
| A13 |
Instagram : connexion d'un compte professionnel (API officielle de Meta), file d'attente publiée à heures fixes, légende tirée d'un modèle, cadre et filigrane par photo. Mise en file automatique par série, désactivée par défaut ; rien ne part sans INSTAGRAM_APP_ID, INSTAGRAM_APP_SECRET et PUBLIC_URL en HTTPS. ; limites de l'API réglables (Prudent par défaut : 25 publications / 24 h, 60 min d'écart, 100 appels / h ; Limites de Meta ; Personnalisé), quota réel lu avant chaque envoi, pause sans essai consommé quand Meta signale une limite, consommation affichée, « Publier maintenant » refusé hors budget avec explication ; likes et commentaires des posts publiés depuis le site relevés chaque matin (historique par jour, même autorisation que la publication), affichés dans la fiche (courbe) et en classement sur la page Instagram, relevé à la demande. |
| A14 | Téléphone (iPhone, Android) : barre d'onglets, inspecteur en feuille ; « Compléter et publier » en cartes (une par photo) ; dans la photothèque, une photo touchée s'ouvre en un toucher (titre ou « Ouvrir la fiche ») ; cibles tactiles d'au moins 44 px. |
| A15 |
Ville des photos (pour la carte du site) : champ Ville avec propositions au fil de la frappe (GeoNames embarqué : toutes les communes de France, localités de plus de 500 habitants ailleurs, noms des villes en français, anglais et allemand, affichés dans la langue de l'admin avec la région, l'État ou la province pour lever les homonymes, server/geo/regions.tsv ; nom de la ville dans la langue de la page sur la carte du site), ville proposée d'après le GPS de l'original à l'import et pour les photos existantes (jamais d'écrasement d'un choix manuel) ; seule la ville est gardée, jamais la position exacte ; case « Afficher sur la carte » décochée par défaut, actions groupées annulables. |
| A17 |
Traductions : sous les champs concernés (Réglages, fiche photo, séries, auteurs), version anglaise et allemande repliée et facultative, avec son état (facultatif, 1 langue sur 2, traduit) ; gardées lors des modifications partielles (photothèque, lot) ; Proposer une traduction : serveur LibreTranslate de la pile (TRANSLATE_URL, aucun texte ne quitte le serveur, 0 €), proposition insérée dans le champ, à relire, annulable ; sans TRANSLATE_URL, pas de bouton. |
| A19 | Accord par session : un accord couvre les photos du photographe prises le jour de la session (date EXIF, date de session corrigeable), exclusions photo par photo ; fiche photo « Personnes rencontrées » (même session ou liées, visage, usages acceptés) ; refus ciblé sur les photos liées ; visage de la personne (app ou fiche), gardé avec l'accord. |
| A20 |
Instagram suit les accords : Instagram suppose le site (formulaires /bonjour, app, carte : refusé sans le site ; ancien accord lu sans Instagram) ; une photo dont une personne liée, ou de la session non exclue, refuse ou n'a pas accepté Instagram est bloquée pour Instagram, sans confirmation possible : ajout à la file refusé, file vidée à chaque changement d'accord et avant chaque créneau (échec expliqué, « Réessayer » refusé), contrôle juste avant l'envoi ; fiche photo « Instagram bloqué » et « Pas sur cette photo » (exclusion de la session). |
| A21 |
Parcours de l'admin : barre latérale en groupes (Aujourd'hui ; Travailler : Photothèque, Personnes ; Publier : Site public, Séries, Instagram, Statistiques ; Sur le terrain ; Réglages : Photographes, Apparence, Filigrane & EXIF, Droits & confidentialité, Aide) ; vocabulaire fixe (photographe, sortie, personne, accord, carte d'accord, carte du monde) ; page Sur le terrain (/admin/terrain : app Rencontre, cartes d'accord et réserve de cartes numérotées, QR des vêtements avec le logo, liste de contrôle : fin de connexion, cartes, e-mail) ; états lisibles par un daltonien : forme et mot (✓, ▲, ✕) en plus de la couleur, palette bleu / jaune / vermillon (Okabe-Ito) dans l'admin et l'app. |
| A22 |
Sorties (/admin/sorties) : une par photographe et par jour (dates EXIF des photos, dates des rencontres), créées d'elles-mêmes ; liste (lieu, vignettes, photos et publiées, visages, accords, refus, sans décision, état ✕ refus à appliquer / ▲ à trier / ✓ terminée, filtres) ; fiche (photos avec heure et personnes liées, actions groupées : lier à une personne, personne de la sortie n'y figure, rétablir ; personnes ; lieu proposé puis modifiable) ; découpage à une heure (table outings, migration 021), heure de prise de vue lue dans l'EXIF (taken_time, anciennes photos lues une fois au démarrage) ; l'accord ne couvre que sa partie de journée, photo ou rencontre sans heure : toutes les parties ; liens depuis les fiches rencontre et photo. |
| A23 |
Visages et état des photos : détection des visages sur le serveur (YuNet, OpenCV Zoo, MIT ; ONNX Runtime), à l'import et une fois pour les anciennes photos, seulement le nombre et les cadres (migration 022) ; correction à la main ; état par usage (site, Instagram) : ✓ prête, ▲ à vérifier (confirmation explicite gardée dans photo_confirmations, valable pour ses raisons), ✕ bloquée ; personnes concernées : liées, et de la sortie si visage ; bande d'état de la fiche, pastilles et filtres de la photothèque, état dans la sortie et « Publier les photos prêtes », « Aujourd'hui » ; publication en un clic, actions groupées et lot : photos prêtes seulement ; Instagram : bloquée jamais, à vérifier sur confirmation. |
| A24 |
Fiche photo en rubriques (Infos, Où, Diffusion dans le formulaire ; Personnes & accords, Instagram, Audience, Preuve), repliables avec résumé, ouvertes d'elles-mêmes quand il y a à faire, ouvertes par un lien d'ancre ; accueil Terrain de l'app (/admin/rencontre/accueil, départ du manifeste, onglet Terrain de la barre du téléphone) : nouvelle rencontre et prochaine référence, mon QR (composition des vêtements, /admin/rencontre/qr), ma sortie du jour (personnes du jour, visage, décision), admin complet. |
| A25 |
Revue de code et de sécurité (octobre 2026) : /bonjour sans code ne modifie jamais une rencontre établie (refus appliqué, droits signalés, reste dans l'historique) ; accord en ligne sans code « non vérifié » (photo à vérifier) ; raisons gardées sans nom (référence seule) ; lieu de sortie jamais repris d'une rencontre ; annulation et actions groupées passées par le contrôle (brouillons seulement, confirmation qui couvre les raisons) ; photo en ligne confirmable sans dépublier ; refus de sortie et état « refus » limités aux photos avec visage ou liées ; détection : modèle indisponible = rien d'écrit (retenté), examens impossibles retentés au démarrage, import et rattrapage sans doublon ; heures saisies validées ; .npmrc : aucun téléchargement d'ONNX Runtime à l'installation. |
| A26 |
Personnes (/admin/personnes, migration 023 : people, encounters.person_id, email_hash, people_distinct) : une personne par rencontre à la création, rapprochement proposé par empreinte d'adresse (HMAC, clé dérivée de DATA_KEY ou des codes de contrôle), confirmé ou écarté à la main, jamais par le visage ; rattacher, séparer ; un accord vaut pour sa sortie, le refus le plus récent s'étend à toutes les rencontres ; ajouter à une sortie, lier des photos (rencontre de la sortie de la photo créée sans décision) ; export et effacement de la personne entière ; app : « Déjà rencontrée ? » (30 derniers jours). |
| A27 |
Signature Instagram du photographe (fiche Photographes, migration 024) : ajoutée aux posts des photos qui ont une légende (variable {signature}, sinon sous la légende), retirable photo par photo dans la section Instagram de la fiche ; jamais sur le site. |
| A28 |
Admin en trois langues (FR, EN, DE) : sélecteur au bout du menu (drapeau et code, comme le site), préférence gardée sur le photographe (authors.admin_lang, migration 025 ; cookie pour un compte sans photographe) ; server/admin-i18n.js (t(texteFrançais, variables)) et dictionnaires server/admin-i18n/*.json ; vues, messages, textes calculés (tâches, raisons, sorties), JavaScript de l'admin et de l'app ; dates et mois dans la langue choisie ; l'aide reste en français (signalé) ; la partie de l'app destinée à la personne garde sa langue ; test de couverture : chaque t('…') a sa version EN et DE ; messages d'erreur (validations, refus de droit, erreurs des modules) et messages composés ou enregistrés (Instagram, e-mail, preuves, imports) traduits à l'affichage (t.msg, reconnus d'après les clés à variables). |
| A29 |
Aide traduite : docs/aide/en/ et docs/aide/de/ (mêmes titres dans le même ordre que le français, vérifié par un test), servie dans la langue de l'admin avec les ancres françaises (liens de l'admin inchangés) ; wiki : pages « Help-… » et « Hilfe-… » générées avec leurs liens internes recalculés. |
| A30 | Retours d'ergonomie (octobre 2026) : fiche photo sur grand écran, rubriques du bas (personnes, Instagram, audience, preuve) dans la colonne de l'aperçu ; vue rapide : enregistrement automatique annoncé ; cadre Instagram par défaut « Recadrage (sans bordure) » ; « Enregistrer » gardé (terme standard). |
| A31 | Série proposée (désactivée par défaut) : page Séries, « Allumer les propositions » télécharge une fois le modèle CLIP (ONNX allégé, ≈ 90 Mo, SHA-256 vérifié) dans le dossier des données, puis analyse les photos en tâche de fond (progression affichée) ; chaque import analysé aussitôt. Un brouillon dont la série n'a pas été choisie à la main (vue rapide, fiche, glisser, action groupée, « Garder ») reçoit la série dont les photos rangées (choisies ou publiées, des deux photographes) lui ressemblent nettement plus que la sienne, deux si elles sont presque à égalité, à partir de 3 photos par série. Marquée ✦ et en pointillés : vignette, filtre « ✦ Série proposée », vue rapide (« Classer dans… », « Garder… »), fiche (« Choisir », photos voisines), sortie, ligne dans Aujourd'hui ; une photo à la fois. « Éteindre et effacer » supprime modèle et empreintes ; l’empreinte disparaît avec la photo (migration 027). |
| A32 |
Rôles et permissions, étape 1 (socle) : catalogue de permissions par domaine (server/permissions.js), certaines avec une portée « tout » ou « les miennes » ; quatre rôles (Administrateur, Photographe, Modérateur, Relecteur) ; chaque route d'admin déclare sa permission (démarrage refusé sinon), contrôle fermé par défaut, vérification par action dans les routes à plusieurs actions ; refus 403 en HTML ou JSON. Tous les comptes restent administrateurs (aucun changement visible). Étapes suivantes : comptes et rôles en base, portée « les miennes », interface selon les droits, rôles sur mesure. |
| A33 |
Rôles et permissions, étape 2 (comptes, rôles, journal) : table des comptes (identité, nom, e-mail, rôles, photographe lié, état actif / en attente / désactivé) ; anciens liens Photographe ↔ compte repris en administrateurs ; première connexion : administrateur si l'IdP transporte le rôle « admin », sinon « en attente » sans session (ligne dans Aujourd'hui ; jamais traité, effacé après 90 jours ; une décision d'administrateur n'est ni contredite par l'IdP ni purgée) ; rôles relus à chaque requête (effet immédiat) ; page « Comptes et rôles » (identifiant sub affiché, rôles, photographe lié, désactiver, supprimer) avec garde-fous (au moins un administrateur actif, pas soi-même, ADMIN_SUBS toujours administrateurs) ; rôle Photographe pas encore proposé ; lien compte ↔ photographe retiré de la fiche Photographe ; Journal en base (connexions, actions, comptes modifiés avec le détail ; 13 mois ; filtres) ; menu et barre du téléphone selon les droits ; site public : « admin » = compte avec un rôle, aperçus selon la permission (migration 029). |
| A34 | Rôles et permissions, étape 3 (portée « les miennes ») : rôle Photographe proposé ; pour un compte Photographe, ce qui n'est pas au photographe lié n'existe pas (404 : photos et leurs sous-pages, images de l'admin, rencontres, personnes, sorties, QR) ; listes filtrées à la source (photothèque, recherche ⌘K, lot, actions groupées, suivi d'import, sorties, rencontres, personnes, candidates, app Terrain, cartes, Aujourd'hui et son badge, statistiques sans fréquentation du site) ; ni réattribuer une photo, ni importer pour l'autre photographe, ni réordonner la galerie ; une personne partagée n'apparaît qu'avec ses rencontres et ne se modifie que par un administrateur ; tâches d'« Aujourd'hui » selon les droits. |
| A35 |
Rôles et permissions, étape 4 (interface selon les droits) : droits du compte transmis à la page (data-can) ; photothèque (Publier, Dépublier, Supprimer, Importer, glisser pour réordonner, champs série, ville, date, photographe, actions groupées), raccourci P, palette ⌘K (actions et pages), glisser vers une série, propositions de série ; fiche photo : formulaire limité aux textes (/admin/photos/<id>/textes) pour le relecteur, lecture seule et rubrique Publication pour le modérateur (A36), raisons « à vérifier » masquées sans accès aux personnes (une photo à vérifier attend le photographe ou un administrateur), Personnes & accords, Instagram, Audience, preuve, suppression selon les droits ; lot, sortie, rencontre et personne (export, effacement) ; accueil (import) ; aide limitée aux chapitres des pages accessibles. Remarques adressées (taches.adresser) : un modérateur écrit au photographe d'une photo, la remarque apparaît dans son « Aujourd'hui » et sur la fiche jusqu'à « Fait » (photographe de la photo ou qui peut en adresser ; migration 030). |
| A36 |
Circuit de publication (site) (cadrage du 15 octobre 2026) : le photographe propose (fiche, photothèque, toute une sortie), avec un mot facultatif ; accords vérifiés et confirmés par lui à la proposition ; le modérateur valide sur la page « À valider » (par lot) : publier maintenant ou programmer (date et heure de Paris, publication automatique à l'échéance si la photo est toujours prête, sinon renvoyée), renvoyer avec une remarque (il ne retouche pas), dépublier avec la raison ; historique des décisions sur la fiche ; « Aujourd'hui » et e-mail au choix de chacun (photographe et modérateur, adresse réglable) ; réglages par photographe (page « Circuit de publication », circuit.regler) : « publier ses photos sans validation » et « modifier ses photos une fois publiées » ; le modérateur n'a plus photos.textes, le relecteur corrige aussi les photos publiées ; un signalement ne dépublie rien tout seul (migration 031). |
| A37 |
Republier sur Instagram depuis la fiche : post en échec (le dernier de la photo) : « Republier (remettre en tête de file) » pour qui gère la file (instagram.file) ; « Demander la republication » pour le photographe (ses photos, photos.proposer), une fois par échec, rien à demander si la photo est déjà dans la file ; demande visible (▲) dans « Aujourd'hui », l'historique de la page Instagram et la fiche, e-mail à qui gère la file s'il l'a choisi, effacée à la remise en file ; échecs de ses photos dans l'« Aujourd'hui » du photographe (migration 032). |
| A38 |
Page Instagram, nouvelle disposition : en haut, compte, rythme et consommation ; à gauche, la file ; à droite, les photos en échec (Réessayer, demandes de republication) et les 10 dernières publications ; en bas, le journal de la file (mises en file, envois et leurs étapes, publications, échecs, pauses, reprises, demandes ; état par symbole et mot, photo, auteur ou « automatique » ; 90 jours) ; réglages repliés ; « Publier maintenant » suivi sans recharger : envoi en arrière-plan, barre d'avancement par étape (GET /admin/instagram/:id/etat), refus immédiat expliqué, ✓ avec le lien du post ou ✕ avec la raison ; sans JavaScript, le formulaire classique reste (migration 033). |
| A39 |
E-mails et relances : « Comptes et rôles » : état de l'envoi (SMTP_URL, expéditeur) et e-mail de test à l'adresse choisie, erreur du serveur de messagerie affichée ; demandes RGPD (délai légal d'un mois coupé en quarts) : e-mail au photographe concerné dès l'arrivée (même sans préférence e-mail), rappel au quart, rappel à la moitié avec l'administrateur en copie, e-mail prioritaire aux trois quarts, à l'administrateur directement sans photographe joignable ; une seule relance par étape (celle du moment après un arrêt) ; référence de la carte seulement ; arrêt à « traitée » ; récapitulatif de « Aujourd'hui » réglé par chacun (jamais, chaque jour, chaque semaine le lundi), vers 8 h, jamais plus d'un par jour, seulement s'il y a quelque chose ; e-mails dans la langue de l'admin du photographe ; vérification toutes les heures (migration 034). Lettre d'information : plus tard. |
| A40 |
Circuit Instagram : le photographe propose une photo publiée sur le site pour Instagram depuis sa fiche (cadre, filigrane, signature, légende, aperçu exact, un mot ; accords vérifiés et confirmés par lui ; mise à jour ou retrait tant que rien n'est décidé) ; le modérateur décide sur « À valider » (section Instagram) : mettre dans la file avec les choix du photographe, ou renvoyer avec une remarque (remarque sur la fiche et dans « Aujourd'hui ») ; « Aujourd'hui », badge, e-mails au choix, journal de la file ; nouveau droit instagram.proposer (photographe, ses photos) ; instagram.file a une portée et se règle photographe par photographe (« Mettre ses photos dans la file Instagram sans validation » : ses photos seulement, l'ordre de la file et « Publier maintenant » restent au modérateur) ; aperçu et légende du modèle ouverts au photographe pour ses photos (migration 035). |
| A41 | Voyages (admin) : des sorties regroupées — journées entières, une journée dans un voyage au plus (la rattacher ailleurs la déplace) ; voyage d'un photographe ou des deux (réglé par qui gère toutes les sorties) ; page « Voyages » (sous Sorties) : créer, liste avec couverture, dates, journées, photos, personnes ; page d'un voyage : journées J1, J2… avec lieu, photos, personnes et lien vers la sortie, rattacher entre deux dates ou en cochant, retirer, toutes les photos avec leur état, proposer ou publier d'un coup les photos prêtes, nom et texte en trois langues, case « Publier la page du voyage sur le site », supprimer (sorties et photos restent) ; sur la page d'une sortie : la rattacher, la changer de voyage, l'en détacher ; voyage indiqué sur la liste des sorties ; portée « les miennes » (migration 037). |
| A42 |
Nouveautés de l'admin : server/nouveautes.json (trois langues, depuis la version 1.79.0 = PR 79 ; version = 1..0, celle de package.json est la version installée) ; fenêtre modale à la connexion suivante une mise à jour, une seule fois, avec toutes les versions arrivées depuis la dernière vue du compte (accounts.seen_release), filtrées selon ses droits ; page et menu « Nouveautés » avec la version installée (migration 038).
|
| A43 |
Mots-clés suggérés (CLIP) : vocabulaire choisi d'environ 130 termes en trois langues (server/vocabulaire.json), empreintes texte CLIP calculées une fois (scripts/vocabulaire.mjs → server/vocabulaire-vecteurs.bin) ; suggestions d'une photo = empreinte image des propositions de séries comparée au vocabulaire (quelques millisecondes, aucun modèle de plus, rien d'inventé), 6 au plus, dans la langue de l'admin, mots déjà présents écartés ; boutons sur la fiche (un clic ajoute, à enregistrer) ; recherche du site : un mot du vocabulaire trouvé dans les trois langues. |
| A44 |
Descriptions suggérées (Florence-2) : désactivées par défaut (page Séries : modèle Léger = base, par défaut, ou Précis = large, refusé si la mémoire du conteneur — SITE_MEM_LIMIT, 3g par défaut — n'atteint pas 6 Go, repli sur Léger si elle baisse ; heures de nuit) ; une phrase courte en anglais par photo, traduite par LibreTranslate si configuré ; la nuit, une à la fois, sur un seul cœur ; une photo demandée depuis sa fiche passe tout de suite ; modèle chargé seulement pendant le calcul, révision Hugging Face fixée, téléchargé une fois dans le dossier des données ; fiche : « Décrire cette photo », « Reprendre comme légende » (jamais automatique), « Décrire de nouveau », suivi sans recharger ; « Éteindre et effacer le modèle » (migration 039). |
| A18 | Rencontres : liste (nouvelles en tête, compteur dans la barre latérale), fiche (personne, historique, photos liées avec propositions du jour, carte signée et sa photo gardée dans la base, statut, « Écrire » par la messagerie), saisie d'une carte papier, lettre des cartes par auteur ; refus : publication impossible (fiche, actions groupées), « Appliquer le refus » dépublie et retire de la file Instagram ; effacement à la demande, purge des demandes sans accord ni refus après 12 mois ; cartes à imprimer (planches A4, paires numérotées avec QR et code de contrôle, ou génériques ; numéros retenus) ; offrir la photo (lien privé, compteurs, message prêt dans la langue de la personne, retrait) ; app Rencontre sur le téléphone (web app installable : position arrondie, photo de repère, consentement en trois langues signé au doigt, majorité ou parent, numéro suivant, écran « Merci » avec QR, récapitulatif envoyé par SMTP ou préparé dans Mail) ; QR des vêtements (compositions verticale avec le logo, logo seul, écusson, QR seul ; encre noire ou blanche ; SVG en tracés ou PNG 300 dpi ; l'écran Sur le terrain n'affiche que la verticale avec le logo). |
| A16 | Messages de confirmation ou d'erreur après chaque action, annulation des actions groupées ; aide en ligne avec un lien « Aide sur cette page » sur chaque écran ; toutes les pages sont utilisables sans JS et au clavier. |
| Id | Règle |
|---|---|
| I1 | Originaux jamais servis ; variantes AVIF et WebP en 640, 1280 et 2000 px, sans agrandissement. |
| I2 | Orientation EXIF appliquée aux pixels et aux dimensions. |
| I3 | Aucune métadonnée par défaut ; mentions IPTC (XMP) dans les modes signés. |
| I4 | Variantes servies seulement pour les photos publiées, en cache long ; leur nom porte l'empreinte des réglages. |
| I5 | Empreinte SHA-256 de chaque original, horodatée RFC 3161 et vérifiable sans le site. |
| Id | Exigence |
|---|---|
| T1 | Sécurité : voir Sécurité (sessions, CSRF, CSP, limites d'import, configuration en ligne). |
| T2 | Accessibilité : focus visible, prefers-reduced-motion, textes alternatifs, alternatives clavier au glisser-déposer, erreurs de formulaire annoncées ; audit axe-core sans violation sur l'admin (clair et sombre, ordinateur et téléphone). |
| T3 | Sobriété : pas de framework front ni de build, images au format et à la taille adaptés, chargement à la demande. |
| T4 | Données : tout l'état dans STORAGE_DIR ; refus de démarrer sans montage en conteneur ; sauvegarde quotidienne de la base et des originaux. |
Utiliser
- Visite de l'admin
- Aide de l'administration · Help (EN) · Hilfe (DE)
- Apparence et thèmes
- Filigrane et EXIF
- Preuves d'antériorité et droits
- Publication sur Instagram
Installer et configurer
Comprendre
Maintenir