diff --git a/manifest.json b/manifest.json
index 0879b3ce61c3f6eb778bf89bd2aa63c424e2d707..a5821ed714cad076ec405a7b13707a0d8b4c2b5e 100644
--- a/manifest.json
+++ b/manifest.json
@@ -20,6 +20,7 @@
 
   "background": {
     "scripts": [
+      "src/utils/logger.js",
       "src/background/background.js", 
       "src/utils/definitions.js",
       "src/utils/api.js",
@@ -54,11 +55,13 @@
     {
       "matches": ["<all_urls>"], 
       "js": [
+        "src/utils/logger.js",
         "src/assets/lexicon_icon.js",
         "src/utils/api.js",
         "src/utils/definitions.js",
         "src/sidebar/sidebar.js",
-        "src/context_menu/custom_context_menu.js"],
+        "src/context_menu/custom_context_menu.js",
+        "src/utils/stats.js"],
       "css": ["src/context_menu/custom_context_menu.css"],
       "run_at": "document_idle"
     },
diff --git a/src/background/background.js b/src/background/background.js
index ad1c9c30fd2706e2b3a4ce294932df3ca796c8bf..7f5aa2db052829b5cbc29d24d910f386d7efc53a 100644
--- a/src/background/background.js
+++ b/src/background/background.js
@@ -12,14 +12,14 @@ const AUTH_BALEX_URL = "https://prisms.lezinter.net/fr/headquarters/balex";
 // ─────────────────────────────────────────────────────────────────────────────
 // Logs de démarrage
 // ─────────────────────────────────────────────────────────────────────────────
-console.log("🚀 ff2BaLex (background) chargé.");
+log("🚀 ff2BaLex (background) chargé.");
 
 browser.runtime.onInstalled.addListener((details) => {
-  console.log("🔔 Extension installée ou mise à jour. Raison :", details.reason);
+  log("🔔 Extension installée ou mise à jour. Raison :", details.reason);
 });
 
 browser.runtime.onStartup.addListener(() => {
-  console.log("🔄 Extension démarrée (onStartup).");
+  log("🔄 Extension démarrée (onStartup).");
 });
 
 // ─────────────────────────────────────────────────────────────────────────────
@@ -28,11 +28,11 @@ browser.runtime.onStartup.addListener(() => {
 browser.storage.onChanged.addListener((changes) => {
   if (changes.extensionActive) {
     isExtensionActive = changes.extensionActive.newValue;
-    console.log("✅ Extension activée :", isExtensionActive);
+    log("✅ Extension activée :", isExtensionActive);
   }
   if (changes.statsActive) {
     areStatsActive = changes.statsActive.newValue;
-    console.log("📊 Statistiques activées :", areStatsActive);
+    log("📊 Statistiques activées :", areStatsActive);
   }
   refreshAllUI();
 });
@@ -43,7 +43,7 @@ browser.storage.onChanged.addListener((changes, area) => {
     if (newToken) {
       browser.storage.local.get("extensionActive").then(({ extensionActive }) => {
         if (!extensionActive) {
-          console.log("Token ajouté, activation automatique de l'extension.");
+          log("Token ajouté, activation automatique de l'extension.");
           browser.storage.local.set({ extensionActive: true });
           enableExtensionFeatures(); 
           browser.runtime.sendMessage({
@@ -67,7 +67,7 @@ async function isUserConnected() {
 }
 
 async function refreshAllUI() {
-  console.log("🔄 Rafraîchissement global de l'UI...");
+  log("🔄 Rafraîchissement global de l'UI...");
   browser.runtime.sendMessage({ action: "refreshUI" });
 }
 
@@ -78,16 +78,16 @@ let worker = null;
 
 function initWorker() {
   if (!worker) {
-    console.log("[Background] Initialisation du WebWorker...");
+    log("[Background] Initialisation du WebWorker...");
     try {
       worker = new Worker("src/workers/pyodide_worker.js");
       worker.onmessage = (event) => {
-        console.log("[Background] Message reçu du WebWorker :", event.data);
+        log("[Background] Message reçu du WebWorker :", event.data);
       };
       worker.onerror = (error) => {
         console.error("[Background] Erreur dans le WebWorker :", error);
       };
-      console.log("[Background] WebWorker initialisé avec succès.");
+      log("[Background] WebWorker initialisé avec succès.");
     } catch (error) {
       console.error("[Background] Échec de l'initialisation du WebWorker :", error);
     }
@@ -101,21 +101,21 @@ worker.postMessage({ command: "pyodide-simplemma" });
 // Écoute des messages de la popup et transmission au WebWorker
 // ─────────────────────────────────────────────────────────────────────────────
 browser.runtime.onMessage.addListener(async (message, sender, sendResponse) => {
-  console.log("[Background] Message reçu :", message);
+  log("[Background] Message reçu :", message);
 
   if (!worker) {
     initWorker();
   }
 
   if (message.command === "toggle-stats") {
-    console.log(`[Background] Statistiques ${message.isActive ? "activées" : "désactivées"}`);
+    log(`[Background] Statistiques ${message.isActive ? "activées" : "désactivées"}`);
     await browser.storage.local.set({ isTrackingActive: message.isActive });
     // Transmettre l'activation des statistiques au WebWorker
     worker.postMessage({ command: "toggle-stats", isActive: message.isActive });
   }
   
   if (message.command === "pyodide-simplemma") {
-    console.log("[Background] Demande d'initialisation de Pyodide et Simplemma...");
+    log("[Background] Demande d'initialisation de Pyodide et Simplemma...");
     worker.postMessage({ command: "pyodide-simplemma" });
   }
 
@@ -126,7 +126,7 @@ browser.runtime.onMessage.addListener(async (message, sender, sendResponse) => {
 // Écouter les réponses du WebWorker
 // ─────────────────────────────────────────────────────────────────────────────
 worker.onmessage = (event) => {
-  console.log("[Background] Message du WebWorker :", event.data);
+  log("[Background] Message du WebWorker :", event.data);
 
   // Pyodide et Simplemma prêts : notifier tous les onglets
   if (event.data.type === "pyodide-simplemma" && event.data.status === "success") {
@@ -146,7 +146,7 @@ browser.runtime.onConnect.addListener((port) => {
   if (port.name === "auth") {
     port.onMessage.addListener(async (message) => {
       if (message.action === "toggleAuth") {
-        console.log("🔄 toggleAuth reçu via port dans le background.");
+        log("🔄 toggleAuth reçu via port dans le background.");
         const isConnected = await isUserConnected();
         if (isConnected) {
           await disconnectFromLexicalDB();
@@ -161,18 +161,18 @@ browser.runtime.onConnect.addListener((port) => {
 
 // Ouvre directement la page de connexion
 async function actuallyOpenLoginPage() {
-  console.log("🔗 Ouverture de la page de connexion.");
+  log("🔗 Ouverture de la page de connexion.");
 
   // Mémoriser l'onglet actif
   const [currentTab] = await browser.tabs.query({ active: true, currentWindow: true });
   if (currentTab) {
     originalTabId = currentTab.id;
-    console.log("✅ Onglet courant mémorisé, ID =", originalTabId);
+    log("✅ Onglet courant mémorisé, ID =", originalTabId);
   }
   // Ouvre un nouvel onglet pour la page de connexion et l'active
   const loginTab = await browser.tabs.create({ url: AUTH_LOGIN_URL, active: true });
   loginTabId = loginTab.id;
-  console.log("✅ Onglet de login créé, ID =", loginTabId);
+  log("✅ Onglet de login créé, ID =", loginTabId);
   // Notifie que l'authentification est en cours
   browser.runtime.sendMessage({ action: "authStatusChanged", isLoggedIn: false });
 }
@@ -180,7 +180,7 @@ async function actuallyOpenLoginPage() {
 // Déconnecte l'utilisateur 
 async function disconnectFromLexicalDB() {
   await browser.storage.local.remove("accessToken");
-  console.log("🔓 Token supprimé avec succès.");
+  log("🔓 Token supprimé avec succès.");
   
   await browser.storage.local.remove("lexiconColors");
   
@@ -201,13 +201,13 @@ async function disconnectFromLexicalDB() {
 
 // Sauvegarde le token et ferme l'onglet de login si nécessaire
 async function saveToken(token) {
-  console.log("✅ Sauvegarde du token :", token);
+  log("✅ Sauvegarde du token :", token);
   await browser.storage.local.set({ accessToken: token });
 
   if (loginTabId) {
     try {
       await browser.tabs.remove(loginTabId);
-      console.log("🗙 Onglet de login fermé après connexion réussie.");
+      log("🗙 Onglet de login fermé après connexion réussie.");
     } catch (err) {
       console.warn("Impossible de fermer l'onglet de login :", err);
     }
@@ -216,7 +216,7 @@ async function saveToken(token) {
   if (originalTabId) {
     try {
       await browser.tabs.update(originalTabId, { active: true });
-      console.log("🔙 Retour sur l'onglet initial :", originalTabId);
+      log("🔙 Retour sur l'onglet initial :", originalTabId);
     } catch (err) {
       console.warn("Impossible de basculer sur l'onglet initial :", err);
     }
@@ -242,7 +242,7 @@ async function saveToken(token) {
 // Gestion des messages reçus
 // ─────────────────────────────────────────────────────────────────────────────
 browser.runtime.onMessage.addListener(async (message, sender, sendResponse) => {
-  console.log("📩 Message reçu dans background.js :", message);
+  log("📩 Message reçu dans background.js :", message);
 
   switch (message.action) {
     case "toggleAuth": {
@@ -257,7 +257,7 @@ browser.runtime.onMessage.addListener(async (message, sender, sendResponse) => {
     }
     case "getDefinitionWiki": {
       if (message.selectedText && message.selectedText.trim() !== "") {
-        console.log("🌐 Requête Wiktionnaire pour :", message.selectedText);
+        log("🌐 Requête Wiktionnaire pour :", message.selectedText);
         const definition = await window.fetchWiktionaryDefinition(message.selectedText.trim());
         browser.runtime.sendMessage({
           action: "fetchWiktionaryDefinitionResponse",
@@ -278,7 +278,7 @@ browser.runtime.onMessage.addListener(async (message, sender, sendResponse) => {
       break;
     }
     case "authStatusChanged": {
-      console.log("🔄 Mise à jour de l'état d'authentification :", message.isLoggedIn);
+      log("🔄 Mise à jour de l'état d'authentification :", message.isLoggedIn);
       break;
     }
     case "saveToken": {
@@ -303,22 +303,22 @@ browser.webNavigation.onCompleted.addListener(async (details) => {
 
   // Injection d'un popup d'instruction sur la page de login
   if (url.hostname === "prisms.lezinter.net" && url.pathname === "/fr/login") {
-    console.log("📘 Injection du popup d'instruction sur la page de login Prisms.");
+    log("📘 Injection du popup d'instruction sur la page de login Prisms.");
     showInstructionPopup(details);
   }
   // Récupération du token sur la page /balex
   if (url.hostname === "prisms.lezinter.net" && url.pathname === "/fr/headquarters/balex") {
-    console.log("🟢 Page /balex détectée. Tentative de récupération du token.");
+    log("🟢 Page /balex détectée. Tentative de récupération du token.");
     try {
       await new Promise(resolve => setTimeout(resolve, 3000));
       await browser.tabs.executeScript(details.tabId, {
         code: `
           (function() {
-            console.log("🔍 Recherche du token...");
+            log("🔍 Recherche du token...");
             const tokenElement = document.getElementById("accessToken") || document.getElementById("accesToken");
             if (tokenElement) {
               const token = tokenElement.innerText.trim();
-              console.log("🔐 Token détecté :", token);
+              log("🔐 Token détecté :", token);
               browser.runtime.sendMessage({ action: "saveToken", token });
             } else {
               console.error("❌ Token introuvable.");
@@ -339,7 +339,7 @@ browser.webNavigation.onCompleted.addListener(async (details) => {
 browser.webRequest.onBeforeRequest.addListener(
   function(details) {
     if (details.url === "https://prisms.lezinter.net/fr/headquarters/") {
-      console.log("🚀 Redirection automatique vers /balex.");
+      log("🚀 Redirection automatique vers /balex.");
       return { redirectUrl: AUTH_BALEX_URL };
     }
   },
@@ -408,10 +408,10 @@ async function initializeExtensionState() {
 
   if (extensionActive === undefined) {
     await browser.storage.local.set({ extensionActive: true }); // Activation par défaut
-    console.log("🔄 Initialisation : extension activée par défaut.");
+    log("🔄 Initialisation : extension activée par défaut.");
     enableExtensionFeatures();
   } else {
-    console.log(`🔄 État actuel de l'extension : ${extensionActive ? "activée" : "désactivée"}`);
+    log(`🔄 État actuel de l'extension : ${extensionActive ? "activée" : "désactivée"}`);
     if (extensionActive) {
       enableExtensionFeatures();
     } else {
@@ -423,7 +423,7 @@ async function initializeExtensionState() {
 // === 2. Gestion de l'activation/désactivation de l'extension ===
 browser.runtime.onMessage.addListener(async (message) => {
   if (message.action === "toggleExtension") {
-    console.log(`🔄 Changement d'état de l'extension : ${message.isActive ? "activée" : "désactivée"}`);
+    log(`🔄 Changement d'état de l'extension : ${message.isActive ? "activée" : "désactivée"}`);
     await browser.storage.local.set({ extensionActive: message.isActive });
 
     if (!message.isActive) {
@@ -437,7 +437,7 @@ browser.runtime.onMessage.addListener(async (message) => {
 
 // === 3. Fonction pour désactiver les fonctionnalités de l'extension ===
 async function disableExtensionFeatures() {
-  console.log("Désactivation des fonctionnalités de l'extension.");
+  log("Désactivation des fonctionnalités de l'extension.");
   browser.runtime.sendMessage({ 
     action: "updateUI", 
     autoAdd: false, 
@@ -445,12 +445,12 @@ async function disableExtensionFeatures() {
     areStatsActive: false
   });
   // Suppression d'éventuelles actions spécifiques à la sidebar
-  console.log("Les fonctionnalités de la sidebar ne sont plus utilisées.");
+  log("Les fonctionnalités de la sidebar ne sont plus utilisées.");
 }
 
 // === 4. Fonction pour activer les fonctionnalités de l'extension ===
 async function enableExtensionFeatures() {
-  console.log("Réactivation des fonctionnalités de l'extension.");
+  log("Réactivation des fonctionnalités de l'extension.");
   browser.runtime.sendMessage({ 
     action: "updateUI", 
     autoAdd: true, 
diff --git a/src/context_menu/browser_context_menu.js b/src/context_menu/browser_context_menu.js
index 7c24d4a8e5d5d5829d6135265ddb5e8ffc228e1b..92112337ca829ef9f72b2bed3882f3c8e63387a4 100644
--- a/src/context_menu/browser_context_menu.js
+++ b/src/context_menu/browser_context_menu.js
@@ -1,4 +1,4 @@
-console.log("browser_context_menu.js chargé correctement");
+log("browser_context_menu.js chargé correctement");
 
 let authToken = null;
 let selectedLexicons = new Set();
@@ -10,7 +10,7 @@ async function loadAuthToken() {
   try {
     const result = await browser.storage.local.get("accessToken");
     authToken = result.accessToken;
-    console.log("🔑 Token chargé au démarrage :", authToken);
+    log("🔑 Token chargé au démarrage :", authToken);
   } catch (error) {
     console.error("❌ Erreur lors de la récupération du token :", error);
   }
@@ -76,14 +76,14 @@ loadAuthToken().then(createContextMenu);
 
 browser.runtime.onMessage.addListener((message) => {
   if (message.action === "refreshUI") {
-    console.log("🔄 refreshUI reçu dans browser_context_menu.js");
+    log("🔄 refreshUI reçu dans browser_context_menu.js");
     loadAuthToken().then(createContextMenu);
   }
 });
 
 browser.storage.onChanged.addListener((changes, area) => {
   if (area === "local" && changes.accessToken) {
-    console.log("🔄 Token modifié, actualisation du menu contextuel.");
+    log("🔄 Token modifié, actualisation du menu contextuel.");
     loadAuthToken().then(createContextMenu);
   }
 });
@@ -92,11 +92,11 @@ browser.storage.onChanged.addListener((changes, area) => {
 // Gestion des clics sur le menu contextuel
 // ─────────────────────────────────────────────────────────────────────────────
 browser.contextMenus.onClicked.addListener(async (info, tab) => {
-  console.log("Item de menu cliqué :", info.menuItemId);
+  log("Item de menu cliqué :", info.menuItemId);
 
   // Action pour le bouton de connexion/déconnexion
   if (info.menuItemId === "login") {
-    console.log("🔄 Action login/déconnexion demandée.");
+    log("🔄 Action login/déconnexion demandée.");
     if (typeof actuallyOpenLoginPage === "function") {
       actuallyOpenLoginPage();
     } else {
@@ -111,7 +111,7 @@ browser.contextMenus.onClicked.addListener(async (info, tab) => {
   }
 
   const selectedText = info.selectionText.trim();
-  console.log(`📩 Texte sélectionné : ${selectedText}`);
+  log(`📩 Texte sélectionné : ${selectedText}`);
 
   // Item "Ajouter ce mot à mes lexiques"
   if (info.menuItemId === "addToLexicon") {
@@ -160,7 +160,7 @@ async function getDefinition(selectedText) {
     }
     const wikiDefs = await fetchWiktionaryDefinition(selectedText);
     const allDefinitions = [...lexiconDefs, ...wikiDefs];
-    console.log("📝 Définitions combinées :", allDefinitions);
+    log("📝 Définitions combinées :", allDefinitions);
     browser.runtime.sendMessage({
       action: "showDefinitions",
       selectedText,
@@ -173,10 +173,10 @@ async function getDefinition(selectedText) {
 
 async function searchInLexicons(selectedText) {
   try {
-    console.log("🔎 Recherche dans mes lexiques :", selectedText);
+    log("🔎 Recherche dans mes lexiques :", selectedText);
     const allDefinitions = await fetchLexiconDefinitions(selectedText);
     if (!allDefinitions || allDefinitions.length === 0) {
-      console.log("❌ Aucun lexique trouvé pour ce mot.");
+      log("❌ Aucun lexique trouvé pour ce mot.");
       browser.runtime.sendMessage({
         action: "showLexiconResult",
         lexicons: [],
@@ -194,7 +194,7 @@ async function searchInLexicons(selectedText) {
     for (const [id, name] of lexMap.entries()) {
       foundInLexicons.push({ id, name });
     }
-    console.log("📩 Envoi du message 'showLexiconResult' avec :", foundInLexicons);
+    log("📩 Envoi du message 'showLexiconResult' avec :", foundInLexicons);
     browser.runtime.sendMessage({
       action: "showLexiconResult",
       lexicons: foundInLexicons,
diff --git a/src/context_menu/custom_context_menu.css b/src/context_menu/custom_context_menu.css
index f763805383df8589ad745876c29b25d9f7852331..91fbf36cefc0096ebd3069a3aeeaa790a842db4f 100644
--- a/src/context_menu/custom_context_menu.css
+++ b/src/context_menu/custom_context_menu.css
@@ -1,3 +1,5 @@
+
+
 /* === Conteneur principal du menu contextuel === */
 #whiteBox {
   position: absolute; 
diff --git a/src/context_menu/custom_context_menu.js b/src/context_menu/custom_context_menu.js
index 37dd04d384095252107d67d5732b6825e32c6a41..ad5ab780f6299369b6b917a145ad578ea1d07384 100644
--- a/src/context_menu/custom_context_menu.js
+++ b/src/context_menu/custom_context_menu.js
@@ -1,4 +1,4 @@
-console.log("custom_context_menu.js chargé correctement");
+log("custom_context_menu.js chargé correctement");
 
 // === Variables globales ===
 const WHITE_BOX_ID = "whiteBox";
@@ -18,7 +18,7 @@ async function loadAuthToken() {
   try {
     const result = await browser.storage.local.get("accessToken");
     authToken = result.accessToken || null;
-    console.log("🔑 Token chargé :", authToken);
+    log("🔑 Token chargé :", authToken);
   } catch (error) {
     console.error("❌ Erreur lors de la récupération du token :", error);
     authToken = null;
@@ -95,7 +95,7 @@ function setupWhiteBoxActions() {
     e.stopPropagation();
     e.preventDefault();
     const selectedText = getSelectedWord().trim();
-    console.log("🔍 Bouton Ajouter au lexique cliqué avec le mot :", selectedText);
+    log("🔍 Bouton Ajouter au lexique cliqué avec le mot :", selectedText);
     if (!selectedText) return;
     if (authToken) {
       browser.runtime.sendMessage({ action: "openLexiconBlock" });
@@ -174,7 +174,7 @@ function showWhiteBox(event, selectedText) {
   whiteBox.style.top = top + "px";
   whiteBox.style.display = "block";
 
-  console.log("Affichage du menu contextuel avec le mot :", selectedText);
+  log("Affichage du menu contextuel avec le mot :", selectedText);
   updateMenuVisibility();
 }
 
@@ -190,7 +190,7 @@ document.addEventListener("mouseup", (event) => {
   if (event.target.closest("#whiteBox")) return;
   const selectedText = window.getSelection().toString().trim();
   if (selectedText) {
-    console.log("Texte sélectionné :", selectedText);
+    log("Texte sélectionné :", selectedText);
     getOrCreateWhiteBox();
     showWhiteBox(event, selectedText);
     browser.runtime.sendMessage({
@@ -205,7 +205,7 @@ document.addEventListener("mouseup", (event) => {
 // Écoute des messages entrants
 browser.runtime.onMessage.addListener((message) => {
   if (message.action === "refreshUI") {
-    console.log("🔄 Mise à jour du menu contextuel personnalisé.");
+    log("🔄 Mise à jour du menu contextuel personnalisé.");
     loadAuthToken().then(updateMenuVisibility);
   }
 });
@@ -217,7 +217,7 @@ loadAuthToken().then(() => {
 });
 browser.storage.onChanged.addListener((changes) => {
   if (changes.accessToken) {
-    console.log("🔄 Token modifié dans le stockage, mise à jour du menu contextuel.");
+    log("🔄 Token modifié dans le stockage, mise à jour du menu contextuel.");
     loadAuthToken().then(updateMenuVisibility);
   }
 });
@@ -276,7 +276,7 @@ async function showPicker(event, selectedText) {
 
   try {
     const lexicons = await getLexicons(authToken, "fr");
-    console.log("Lexicons récupérés :", lexicons);
+    log("Lexicons récupérés :", lexicons);
 
     if (!Array.isArray(lexicons) || lexicons.length === 0) {
       picker.innerHTML = "<p style='color:#333;'>Aucun lexique trouvé.</p>";
@@ -316,7 +316,7 @@ async function showPicker(event, selectedText) {
           return;
         }
 
-        console.log(`🔍 Vérification si le mot "${selectedText}" existe déjà dans les lexiques sélectionnés...`);
+        log(`🔍 Vérification si le mot "${selectedText}" existe déjà dans les lexiques sélectionnés...`);
 
         let definitions = [];
         try {
@@ -345,9 +345,9 @@ async function showPicker(event, selectedText) {
         }
 
         try {
-          console.log(`📡 Ajout du mot "${selectedText}" dans les lexiques :`, lexiconsToAdd);
+          log(`📡 Ajout du mot "${selectedText}" dans les lexiques :`, lexiconsToAdd);
           const result = await AddWord(authToken, selectedText, lexiconsToAdd, false);
-          console.log("Réponse API :", result);
+          log("Réponse API :", result);
 
           await new Promise(resolve => setTimeout(resolve, 300));
           browser.runtime.sendMessage({ action: "refreshUI" });
@@ -402,7 +402,7 @@ document.addEventListener("mouseup", (event) => {
   
   const selectedText = window.getSelection().toString().trim();
   if (selectedText) {
-    console.log("Texte sélectionné :", selectedText);
+    log("Texte sélectionné :", selectedText);
     showWhiteBox(event, selectedText);
     browser.runtime.sendMessage({
       action: "mot_selectionne",
diff --git a/src/options/options.html b/src/options/options.html
index c9491e14ccca3a582c965ec79951a593ec129da4..ddac9ee33223c34d3d1e9258719fe5c907282883 100644
--- a/src/options/options.html
+++ b/src/options/options.html
@@ -4,6 +4,7 @@
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>Paramètres ff2BaLex</title>
+  <script src="../utils/logger.js"></script>
   <style>
     body {
       font-family: Arial, sans-serif;
diff --git a/src/options/options.js b/src/options/options.js
index 22cba4c05d9dda2553051080e284eaccbbd1b921..104e01718fece2f7bf59443e9aa1c071ee1ec9f8 100644
--- a/src/options/options.js
+++ b/src/options/options.js
@@ -4,7 +4,7 @@ document.getElementById('connectBtn').addEventListener('click', () => {
 
 async function disconnectFromLexicalDB() {
   await browser.storage.local.remove("accessToken");
-  console.log("Token supprimé, déconnexion réussie.");
+  log("Token supprimé, déconnexion réussie.");
   alert("Déconnexion réussie.");
   updateContextMenu();
 
diff --git a/src/popup/popup.html b/src/popup/popup.html
index 75cc8e056cdaad4b043ae64fcfd6d1974c0c7958..c19f7cff6b3f03d5362e244a672060fb26710d91 100644
--- a/src/popup/popup.html
+++ b/src/popup/popup.html
@@ -4,6 +4,7 @@
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>Extension BaLex</title>
+  <script src="../utils/logger.js"></script>
   <style>
     #extension-notification {
       position: absolute;
diff --git a/src/popup/popup.js b/src/popup/popup.js
index 412056b95b82ebb8846b82eb625730f44af8b575..1482821eb8befcf5b8e7dca1a83893e9f74e23ac 100644
--- a/src/popup/popup.js
+++ b/src/popup/popup.js
@@ -1,4 +1,4 @@
-console.log("✅ popup.js chargé avec succès !");
+log("✅ popup.js chargé avec succès !");
 
 // === 1. Mise à jour du bouton Connexion/Déconnexion ===
 async function updateConnectionButton() {
@@ -62,7 +62,7 @@ async function updateLanguageSelection() {
     languageSelection.appendChild(langButton);
   });
 
-  console.log("✅ Sélection des langues mise à jour avec :", userLanguages);
+  log("✅ Sélection des langues mise à jour avec :", userLanguages);
 }
 
 // === 3. Mise à jour des options utilisateur et des statistiques ===
@@ -154,7 +154,7 @@ document.getElementById("toggleStatsBtn").addEventListener("click", async () =>
   browser.runtime.sendMessage({ command: "toggle-stats", isActive: newState });
 
   if (newState) {
-    console.log("[Popup] Demande d'initialisation de Pyodide...");
+    log("[Popup] Demande d'initialisation de Pyodide...");
     browser.runtime.sendMessage({ command: "init-pyodide" });
   }
 });
@@ -181,7 +181,7 @@ document.getElementById("save-options").addEventListener("click", async () => {
     trackedLanguages: selectedLanguages
   });
 
-  console.log("Options sauvegardées :", { autoAdd, threshold, trackedLanguages: selectedLanguages });
+  log("Options sauvegardées :", { autoAdd, threshold, trackedLanguages: selectedLanguages });
 });
 
 // === 5. Gestion de l'activation/désactivation de l'extension ===
@@ -234,7 +234,7 @@ async function proceedToggleExtension() {
 
 // === 6. Mise à jour de l'UI du popup en fonction d'un message ===
 async function updatePopupUI(message) {
-  console.log("🔄 Mise à jour du popup avec :", message);
+  log("🔄 Mise à jour du popup avec :", message);
 
   const statsOptions = document.getElementById("stats-options");
   const autoAddCheckbox = document.getElementById("auto-add");
@@ -270,10 +270,10 @@ async function updatePopupUI(message) {
 
 // === 7. Écoute des messages depuis le background ===
 browser.runtime.onMessage.addListener(async (message) => {
-  console.log("📩 Message reçu dans popup.js :", message);
+  log("📩 Message reçu dans popup.js :", message);
 
   if (message.action === "updateUI") {
-    console.log("🔄 Mise à jour de l'UI du popup...");
+    log("🔄 Mise à jour de l'UI du popup...");
     await updateConnectionButton();
     await updateOptionsUI();
     await updateLanguageSelection();
diff --git a/src/sidebar/sidebar.html b/src/sidebar/sidebar.html
index 84ab2a28c0d0e272f945eac156287775ce676ace..143f1f0f738e76465d490da9319f5cdf8a54460b 100644
--- a/src/sidebar/sidebar.html
+++ b/src/sidebar/sidebar.html
@@ -4,6 +4,7 @@
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>BaLex - Barre Latérale</title>
+  <script src="../utils/logger.js"></script>
   <script src="../assets/lexicon_icon.js" defer></script>
   <script src="../utils/api.js" defer></script>
   <script src="../utils/definitions.js" defer></script>
diff --git a/src/sidebar/sidebar.js b/src/sidebar/sidebar.js
index 0da7a26e8b8ec9cea96eadfe704489f245ef025e..f283a19fda51e921d858326c460be4fa23340174 100644
--- a/src/sidebar/sidebar.js
+++ b/src/sidebar/sidebar.js
@@ -1,5 +1,5 @@
-console.log("✅ sidebar.js chargé !");
-console.log(
+log("✅ sidebar.js chargé !");
+log(
   "🌐 Vérification API browser :",
   typeof browser !== "undefined" ? "✅ Disponible" : "❌ Non disponible"
 );
@@ -18,14 +18,14 @@ async function getAuthTokenFromStorage() {
   try {
     const { accessToken } = await browser.storage.local.get("accessToken");
     if (accessToken) {
-      console.log(`🔑 Token récupéré depuis le stockage local : [${accessToken}]`);
+      log(`🔑 Token récupéré depuis le stockage local : [${accessToken}]`);
       authToken = accessToken;
       window.authToken = accessToken; 
       return authToken;
     }
-    console.warn("⚠️ Aucun token trouvé dans le stockage local.");
+    log("⚠️ Aucun token trouvé dans le stockage local.");
   } catch (error) {
-    console.error("❌ Erreur lors de la récupération du token :", error);
+    log("❌ Erreur lors de la récupération du token :", error);
   }
   return null;
 }
@@ -40,7 +40,7 @@ function updateAuthButton(isLoggedIn) {
     authButton.title = isLoggedIn
       ? "En vous déconnectant, vous perdrez l'accès à vos lexiques personnels ainsi qu'aux fonctionnalités d'ajout automatique et de statistiques d'utilisation."
       : "En vous connectant, vous pourrez accéder à vos lexiques personnels ainsi qu'aux fonctionnalités d'ajout automatique et de statistiques d'utilisation.";
-    console.log("🔄 Bouton d'authentification mis à jour :", authButton.textContent);
+    log("🔄 Bouton d'authentification mis à jour :", authButton.textContent);
   } else {
     console.warn("⚠️ Bouton d'authentification (#auth-button) introuvable.");
   }
@@ -59,7 +59,7 @@ function toggleElementsVisibility(isLoggedIn) {
     const element = document.getElementById(id);
     if (element) {
       element.style.display = shouldShow ? "block" : "none";
-      console.log(`🔄 Élément #${id} ${shouldShow ? "affiché" : "masqué"}.`);
+      log(`🔄 Élément #${id} ${shouldShow ? "affiché" : "masqué"}.`);
     } else {
       console.warn(`⚠️ Élément #${id} introuvable.`);
     }
@@ -77,7 +77,7 @@ function toggleHighlightMessage(isLoggedIn) {
  * Met à jour l'état global de la sidebar (bouton d'authentification, etc.)
  */
 async function refreshSidebarState() {
-  console.log("🔄 Début de l'actualisation de la barre latérale...");
+  log("🔄 Début de l'actualisation de la barre latérale...");
   const token = await getAuthTokenFromStorage();
   const isLoggedIn = !!token;
 
@@ -113,7 +113,7 @@ async function refreshSidebarState() {
     }
   }
 
-  console.log("✅ Barre latérale actualisée. Utilisateur connecté :", isLoggedIn);
+  log("✅ Barre latérale actualisée. Utilisateur connecté :", isLoggedIn);
 }
 
 /**
@@ -164,15 +164,15 @@ function openBlock(blockId, btn) {
 
 async function fetchLexicons() {
   try {
-    console.log("🔄 Début de la récupération des lexiques...");
-    console.log("🔑 Token utilisé :", authToken);
+    log("🔄 Début de la récupération des lexiques...");
+    log("🔑 Token utilisé :", authToken);
 
     if (!authToken) {
       throw new Error("⚠️ Aucun token disponible. Veuillez vous connecter.");
     }
-    console.log("getLexicons type:", typeof getLexicons);
+    log("getLexicons type:", typeof getLexicons);
     const lexicons = await getLexicons(authToken, "fr");
-    console.log("📚 Réponse brute de l'API :", lexicons);
+    log("📚 Réponse brute de l'API :", lexicons);
 
     if (!Array.isArray(lexicons) || lexicons.length === 0) {
       throw new Error("⚠️ Aucun lexique trouvé.");
@@ -216,7 +216,7 @@ async function displayLexiconsWithCheckbox(lexicons) {
   }
   lexiquesContainer.innerHTML = "";
   if (lexicons.length === 0) {
-    console.log("⚠️ Aucun lexique à afficher.");
+    log("⚠️ Aucun lexique à afficher.");
     lexiquesContainer.textContent = "Aucun lexique disponible.";
     return;
   }
@@ -313,12 +313,12 @@ async function displayLexiconsWithCheckbox(lexicons) {
 }
 
 function initModal() {
-  console.log("initModal appelé");
+  log("initModal appelé");
   const modalOverlay = document.getElementById("modalOverlay");
   const modalFullText = document.getElementById("modalFullText");
   const closeModalBtn = document.getElementById("closeModalBtn");
 
-  console.log("closeModalBtn =", closeModalBtn);
+  log("closeModalBtn =", closeModalBtn);
 
   if (!modalOverlay || !modalFullText || !closeModalBtn) {
     console.error("Les éléments modaux ne sont pas trouvés !");
@@ -326,7 +326,7 @@ function initModal() {
   }
 
   closeModalBtn.addEventListener("click", () => {
-    console.log("clic sur closeModalBtn !");
+    log("clic sur closeModalBtn !");
     closeDefinitionPopup();
   });
   modalOverlay.addEventListener("click", (event) => {
@@ -413,10 +413,10 @@ async function handleAddWordClick() {
 
   // 6) Envoi d’une seule requête pour tous les lexiques restants
   try {
-    console.log(`📡 Envoi de l'ajout du mot "${selectedWord}" dans les lexiques :`, lexiconsToAdd);
+    log(`📡 Envoi de l'ajout du mot "${selectedWord}" dans les lexiques :`, lexiconsToAdd);
     const result = await window.AddWord(authToken, selectedWord, lexiconsToAdd, false);
     
-    console.log("Réponse API :", result);
+    log("Réponse API :", result);
 
     // Rafraîchir l'UI et la liste des entrées
     await new Promise(resolve => setTimeout(resolve, 300));
@@ -441,16 +441,16 @@ async function handleAddWordClick() {
 // ▌ Réception des messages
 // ─────────────────────────────────────────────────────────────────────────────
 browser.runtime.onMessage.addListener(async (message) => {
-  console.log("📩 Message reçu dans sidebar.js :", message);
+  log("📩 Message reçu dans sidebar.js :", message);
   switch (message.action) {
     case "refreshUI":
-      console.log("🔄 Demande de rafraîchissement de la barre latérale.");
+      log("🔄 Demande de rafraîchissement de la barre latérale.");
       await refreshSidebarState();
       break;
 
     case "mot_selectionne":
       if (message.selectedText) {
-        console.log("🖋️ Mot sélectionné :", message.selectedText);
+        log("🖋️ Mot sélectionné :", message.selectedText);
         const selectedWordElement = document.getElementById("motSelectionne");
         if (selectedWordElement) {
           selectedWordElement.textContent = message.selectedText;
@@ -467,7 +467,7 @@ browser.runtime.onMessage.addListener(async (message) => {
 
     case "getDefinition":
       if (message.selectedText) {
-        console.log("📖 Recherche des définitions pour :", message.selectedText);
+        log("📖 Recherche des définitions pour :", message.selectedText);
         openBlock("definitionContent");
         await window.showDefinitions(message.selectedText);
       }
@@ -481,13 +481,13 @@ browser.runtime.onMessage.addListener(async (message) => {
 
     case "fetchWiktionaryDefinitionResponse":
       if (message.selectedText) {
-        console.log(`📖 Réception de la définition du Wiktionnaire pour '${message.selectedText}'`);
+        log(`📖 Réception de la définition du Wiktionnaire pour '${message.selectedText}'`);
         window.displayDefinitions(message.definitions);
       }
       break;
 
     case "showLexiconResult":
-      console.log("📚 Résultat des lexiques reçus :", message.lexicons);
+      log("📚 Résultat des lexiques reçus :", message.lexicons);
       window.displayLexiconResults(message.lexicons);
       break;
     
@@ -528,7 +528,7 @@ browser.runtime.onMessage.addListener(async (message) => {
 // ▌ DOMContentLoaded
 // ─────────────────────────────────────────────────────────────────────────────
 document.addEventListener("DOMContentLoaded", async () => {
-  console.log("📦 DOM entièrement chargé. Initialisation de la sidebar.");
+  log("📦 DOM entièrement chargé. Initialisation de la sidebar.");
   
   authToken = await getAuthTokenFromStorage();
   window.authToken = authToken;
@@ -545,13 +545,13 @@ document.addEventListener("DOMContentLoaded", async () => {
       openBlock("definitionContent");
       const selectedWord = document.getElementById("motSelectionne")?.textContent?.trim();
       if (selectedWord && selectedWord !== "Aucun mot sélectionné") {
-        console.log(`📩 Recherche des définitions pour '${selectedWord}'`);
+        log(`📩 Recherche des définitions pour '${selectedWord}'`);
         await window.showDefinitions(selectedWord);
       } else {
         console.warn("⚠️ Aucun mot sélectionné pour la recherche.");
       }
     });
-    console.log("✅ Bouton #chercherDef détecté dans le DOM.");
+    log("✅ Bouton #chercherDef détecté dans le DOM.");
     chercherDefButton.style.pointerEvents = "auto";
     chercherDefButton.style.display = "block";
     chercherDefButton.style.visibility = "visible";
diff --git a/src/utils/api.js b/src/utils/api.js
index c1bc41c1f1c05a0697308e289a0bcd623925925f..8eea9097b6312545f110f84955c5b27541728a71 100644
--- a/src/utils/api.js
+++ b/src/utils/api.js
@@ -1,4 +1,4 @@
-console.log("✅ api.js chargé correctement");
+log("✅ api.js chargé correctement");
 window.authToken = null;
 // ─────────────────────────────────────────────────────────────────────────────
 // ▌ Sélection de texte sur la page
@@ -30,9 +30,9 @@ async function callApi(url, authToken = null, method = 'GET', data = null) {
   if (authToken) headers.Authorization = `Bearer ${authToken}`;
 
   const fetchOptions = { method, headers };
-  console.log("Envoi de la requête vers :", url);
+  log("Envoi de la requête vers :", url);
   if (data) {
-    console.log("Body JSON :", JSON.stringify(data, null, 2));
+    log("Body JSON :", JSON.stringify(data, null, 2));
     fetchOptions.body = JSON.stringify(data);
   }
 
@@ -94,7 +94,7 @@ async function getAllCategoriesLexicons(authToken) {
     const resultsByCategory = await Promise.all(promises);
     const combined = resultsByCategory.flat();
 
-    console.log("✅ Lexiques récupérés (toutes catégories confondues) :", combined);
+    log("✅ Lexiques récupérés (toutes catégories confondues) :", combined);
     return combined;
   } catch (error) {
     console.error("❌ Erreur lors de la récupération multi-catégories :", error);
@@ -147,7 +147,7 @@ async function getAllLexiconWords(authToken) {
       allGraphiesByLexicon[lexiconName] = allGraphies;
     }
 
-    console.log("✅ Toutes les graphies récupérées :", allGraphiesByLexicon);
+    log("✅ Toutes les graphies récupérées :", allGraphiesByLexicon);
     return allGraphiesByLexicon;
   } catch (error) {
     console.error("❌ Erreur lors de la récupération des graphies des lexiques :", error);
@@ -175,7 +175,7 @@ async function getWiktionaryDefinition(word) {
     const page = pages ? Object.values(pages)[0] : null;
     const definition = page?.extract?.trim() || "Aucune définition trouvée.";
 
-    console.log(`📖 Définition trouvée pour '${word}':`, definition);
+    log(`📖 Définition trouvée pour '${word}':`, definition);
     return [definition];
   } catch (error) {
     console.error("Erreur lors de la récupération du Wiktionnaire :", error);
@@ -223,7 +223,7 @@ async function AddWord(authToken, selectedWord, lexiconIds, force = false) {
 
 window.callApi = callApi;
 window.getLexicons = getLexicons;
-console.log("getLexicons exposée, type:", typeof window.getLexicons);
+log("getLexicons exposée, type:", typeof window.getLexicons);
 window.getAllCategoriesLexicons = getAllCategoriesLexicons;
 window.getLexiconEntries = getLexiconEntries;
 window.getAllLexiconWords = getAllLexiconWords;
diff --git a/src/utils/definitions.js b/src/utils/definitions.js
index d29516074843c3e9fbe364ad685dbf2e303aa7b5..846ab12675e77221831b85e3885d17d0e4bd4cd2 100644
--- a/src/utils/definitions.js
+++ b/src/utils/definitions.js
@@ -16,7 +16,7 @@ window.lexiconMap = new Map();
 */
 async function fetchLexiconDefinitions(word) {
   try {
-    console.log(`🔍 Recherche des définitions de '${word}' dans les lexiques de l'utilisateur...`);
+    log(`🔍 Recherche des définitions de '${word}' dans les lexiques de l'utilisateur...`);
 
     if (!authToken) {
       console.warn("Aucun token disponible, impossible de requêter l'API protégée.");
@@ -33,7 +33,7 @@ async function fetchLexiconDefinitions(word) {
       throw new Error(`❌ Erreur API lors de la récupération des lexiques: ${lexResponse.statusText}`);
     }
     const userLexicons = await lexResponse.json();
-    console.log("🗂️ Lexiques de l'utilisateur :", userLexicons);
+    log("🗂️ Lexiques de l'utilisateur :", userLexicons);
 
     if (!Array.isArray(userLexicons) || userLexicons.length === 0) {
       console.warn("⚠️ Aucun lexique trouvé pour cet utilisateur.");
@@ -49,12 +49,12 @@ async function fetchLexiconDefinitions(word) {
           : `Lexique de groupe : ${lex.group?.name || "Inconnu"}`;
       lexiconMap.set(lex.id, lexiconName);
     });
-    console.log("📌 LexiconMap :", lexiconMap);
+    log("📌 LexiconMap :", lexiconMap);
 
     // 2) Pour chaque lexique, rechercher le mot en ajoutant target_lex
     const definitionsPromises = userLexicons.map(async (lex) => {
       const searchUrl = `https://babalex.lezinter.net/api/entry/search?graphy=${encodeURIComponent(word)}&language=fr&target_lex=${lex.id}`;
-      console.log(`🔎 Appel API pour le lexique ${lex.id} avec l'URL : ${searchUrl}`);
+      log(`🔎 Appel API pour le lexique ${lex.id} avec l'URL : ${searchUrl}`);
 
       const searchResponse = await fetch(searchUrl, {
         headers: { Authorization: `Bearer ${authToken}` }
@@ -71,7 +71,7 @@ async function fetchLexiconDefinitions(word) {
         return Number(entry.lexicon.id) === Number(lex.id);
       });
 
-      console.log(`Pour le lexique ${lex.id} (${lexiconMap.get(lex.id)}), entrées filtrées :`, filteredEntries);
+      log(`Pour le lexique ${lex.id} (${lexiconMap.get(lex.id)}), entrées filtrées :`, filteredEntries);
 
       return { lexiconId: lex.id, entries: filteredEntries };
     });
@@ -81,7 +81,7 @@ async function fetchLexiconDefinitions(word) {
     // 3) Parcourir les résultats et extraire les définitions
     let allDefinitions = [];
     results.forEach(result => {
-      console.log(`Pour le lexique ${result.lexiconId}, entrées filtrées :`, result.entries);
+      log(`Pour le lexique ${result.lexiconId}, entrées filtrées :`, result.entries);
       const lexiconId = result.lexiconId;
       const sourceName = lexiconMap.get(lexiconId) || `Lexique #${lexiconId}`;
 
@@ -114,7 +114,7 @@ async function fetchLexiconDefinitions(word) {
       });
     });
 
-    console.log("Résultat final filtré :", allDefinitions);
+    log("Résultat final filtré :", allDefinitions);
     return allDefinitions;
   } catch (error) {
     console.error("❌ Erreur générale lors de la récupération des définitions :", error);
@@ -128,7 +128,7 @@ async function fetchLexiconDefinitions(word) {
 */
 async function fetchWiktionaryDefinition(word) {
   try {
-    console.log(`🔍 Requête Wiktionnaire pour "${word}"...`);
+    log(`🔍 Requête Wiktionnaire pour "${word}"...`);
     if (!word || word.trim() === "") {
       throw new Error("⚠️ Mot vide, impossible d'envoyer la requête.");
     }
@@ -138,7 +138,7 @@ async function fetchWiktionaryDefinition(word) {
       throw new Error(`❌ Erreur API Wiktionnaire: ${response.statusText}`);
     }
     const data = await response.json();
-    console.log("📖 Réponse API (Wiktionnaire) :", data);
+    log("📖 Réponse API (Wiktionnaire) :", data);
 
     const pages = data.query?.pages;
     const page = pages ? Object.values(pages)[0] : null;
@@ -147,7 +147,7 @@ async function fetchWiktionaryDefinition(word) {
       ? page.extract.trim()
       : "⚠️ Aucune définition trouvée sur le Wiktionnaire.";
 
-    console.log("🌍 Définition Wiktionnaire extraite :", definitionText);
+    log("🌍 Définition Wiktionnaire extraite :", definitionText);
 
     return [
       {
@@ -176,7 +176,7 @@ const MAX_LENGTH = 200;
 * Affiche les définitions dans la barre latérale.
 */
 function displayDefinitions(definitions) {
-  console.log("📖 Affichage des définitions reçues :", definitions);
+  log("📖 Affichage des définitions reçues :", definitions);
   if (!Array.isArray(definitions)) return;
 
   const mesLexiquesList = document.getElementById("mesLexiquesList");
@@ -314,7 +314,7 @@ function closeDefinitionPopup() {
 * Puis fusionne les résultats.
 */
 async function combineDefinitions(word) {
-  console.log(`[combineDefinitions] Récupération des définitions pour "${word}"...`);
+  log(`[combineDefinitions] Récupération des définitions pour "${word}"...`);
 
   const results = await Promise.allSettled([
     fetchLexiconDefinitions(word),
@@ -328,7 +328,7 @@ async function combineDefinitions(word) {
 
   const allDefinitions = [...lexiconDefinitions, ...wiktionaryDefinitions];
 
-  console.log("📚 [combineDefinitions] Résultat fusionné :", allDefinitions);
+  log("📚 [combineDefinitions] Résultat fusionné :", allDefinitions);
 
   return allDefinitions;
 }
@@ -337,7 +337,7 @@ async function combineDefinitions(word) {
 * Récupère et affiche toutes les définitions (lexiques + Wiktionnaire).
 */
 async function showDefinitions(word) {
-  console.log(`[showDefinitions] Recherche + affichage pour "${word}"...`);
+  log(`[showDefinitions] Recherche + affichage pour "${word}"...`);
 
   const noDefinitionsContainer = document.getElementById("noDefinitionsContainer");
   if (noDefinitionsContainer) {
@@ -348,7 +348,7 @@ async function showDefinitions(word) {
   try {
     const allDefinitions = await combineDefinitions(word);
 
-    console.log("[showDefinitions] Définitions récupérées :", allDefinitions);
+    log("[showDefinitions] Définitions récupérées :", allDefinitions);
 
     if (!allDefinitions || allDefinitions.length === 0) {
       if (noDefinitionsContainer) {
@@ -381,7 +381,7 @@ async function showDefinitions(word) {
 * (sans Wiktionnaire), puis gérer l’affichage d’erreur ou non.
 */
 async function fetchDefinition(word) {
-  console.log(`🔍 Recherche de la définition pour '${word}'...`);
+  log(`🔍 Recherche de la définition pour '${word}'...`);
 
   const noDefinitionsContainer = document.getElementById("noDefinitionsContainer");
   if (!noDefinitionsContainer) {
@@ -391,7 +391,7 @@ async function fetchDefinition(word) {
 
   try {
     const definition = await fetchLexiconDefinitions(word);
-    console.log("🔍 Résultat API :", definition);
+    log("🔍 Résultat API :", definition);
 
     if (!definition || definition.length === 0) {
       console.warn(`⚠️ Aucune définition trouvée pour '${word}'`);
@@ -442,7 +442,7 @@ function displayLexiconResults(lexicons) {
     li.innerHTML = `<strong>${lexiconName}</strong>`;
     ul.appendChild(li);
 
-    console.log(`✅ Lexique ajouté : ${lexiconName} (ID: ${lexicon.id})`);
+    log(`✅ Lexique ajouté : ${lexiconName} (ID: ${lexicon.id})`);
   });
 
   resultDiv.appendChild(ul);
diff --git a/src/utils/logger.js b/src/utils/logger.js
new file mode 100644
index 0000000000000000000000000000000000000000..d404436b9790f4faf432bc5ccf8804da5011b41c
--- /dev/null
+++ b/src/utils/logger.js
@@ -0,0 +1,12 @@
+
+/**
+ * Mode debug : affiche les logs dans la console
+ * Mode prod : masque les logs
+*/
+const DEBUG = true; // false en prod
+
+function log(...args) {
+  if (DEBUG) {
+    console.log(...args);
+  }
+}
diff --git a/src/utils/stats.js b/src/utils/stats.js
index 8461906cbf83b559fe9f95a15159a9219baf82d3..114c788c9b7decdc3fef232789d513bb89e1f3eb 100644
--- a/src/utils/stats.js
+++ b/src/utils/stats.js
@@ -1,4 +1,4 @@
-console.log("Script stats.js chargé !");
+log("Script stats.js chargé !");
 (function () {
     if (window.hasRun) {
         return;
@@ -16,7 +16,7 @@ console.log("Script stats.js chargé !");
     function trackVisibleContent() {
         // pas de tracking tant que Pyodide n’est pas prêt
         if (!simplemmaReady) {
-            console.log("[Stats] Pyodide n'est pas encore prêt, attente...");
+            log("[Stats] Pyodide n'est pas encore prêt, attente...");
             return;
         }
 
@@ -44,7 +44,7 @@ console.log("Script stats.js chargé !");
                 text = cleanText(text); // nettoyage du texte avec cleanText
                 if (text.length > 10 && !seenContent.has(text)) {
                     seenContent.add(text);
-                    console.log("[Stats] Envoi du texte filtré au background.js :", text);
+                    log("[Stats] Envoi du texte filtré au background.js :", text);
     
                     browser.runtime.sendMessage({ command: "process-text", text: text });
                 }
@@ -74,7 +74,7 @@ console.log("Script stats.js chargé !");
         const { isTrackingActive: storedState } = await browser.storage.local.get("isTrackingActive");
         isTrackingActive = storedState ?? false;
 
-        console.log("[Stats] État initial récupéré :", isTrackingActive);
+        log("[Stats] État initial récupéré :", isTrackingActive);
 
         if (isTrackingActive) {
             startTracking();
@@ -84,13 +84,13 @@ console.log("Script stats.js chargé !");
     }
 
     function startTracking() {
-        console.log("[Stats] Suivi des statistiques activé.");
+        log("[Stats] Suivi des statistiques activé.");
         addViewportBorder();
         attachScrollListener();
     }
 
     function stopTracking() {
-        console.log("[Stats] Suivi des statistiques désactivé.");
+        log("[Stats] Suivi des statistiques désactivé.");
         removeViewportBorder();
         detachScrollListener();
     }
@@ -99,7 +99,7 @@ console.log("Script stats.js chargé !");
         if (!scrollListenerAttached) {
             window.addEventListener("scroll", trackVisibleContent);
             scrollListenerAttached = true;
-            console.log("[Stats] Écouteur de défilement attaché.");
+            log("[Stats] Écouteur de défilement attaché.");
         }
     }
 
@@ -107,7 +107,7 @@ console.log("Script stats.js chargé !");
         if (scrollListenerAttached) {
             window.removeEventListener("scroll", trackVisibleContent);
             scrollListenerAttached = false;
-            console.log("[Stats] Écouteur de défilement détaché.");
+            log("[Stats] Écouteur de défilement détaché.");
         }
     }
 
@@ -203,7 +203,7 @@ console.log("Script stats.js chargé !");
     // GESTION DES MESSAGES ------------------------------------------------------------------------------------------
     browser.runtime.onMessage.addListener((message) => {
         if (message.command === "pyodide-simplemma-ready") {
-            console.log("[Stats] Pyodide et Simplemma prêt, démarrage du scraping : ");
+            log("[Stats] Pyodide et Simplemma prêt, démarrage du scraping : ");
             simplemmaReady = true;
             initializeTrackingState(); // démarre le tracking une fois Pyodide prêt
         }
diff --git a/src/workers/pyodide_worker.js b/src/workers/pyodide_worker.js
index b76ab3a51f5d38ab7fc94f210f5f60c1cef48cb0..8d54367e1f44e23edf1903d56707a55620f29785 100644
--- a/src/workers/pyodide_worker.js
+++ b/src/workers/pyodide_worker.js
@@ -1,3 +1,5 @@
+importScripts('../utils/logger.js');
+
 // URL de la version Pyodide la plus récente
 const LATEST_BASE_URL = "https://cdn.jsdelivr.net/pyodide/v0.27.2/full/";
 
@@ -9,29 +11,29 @@ let simplemmaLoaded = false; // Variable indiquant si simplemma est déjà insta
 self.onmessage = async (event) => {
     const data = event.data;
 
-    console.log("[WebWorker] Message reçu du Background:", data);
+    log("[WebWorker] Message reçu du Background:", data);
 
     // Initialisation unique de Pyodide puis de Simplemma
     if (data.command === "pyodide-simplemma") {
         if (pyodideLoaded && simplemmaLoaded) {
-            console.log("[Worker] Pyodide et Simplemma déjà chargés.");
+            log("[Worker] Pyodide et Simplemma déjà chargés.");
             self.postMessage({ type: "pyodide-simplemma", status: "already_loaded", message: "Pyodide et Simplemma déjà en mémoire" });
             return;
         }
 
         try {
             if (!pyodideLoaded) {
-                console.log("[Worker] Chargement de Pyodide...");
+                log("[Worker] Chargement de Pyodide...");
                 importScripts(`${LATEST_BASE_URL}pyodide.js`);
                 pyodide = await loadPyodide({ indexURL: LATEST_BASE_URL });
                 await pyodide.loadPackage("lzma");
                 await pyodide.loadPackage("micropip");
                 pyodideLoaded = true;
-                console.log("[Worker] Pyodide chargé avec succès !");
+                log("[Worker] Pyodide chargé avec succès !");
             }
 
             if (!simplemmaLoaded) {
-                console.log("[Worker] Installation de simplemma...");
+                log("[Worker] Installation de simplemma...");
                 await pyodide.runPythonAsync(`
                     import micropip
                     import re  
@@ -65,7 +67,7 @@ self.onmessage = async (event) => {
           
                 `);
                 simplemmaLoaded = true;
-                console.log("[Worker] Simplemma installé avec succès !");
+                log("[Worker] Simplemma installé avec succès !");
             }
 
             // Envoyer confirmation au background script
@@ -79,7 +81,7 @@ self.onmessage = async (event) => {
 
     // Activer/désactiver les statistiques (stats.js)
     if (data.command === "toggle-stats") {
-        console.log(`[WebWorker] Statistiques ${data.isActive ? "activées" : "désactivées"}`);
+        log(`[WebWorker] Statistiques ${data.isActive ? "activées" : "désactivées"}`);
         return;
     }
 };