diff --git a/frontend/recherche.html b/frontend/recherche.html
index 23d5b3a..9a6944b 100644
--- a/frontend/recherche.html
+++ b/frontend/recherche.html
@@ -25,6 +25,46 @@
comportements de la SPA et ne sont pas rejoués ici.
Sidebar statique (navigation de l'app) : les vaults, tags et
récents dynamiques vivent dans la SPA, pas sur cette page. -->
+ Thème (défaut 4) : le thème ObsiGate n'est PAS une préférence
+ serveur — il vit dans localStorage, lu par la SPA au démarrage
+ (frontend/js/ui.js initTheme : mode ; frontend/js/sync.js
+ init() -> themes.js initThemes : clé + mode). Étape 1 ci-dessous
+ (script synchrone en tête, avant les feuilles) : pose
+ data-theme = mode persisté (obsigate-theme-mode, repli
+ obsigate-theme historique quand il valait déjà un mode, sinon
+ 'dark', le défaut SPA) pour que la première peinture soit déjà
+ dans le bon mode clair/sombre. Étape 2 en fin de page (module
+ différé) : initThemes() de themes.js applique la palette
+ complète — 16 thèmes intégrés, modes high-contrast/sepia
+ générés, thèmes personnalisés — via variables inline sur :root,
+ exactement comme la SPA. data-theme="dark" sur n'est
+ plus que le repli sans JS. Aucun endpoint serveur, aucune
+ police externe ajoutée (la CSP stricte de /recherche et le
+ repli typographique système sont inchangés).
+
@@ -149,5 +189,31 @@
+
+