diff --git a/docs/LIVRAISONS_PAR_MOIS.md b/docs/LIVRAISONS_PAR_MOIS.md
index 1ae1c25..02a7f90 100644
--- a/docs/LIVRAISONS_PAR_MOIS.md
+++ b/docs/LIVRAISONS_PAR_MOIS.md
@@ -2,138 +2,324 @@
## Janvier 2026 (8 commits)
-- Site public affichant le contenu de la DB + fichiers
-- Formulaire de soumission séparé → écriture en base
-- Première version des contrôleurs TFE (création, édition)
-- Structure initiale du projet : routing, templates, DB SQLite
-- Schéma de base de données (theses, auteurs, formats, langues, etc.)
+### Structure initiale
+- Schéma SQLite : tables theses, auteurs, formats, langues, tags, fichiers
+- Monorepo : organisation en dossiers (formulaire, templates, src, admin)
+- Justfile, .gitignore, documentation (READMEs)
+- Nginx config + déploiement fonctionnel
+- Système de recherche sécurisé
## Février 2026 (29 commits)
-- Formulaire admin + formulaire étudiant (partage)
-- Soumissions étudiant via liens de partage (share links)
-- Système de visibilité : Libre / Interne / Interdit
-- Pages statiques éditables (À propos) → début du CMS
-- Gestion des fichiers uploadés (stockage, affichage)
-- Export CSV des TFE
-- Import CSV des TFE
-- Structure admin : index, navigation, table listant les TFE
-- Base du système de licences (CC2r)
+### Formulaire & soumission
+- Formulaire admin (ajout/édition TFE)
+- Formulaire étudiant via liens de partage (share links)
+- Structure formulaire : champs obligatoires, validation
+- Uploads de fichiers (stockage, affichage)
+
+### Visibilité & accès
+- Système à 3 niveaux : Libre / Interne / Interdit
+- Protection par mot de passe des fichiers « Interne »
+- Authentification admin (login / session PHP)
+
+### Pages statiques (début CMS)
+- Pages éditables : À propos (Markdown → HTML)
+- Templates header/footer, mise en page responsive
+- Cards en grille sur la page d'accueil
+
+### Admin
+- Index admin : liste des TFE, pagination, stats
+- Export / import CSV
+- Navigation admin dynamique
+- CSS admin : composants réutilisables
+
+### Sécurité
+- Auth guard pour le panneau admin
+- Correction des failles HIGH et LOW (TODO.SECURITY.md)
## Mars 2026 (74 commits)
-- Édition / correction / suppression des entrées TFE dans l'admin
-- Récapitulatif admin après soumission
-- Affichage public des TFE (page tfe.php)
-- Moteur de recherche dans le répertoire (par nom)
-- Filtres par orientation, AP, année, langue, finalité
-- Système d'authentification admin (login / mot de passe / session)
-- Protection par mot de passe des fichiers « Interne »
-- Données internes : points du jury, remarques, lien BAIU, exemplaires
-- Colonnes du répertoire : années, orientations, AP, mots-clés, noms
-- Rework CSS majeur (variables, typographie, thème clair/sombre)
-- Intégration HTMX pour les interactions dynamiques
-- Upload de fichiers avec queues JS (avant FilePond)
-- Structure formulaire : champs conditionnels selon les formats
-- PDF obligatoire / optionnel selon les formats
-- Jury (promoteurices, lecteurices) dans le formulaire admin
+### Contrôleurs & architecture
+- ThesisCreateController, ThesisEditController : extraction depuis add.php/edit.php (530 lignes → contrôleurs dédiés)
+- TfeController, SearchController, HomeController : extraction depuis les pages publiques
+- SystemController : unifie status + logs en un onglet système
+- App.php : classe fondation + flash messages unifiés
+
+### Répertoire & recherche
+- Répertoire en 6 colonnes : années, orientations, AP, mots-clés, noms, compte
+- Filtres combinables (AP + mot-clé + orientation simultanément)
+- Filtres HTMX sans rechargement de page, URL partageable
+- Tri matched-first dans les colonnes de filtre
+- Popover étudiant·e (pré-rendu serveur, lazy load)
+
+### Page TFE publique
+- Layout complet : auteur > titre > meta + synopsis > fichiers > jury
+- Jury interne / externe affiché séparément
+- Liens hypertextes vers le répertoire sur les métadonnées
+- Open Graph / Twitter Card meta tags
+
+### Base de données
+- Migrations : superviseurs multi-rôles, tags renommés depuis keywords
+- Vues SQL (v_theses_full, v_smtp_active)
+- WAL mode pour SQLite
+- Index composites (is_published, year) pour la perf
+- Auto-migration au démarrage du serveur
+
+### Sémantique HTML & accessibilité
+- Refactor sémantique complet de toutes les pages publiques
+- Head partagé, nav sémantique, aria-current, skip links
+- Status badges non dépendants de la couleur (WCAG 1.4.1)
+- Autofocus premier champ invalide (WCAG 3.3.1)
+- Sous-titres WebVTT pour vidéos (WCAG 4.1.2)
+- Cibles tactiles 44×44px (WCAG 2.5.5)
+
+### CSS & design
+- Suppression de tous les assets externes (self-hosting)
+- Polices : Combined (titres) → Ductus, corps en BBBDMSans
+- Variables de couleur standardisées
+- Dark mode prefers-color-scheme
+- Header plus dense, recherche pleine largeur
+- Remplacement EasyMDE (333KB) → OverType (118KB)
+- Cache-busting par filemtime
+
+### Admin
+- Pagination serveur (25/page)
+- Tri des colonnes dans l'index
+- Merge status + logs → system.php avec onglets fetch()
+- Paramètres : maintenance + compte
+- Dialogue d'import CSV inline
+- Gestion des fichiers dans l'édition TFE (couverture, TFE, etc.)
+
+### Formulaire
+- Partials de champs de formulaire réutilisables (fieldset-academic, fieldset-metadata, etc.)
+- Jury fieldset partagé add/edit
+- Aide contextuelle Markdown dans le formulaire
+- Mode étudiant simulé dans l'admin (?mode=student)
+
+### Email & SMTP
+- SmtpRelay : client SMTP natif (socket), AUTH PLAIN, TLS
+- Test SMTP, vérification des credentials à la sauvegarde
+- Champs from_name, notify_email
+- Email de notification admin après soumission
+
+### Ops
+- Déploiement : scripts unifiés, justfile
+- Renommage Posterg → XAMXAM (code, nginx, docs)
+- Rate limiting sur les endpoints partage
+- Exclusion du fichier DB et des uploads du rsync
## Avril 2026 (207 commits)
-- Refonte complète des uploads : FilePond remplace les queues custom
-- Architecture d'upload asynchrone FilePond (process/revert/load/remove)
-- Pool unique TFE acceptant tous les formats (vidéo, audio, etc.)
-- Upload de masse avec barre de progression
-- Intégration PeerTube pour vidéos / audio (upload API, embed)
-- Système de brouillon automatique (autosave) pour le formulaire partage
-- Fragments HTMX partagés admin / partage (formats, fichiers, licence)
-- Extraction du JS inline en modules externes (admin-logs, clipboard, pill-search, etc.)
-- Composant pill-search pour mots-clés et langues (autocomplete HTMX)
-- Gestion des mots-clés et langues dans l'admin (rename, merge, delete)
-- TOC sidebar dans les pages admin (IntersectionObserver)
-- Tri des colonnes dans l'index admin (Auteur, Accès, etc.)
-- Liens de partage : nom éditable, expiration, dialogue d'édition
-- Obfuscation des emails en entités HTML (EmailObfuscator)
-- Récapitulatif exhaustif (partage + admin)
-- Champs conditionnels : website URL, annexes, PeerTube vs. upload direct
-- Promoteurices multiples (interne + ULB) avec ajout/suppression dynamique
-- Formulaire mobile responsive
+### Uploads & fichiers
+- **FilePond** remplace les queues custom (495 lignes de JS supprimées)
+- Architecture upload asynchrone : process / revert / load / remove
+- Pool unique TFE (tous formats : PDF, vidéo, audio)
+- Barre de progression d'upload
+- Intégration **PeerTube** : upload API, OAuth2, embed iframe
+- Vidéos/audio auto-upload vers PeerTube quand activé
+- Chiffrement credentials PeerTube + SMTP (AES-256-GCM)
+
+### Fragments HTMX
+- Fragments partagés admin / partage : formats + fichiers, licence, langue-autre
+- Fragments conditionnels selon les formats cochés (Site web → URL, Vidéo → upload ou PeerTube)
+- Aide contextuelle Markdown via HTMX
+- Fragments admin wrappés avec auth guard
+
+### Formulaire
+- Partials de champs unifiés : text-field, select-field, checkbox-list
+- Jury : promoteurices multiples avec ajout/suppression dynamique
+- Jury ULB conditionnel (finalité Approfondi)
+- Annexes : checkbox + fichier conditionnel
- Contact visible / contact interne découplés
-- CC2r renommé (ex-CC4r), restructuration des licences
-- Pages statiques : Charte, Licence, À propos avec TOC sticky
-- Checkboxes admin en auto-save HTMX avec toasts de feedback
-- Backups SQLite automatisés (horaire + quotidien, cron)
-- Déploiement : recettes justfile, vérification permissions, migrations incrémentales
-- Content-Security-Policy, HSTS, SameSite cookies
-- Script de scan passif de sécu (pentest)
-- Chiffrement du mot de passe SMTP (AES-256-GCM)
-- Rate limiting sur les endpoints sensibles
+- CC4r → CC2r renommé
+- Identifiant TFE régénéré automatiquement au changement d'année
+- Validation inline des fichiers (MIME, taille) via HTMX
+
+### Pages statiques CMS
+- À propos, Charte, Licence : Markdown → HTML, édition admin
+- TOC sticky dans la sidebar
+- Contenus-edit : OverType, auto-save, liens sidebar dynamiques
+- Contacts admin : grille 3 colonnes, ajout/suppression
+
+### Accessibilité
+- aria-errormessage, aria-invalid, aria-describedby sur tout le formulaire
+- Cibles tactiles 44×44px minimum (WCAG 2.5.5)
+- Formulaire responsive mobile (colonnes empilées)
+
+### Gestion des données
+- Mots-clés : recherche, rename, merge, delete dans l'admin
+- Langues : recherche, rename, merge bulk, dédoublonnage
+- Tri des colonnes Auteur et Accès dans l'index admin
+- Liens de partage : nom éditable, expiration, dialogue d'édition
+
+### Sécurité
+- Obfuscation des emails en entités HTML (EmailObfuscator)
+- Content-Security-Policy, HSTS, SameSite cookies, COOP/CORP
+- Script de scan passif de sécurité
+- Rate limiting, flash messages sur partage
+- Corrections non-constant-time (hash_equals)
+
+### CSS & refactoring
+- Architecture CSS en couches : reset → colors → typography → base → components
+- Suppression de toutes les classes BEM au profit de sélecteurs sémantiques
+- Tokens de design unifiés (couleurs, typographie, espacement)
+- Échelle fluide utopia pour typographie et espacement
+- Suppression du dark mode, unification des thèmes
+- Extraction de tous les styles inline vers CSS
+
+### Logs & monitoring
+- Logging structuré pour les soumissions admin/partage
+- AdminLogger : JSON-lines
+
+### Ops & déploiement
+- Déploiement automatisé (justfile) : code, dépendances, migrations
+- Vérification des permissions post-déploiement
+- Backups SQLite cron (horaire + quotidien)
+- Merge de toutes les migrations dans schema.sql
+
+### Architecture code
+- Extraction des contrôleurs (create, edit, search, TFE, system)
+- Partials de formulaire réutilisables
+- Dispatcher + front controller (index.php)
+- Configuration externalisée (config/apropos.php → SQLite)
## Mai 2026 (156 commits)
-- FilePond : correction crash « can't access property main », tailles en bytes
-- Fichiers temporaires FilePond survivent au rechargement de page
-- Relink de fichiers orphelins (file browser + FilePond integration)
-- Trash policy : suppression → tmp/_trash avec traçabilité
+### FilePond — corrections & hardening
+- Correction crash « can't access property main, n.status is undefined »
+- Tailles de fichiers en bytes (plus de confusion toInt('1GB') = 1)
+- Fichiers temporaires survivent au rechargement de page (session-track)
+- Guard no-JS : filepond_mode désactivé par défaut, fallback serveur
+- Relink fichiers orphelins (file browser + intégration FilePond)
+- Trash policy : suppression → tmp/_trash avec traçabilité DB
- Storage prefix : theses/ → documents/
-- Recap admin : sections → fieldsets, fichiers en table
-- Extraction de FormBootstrap pour DRY add/edit
-- Système de colonnes thesis_status (two-phase commit lifecycle)
-- Draft autosave avec persistence session (HTMX POST/GET fragments)
-- Guard no-JS file uploads (filepond_mode désactivé par défaut)
-- Accessibilité formulaire : aria-errormessage, aria-invalid, aria-describedby
-- Cibles tactiles 44×44px minimum (WCAG 2.5.5)
+
+### Autosave & brouillons
+- Brouillon automatique formulaire partage (HTMX POST/GET session)
+- Auto-save admin checkboxes avec toasts de feedback
- Nettoyage périodique des brouillons orphelins (cron)
-- Durée TFE : colonnes DB, champs formulaire, affichage XhYm
-- Déploiement : split deploy-code/deploy-deps/deploy-migrate
-- Intégration Monolog : 4 canaux PSR-3 remplaçant 4 systèmes de log
-- Tests PHPUnit : 228 tests, couverture 21,27%
-- Remplacement Parsedown → league/commonmark
-- Remplacement client HTTP custom → Guzzle
-- Remplacement SMTP socket → PHPMailer
-- Composer.json et autoloader
-- Refactor architecture CSS : layers (reset → colors → typography → base → components)
-- Composants CSS dédiés par fichier (links, focus, forms, tables, dialog, etc.)
-- SVG icons inline via helper PHP (icon()) — plus de
pour icônes
-- Style global : liens regular, body light, hover violet, police BBB DM Sans
-- Page TFE : layout auteur > titre > meta + synopsis 2-col > fichiers flex
-- Répertoire : colonnes triées (match first), scrollbars discrètes, pas de chip bar mobile
-- Accordéon mobile pour les filtres du répertoire
-- Détails/summary TOC pour pages statiques (responsive)
-- Contenus-edit : auto-save, toolbar OverType, liens sidebar dynamiques
-- Gestion des contacts admin (grille 3 colonnes, suppression, réindexation)
-- Corrections d'identifiants (year-prefix mismatch), migrations PHP
-- Fix contact_interne / contact_visible (découplage complet)
-- Author name casing (COLLATE NOCASE, idHint lookup)
-- Finalité master affichée sur la page publique TFE
-- Suppression vidéos PeerTube lors de la suppression d'un TFE
-- Nettoyage logs, gitignore vendor/, icône de recherche
-- Build pipeline : biome + rolldown + lightningcss (bundling/minification)
-- Dev-watch avec chokidar-cli (reconstruction live)
-- Gzip activé dans nginx + ~730 lignes de JS inline → 15 fichiers externes
-- Scroll-position memory sur les swaps HTMX du répertoire
-- Correctifs sécu (open redirect, CSRF partage, gate session, verifyCsrf)
-- Biome lint fixes (duplicate CSS, arrow functions)
+- Contenus-edit : auto-save avec debounce, toolbar OverType
+
+### Build & assets
+- **Biome** : linting + formatting CSS/JS
+- **Rolldown** : bundling JS par entrée
+- **LightningCSS** : résolution @import, minification CSS
+- Pipeline build orchestré (build.mjs)
+- Dev-watch avec chokidar-cli (reconstruction ~200ms)
+- dist/ pour les assets minifiés, .gitignore
+
+### Gzip & extraction JS
+- Gzip activé dans nginx
+- ~730 lignes de JS inline → 15 fichiers externes
+- Modules : admin-logs, clipboard, pill-search, access-request
+
+### Tests
+- PHPUnit setup : 228 tests, couverture 21,27%
+- Tests unitaires : Crypto, EmailObfuscator, SystemController, StudentEmail, TfeController
+- Tests intégration : Database, ShareLink, RateLimit
+- Tests validation : ThesisCreate, ThesisEdit, AutofocusField
+- PHPStan + PHP-CS-Fixer + Biome pour le linting
+
+### Dépendances & modernisation
+- Composer.json avec autoloader
+- Parsedown → league/commonmark
+- Client HTTP custom → Guzzle
+- SMTP socket → PHPMailer
+
+### Logging
+- **Monolog** : 4 canaux PSR-3 (app, admin, error, audit)
+- Rotation 30 jours, format JSON préservé
+- Remplace 4 systèmes de log distincts
+- LOG_LEVEL par variable d'environnement
+
+### CSS — refactor architecture
+- Split en couches nommées (reset, colors, typography, base, components, utilities)
+- Un fichier par composant (links, focus, forms, tables, dialog, etc.)
+- Compatibilité backward (variables.css, common.css wrappers)
+
+### UI / UX
+- SVG icons inline via helper PHP (icon()) — plus aucun
pour les icônes
+- Build pipeline CSS/JS
+- Dev-watch avec reconstruction live
+- Scroll-position memory sur swaps HTMX (répertoire)
+- Transition + swap fluide sur le répertoire
+- Correctifs sécurité (open redirect, CSRF partage, gate session)
+
+### Divers
+- Recap admin : sections → fieldsets, fichiers en table
+- FormBootstrap : DRY entre add/edit
+- Colonne thesis_status (two-phase commit lifecycle)
+- Déploiement : split deploy-code/deploy-deps/deploy-migrate, lockfile checksum
+- Export fichiers ZIP avec LINK.txt (URLs PeerTube)
+- Correctifs : identifier year-prefix mismatch, author name casing, contact découplage v2
+- CSV import : AP aliases, OUI/NON sanitization
+- Rate limits relevés (30→300/min sur certains endpoints)
## Juin 2026 (82 commits)
-- Migration icônes
→ SVG inline (26 templates, helper icon())
-- Cleanup dialog : suppression doublons, hx-confirm sur delete
-- Refonte pages statiques (layout partagé, TOC sticky)
-- PHP upload limits → 8GB pour vidéos
-- Debug leftover crash HTMX FormData(fieldset)
+### Icônes SVG
+- Migration complète
→ SVG inline via icon() helper PHP
+- 26 templates modifiés
+- 12 icônes SVG corrigées (fill="#000000" → fill="currentColor")
+- Icône recherche remplacée (Phosphor fill-based magnifying glass)
+
+### Pages statiques & TOC
+- Refonte À propos / Charte / Licence : layout partagé en grille
+- TOC sticky → details/summary responsive (collapsible sur mobile)
+- Ancres de titres stables (CommonMark HeadingPermalinkExtension)
+- Styles liens standardisés
+
+### Répertoire — polissage UX
+- Accordéon mobile pour les colonnes de filtre (≤640px)
+- Toggle, chevron, badge compteur de filtres actifs
+- Tri des colonnes : matched first, puis unmatched, puis alphabétique
+- Mots-clés : résultats viables en haut
+- Suppression de la chip bar mobile
+- Correction re-init accordéon après swap HTMX (bug DOM détaché)
+- Scroll colonnes répertoire : min-height: 0, overflow-y: auto
+- Scroll-position memory sur swaps HTMX
+
+### Formulaire — accessibilité & robustesse
+- aria-errormessage, aria-invalid, aria-describedby sur tous les champs
+- Layout mobile responsive (champs empilés, 44×44px touch targets)
+- Autosave brouillon formulaire partage (session persistence)
+- Guard no-JS (filepond_mode désactivé par défaut)
+- Preserve fichiers temporaires FilePond après redirection validation
+
+### Uploads & fichiers
+- PHP upload limits → 8GB (vidéos)
+- Nettoyage dialog : suppression doublons, hx-confirm sur delete
- Type hint adminOld corrigé (string → string|array)
-- Index SQLite pour requêtes langues/tags
-- Accordéon mobile répertoire : toggle, chevron, badge actif
-- Remplacement sticky nav par details/summary TOC responsive
-- Icône recherche corrigée
-- Scroll colonnes répertoire + admin TOC duplication
-- Filtres répertoire : tri matched-first, mot-clés en haut
-- Suppression chip bar mobile
-- Accordéon re-init après HTMX swap (bug DOM détaché)
-- Gzip + extraction JS inline
-- Build pipeline CSS/JS
-- Dev-watch
-- Transition scroll + swap fluide sur répertoire
-- Correctifs sécu (csrf partage, open redirect, verifyCsrf)
-- TODO et tasks de sécu complétés
+
+### Build & performance
+- Pipeline build CSS/JS (biome + rolldown + lightningcss)
+- Dev-watch chokidar-cli
+- Gzip nginx + extraction JS inline (730 lignes → 15 fichiers)
+- Biome lint fixes (CSS duplicate properties, JS arrow functions)
+
+### Contenus & CMS
+- Auto-save avec OverType toolbar sur contenus-edit
+- Liens sidebar dynamiques (site ERG, code source)
+- Markdown cheatsheet : rendu réel dans la colonne d'exemple
+- Page Charte ajoutée (publique + admin)
+
+### TFE — métadonnées
+- Durée : colonnes DB, champs formulaire, affichage XhYm
+- Finalité master affichée sur la page publique
+- Identifiant régénéré si mismatch année
+- Author name casing corrigé (COLLATE NOCASE, idHint lookup)
+- Suppression vidéos PeerTube lors de la suppression d'un TFE
+
+### Sécurité
+- Open redirect fix : rejet des URLs protocol-relative (//evil.com)
+- CSRF sur retry-email POST
+- Gate partage fragments sur session share_active
+- Suppression App::verifyCsrf() mort
+
+### Divers
+- Index SQLite pour requêtes langues/tags (contenus page)
+- Correctif logs capturés
+- Nettoyage .gitignore, vendor/
+- Cleanup dialog
+- TFE page : CC2r + licence, formatage contact court
+- Recherche : filtres finalité + format, bouton Réinitialiser neutre