diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..4008de78b4c6cf5d9668e7ed38d9779e0809cf97
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 Lucie Bader, Alissa Sounalath
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
index 7ef22536e005fce9ee5f816852a50a1578d273c6..435b323a3866364c6335a1e05904d90bd546fb7d 100644
--- a/README.md
+++ b/README.md
@@ -1,34 +1,26 @@
-# balex2ff
-Un projet de plugin firefox qui interagirait avec [balex](https://balex.liris.cnrs.fr/)…
+# Extension Firefox - ff2balex
+Un projet de plugin Firefox qui interagit avec [BaLex](https://balex.liris.cnrs.fr/). Ce projet s'inscrit dans la continuité du projet [Lex:gaMe](https://aslan.universite-lyon.fr/projet-lex-game-233220.kjsp).
 
-## Resources
-* [solution pour échanger avec un script python](https://developer.mozilla.org/fr/docs/Mozilla/Add-ons/WebExtensions/Native_messaging)
-* [a-t-on besoin de scripts de contenu ? — probablement que oui](https://developer.mozilla.org/fr/docs/Mozilla/Add-ons/WebExtensions/Content_scripts)
+Toutes les informations sur **le fonctionnement et l'utilisation** de cette extension sont disponibles à partir de [cette page](https://gitlab.liris.cnrs.fr/lex-game/balex2ff/-/wikis/home).
 
-## Wiki Lex:gaMe
-> https://wiki.lezinter.net/_/LexgaMe:Ff2balex
+L'**installation** est à ce jour manuelle. La procédure est détaillée [ici](https://gitlab.liris.cnrs.fr/lex-game/balex2ff/-/wikis/Documentation/Utilisation-de-l'extension/Installation).
 
-## Licence
-> MIT ? à définir
-Plug-in réalisé dans le cadre du projet [Lex:gaMe](https://aslan.universite-lyon.fr/projet-lex-game-233220.kjsp)
+### Ressources
+* [Solution pour échanger avec un script python](https://developer.mozilla.org/fr/docs/Mozilla/Add-ons/WebExtensions/Native_messaging)
+* [A-t-on besoin de scripts de contenu ? — probablement que oui](https://developer.mozilla.org/fr/docs/Mozilla/Add-ons/WebExtensions/Content_scripts)
 
-## Installation de l'extension (module complémentaire temporaire)
-- Télécharger le dossier 'menu_extension'
-- Ouvrir Firefox et accéder aux modules complémentaires (Ctrl + Shift + A (Windows/Linux) ou Cmd + Shift + A (Mac))
-- Cliquer sur l'icône en haut à droite puis sur "Déboguer des modules"
-- Cliquer sur "Charger un module complémentaire temporaire"
-- Sélectionner le fichier 'manifest.json'
-- Pour veiller au bon fonctionnement du worker de l'extension, désactiver l'option "Utiliser toujours le mode de navigation privée" voir [lien](https://firefox-source-docs.mozilla.org/devtools-user/about_colon_debugging/index.html#service-workers-not-compatible). 
 
+### Crédits
+* [`link_to_balex.svg`](/src/assets/icons/Link_to_balex.svg) MIT https://www.svgrepo.com/svg/450128/external-link-s
+* TODO : mettre les autres crédits (dépendances — ex pyodide, images, fonts)
 
-## Connexion/Déconnexion de l'utilisateur via le menu de l'extension 
-Via un bouton de connexion/déconnexion dans le menu de l'extension, l'utilisateur accède à la page d'authentification de [Prisms](https://prisms.lezinter.net/fr/login), complète ses informations de connexion et doit cliquer sur "Se connecter avec BaLex". Le script récupère ensuite le token d'authentification et le stocke dans le LocalStorage.
-Si l'utilisateur clique sur le bouton "Se déconnecter" de l'extension, le token est supprimé.
 
-## Activation des statistiques : 
-Cliquer sur le bouton "Activer les statistiques".
-Lorsqu’un utilisateur se connecte, il peut activer l'ajout automatique des mots dans les lexiques personnels sélectionnés et fixer un seuil d'ajout (Cliquer sur le bouton "Valider" après avoir fixé un seuil et sélectionné au moins une langue).
+**Police utilisée : Luciole**  
+Conçue spécifiquement pour les personnes malvoyantes.  
+© Laurent Bourcellier & Jonathan Perez – Distribuée gratuitement sous la [Licence Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0/legalcode.fr).  
+Source : [Luciole Vision](https://luciole-vision.com/)
+
+
+**Icônes**  
+Création des icônes d'options sur [icones8](https://icones8.fr/icons)
 
-## Crédits
-* [`link_to_balex.svg`](/src/assets/icons/Link_to_balex.svg) MIT https://www.svgrepo.com/svg/450128/external-link-s
-* TODO : mettre les autres crédits (dépendances — ex pyodide, images, fonts)
diff --git a/src/background/background.js b/src/background/background.js
index 2ad660a35280c702f3baba04c7e748145894c6d9..98054e48151f5a2f390eb3056285e7c8f257ee46 100644
--- a/src/background/background.js
+++ b/src/background/background.js
@@ -84,14 +84,14 @@ async function isUserConnected() {
  * Envoie un message pour demander le rafraîchissement de l'UI.
  * @returns {Promise<void>}
  */
-  async function refreshAllUI() {
-    log("Rafraîchissement global de l'UI...");
-    try {
-      await browser.runtime.sendMessage({ action: "refreshUI" });
-    } catch (error) {
-      console.warn("Aucun récepteur pour 'refreshUI' :", error);
-    }
+async function refreshAllUI() {
+  log("Rafraîchissement global de l'UI...");
+  try {
+    await browser.runtime.sendMessage({ action: "refreshUI" });
+  } catch (error) {
+    console.warn("Aucun récepteur pour 'refreshUI' :", error);
   }
+}
 
 // ─────────────────────────────────────────────────────────────────────────────
 // Fonctions d'authentification & de redirection
diff --git a/src/plugin/plugin.js b/src/plugin/plugin.js
index af6a599f77a48f686eb3611e4ae522eed9076af5..91d6795a4b750df0fe112b2890cca74412785c17 100644
--- a/src/plugin/plugin.js
+++ b/src/plugin/plugin.js
@@ -1,16 +1,11 @@
-log("plugin.js chargé");
-// fetchExtensionState() : fonction qui se charge de récupérer les valeurs du local storage
-// updateUI(): utilise les états récupérés par fetchExtensionState pour appeler d'autres fonctions
-// ex. actualisation du bouton de connexion, bouton activer l'extension, les stats...
-// setupEventListeners() : fonction qui regroupe les écouteurs d'évènement
-// handleEvent() : une description de chaque évènement avec les changements de valeur du local storage
-
-
-// ====================================================================================
-// Fonctions utilitaires
-// ====================================================================================
-
-//Obtenir le token
+log("plugin.js chargé.");
+// ─────────────────────────────────────────────────────────────────────────────
+// ▌ Fonctions utilitaires
+// ─────────────────────────────────────────────────────────────────────────────  
+/**
+ * Récupère le token d'accès depuis le stockage local.
+ * @returns {Promise<string>} Le token d'accès.
+ */
 async function getAccessToken() {
   const { accessToken } = await browser.storage.local.get("accessToken");
   return accessToken;
@@ -272,9 +267,20 @@ async function updateConnectionButton() {
     tooltip.textContent = "En vous connectant, vous pourrez accéder à vos lexiques personnels, ainsi qu'aux fonctionnalités d'ajout automatique et de statistiques d'utilisation.";
     button.appendChild(tooltip);
   }
+
+  // Gestion du clic sur le bouton
+  button.onclick = async () => {
+    await browser.runtime.sendMessage({ action: "toggleAuth" }); // Envoi d'un message pour changer l'état d'authentification
+    await updateConnectionButton(); // Mise à jour du bouton après le changement d'état
+  };
 }
 
-// Gestion de la sélection des langues
+// ─────────────────────────────────────────────────────────────────────────────
+// ▌ Gestion de la sélection des langues
+// ─────────────────────────────────────────────────────────────────────────────
+/**
+ * Met à jour la sélection des langues.
+ */
 async function updateLanguageSelection() {
   const languageSelection = document.getElementById("language-selection");
   languageSelection.innerHTML = "<p id='loading-languages' style='color: gray;'>Chargement...</p>";
@@ -311,15 +317,14 @@ async function updateLanguageSelection() {
     langButton.classList.add("lang-option");
     langButton.textContent = lang.toUpperCase();
     langButton.dataset.value = lang;
-
+    // Vérification si la langue est suivie
     if (trackedLanguages && trackedLanguages.includes(lang)) {
       langButton.classList.add("selected");
     }
-
+    // Gestion du clic sur le bouton de langue
     langButton.addEventListener("click", () => {
       langButton.classList.toggle("selected");
     });
-
     languageSelection.appendChild(langButton);
   });
 
@@ -399,15 +404,22 @@ async function updateToggleExtensionButton(isLoggedIn, extensionActive, autoAdd,
   const autoAddOptions = document.getElementById("auto-add-options");
   const saveOptionsBtn = document.getElementById("save-options");
 
+  // Affichage ou masquage du conteneur d'ajout automatique
   if (autoAddContainer) {
     autoAddContainer.style.display = (isLoggedIn && extensionActive) ? "block" : "none";
   }
+
+  // Mise à jour de l'état de la case à cocher d'ajout automatique
   if (autoAddCheckbox && isLoggedIn) {
     autoAddCheckbox.checked = autoAdd;
   }
+
+  // Affichage ou masquage des options d'ajout automatique
   if (autoAddOptions) {
     autoAddOptions.classList.toggle("hidden", !autoAdd);
   }
+
+  // Affichage ou masquage du bouton de sauvegarde des options
   if (saveOptionsBtn) {
     saveOptionsBtn.classList.toggle("hidden", !autoAdd);
   }
@@ -484,9 +496,9 @@ browser.storage.onChanged.addListener((changes, area) => {
   }
 });
 
-// ==========================
-// Gestion des notifications
-// ==========================
+/**
+ * Affiche une notification.
+ */
 function showNotification(message) {
   const notificationBox = document.getElementById("extension-notification");
   const notificationText = document.getElementById("notification-text");
@@ -499,10 +511,13 @@ function showNotification(message) {
       notificationBox.classList.add("hidden");
     }, { once: true });
   } else {
-    log("❌ Impossible d'afficher la notification : élément manquant.");
+    log("Impossible d'afficher la notification : élément manquant.");
   }
 }
 
+/**
+ * Gère les messages reçus du worker.
+ */
 function handleWorkerMessage(event) {
   const data = event.data;
   log("[Background] Message du WebWorker :", data);
diff --git a/src/utils/api.js b/src/utils/api.js
index aab435f4e68c12c562592d3cfcd42a873548c767..bf833a23530ef542724ba837c32b667943f39916 100644
--- a/src/utils/api.js
+++ b/src/utils/api.js
@@ -140,6 +140,8 @@ async function getAllLexiconWords(authToken) {
 // ─────────────────────────────────────────────────────────────────────────────
 /**
  * Récupère une définition du Wiktionnaire.
+ * @param {string} word - Le mot dont on veut la définition.
+ * @returns {Promise<string[]>} - Une promesse contenant la définition trouvée.
  */
 async function getWiktionaryDefinition(word) {
   try {
diff --git a/src/utils/definitions.js b/src/utils/definitions.js
index 3329f20166f0bd0d989af01408394c31499687bd..d8ff193d60da2a0cbceb271731b6b58b08dfd646 100644
--- a/src/utils/definitions.js
+++ b/src/utils/definitions.js
@@ -5,15 +5,10 @@
 window.lexiconMap = new Map();
 
 /**
-* Récupère les définitions d'un mot dans les lexiques de l'utilisateur (ex. user_id=4),
-* en effectuant un appel global à l'API pour le mot recherché, puis en filtrant
-* les entrées pour ne conserver que celles dont le lexicon.id est présent dans la liste
-* des lexiques de l'utilisateur.
-*
-* Retourne un tableau d'objets { source, text } où:
-*   - source = nom du lexique (ou "Lexique #ID")
-*   - text = texte de la définition
-*/
+ * Récupère les définitions d'un mot dans les lexiques de l'utilisateur.
+ * @param {string} word - Le mot dont on veut les définitions.
+ * @returns {Promise<object[]>} - Un tableau d'objets contenant les définitions.
+ */
 async function fetchLexiconDefinitions(word) {
   try {
     log(`🔍 Recherche des définitions de '${word}' dans les lexiques de l'utilisateur...`);
@@ -611,8 +606,9 @@ async function combineDefinitions(word) {
 }
 
 /**
-* Récupère et affiche toutes les définitions (lexiques + Wiktionnaire).
-*/
+ * Récupère et affiche toutes les définitions (lexiques + Wiktionnaire).
+ * @param {string} word - Le mot dont on veut les définitions.
+ */
 async function showDefinitions(word) {
   log(`[showDefinitions] Recherche + affichage pour "${word}"...`);
 
@@ -642,11 +638,11 @@ async function showDefinitions(word) {
     return allDefinitions;
 
   } catch (error) {
-    log("❌ [showDefinitions] Erreur : ", error);
+    log("[showDefinitions] Erreur : ", error);
 
     if (noDefinitionsContainer) {
       noDefinitionsContainer.textContent =
-        "❌ Une erreur est survenue lors de la récupération des définitions.";
+        "Une erreur est survenue lors de la récupération des définitions.";
       noDefinitionsContainer.style.display = "block";
     }
     return [];
@@ -654,21 +650,22 @@ async function showDefinitions(word) {
 }
 
 /**
-* Appel direct pour récupérer les définitions d'un mot uniquement via l'API
-* (sans Wiktionnaire), puis gérer l'affichage d'erreur ou non.
-*/
+ * Appel direct pour récupérer les définitions d'un mot uniquement via l'API
+ * (sans Wiktionnaire), puis gérer l'affichage d'erreur ou non.
+ * @param {string} word - Le mot dont on veut la définition.
+ */
 async function fetchDefinition(word) {
   log(`🔍 Recherche de la définition pour '${word}'...`);
 
   const noDefinitionsContainer = document.getElementById("noDefinitionsContainer");
   if (!noDefinitionsContainer) {
-    log("❌ Élément #noDefinitionsContainer introuvable.");
+    log("Élément #noDefinitionsContainer introuvable.");
     return;
   }
 
   try {
     const definition = await fetchLexiconDefinitions(word);
-    log("🔍 Résultat API :", definition);
+    log("Résultat API :", definition);
 
     if (!definition || definition.length === 0) {
       console.warn(`⚠️ Aucune définition trouvée pour '${word}'`);
@@ -678,13 +675,14 @@ async function fetchDefinition(word) {
 
     noDefinitionsContainer.style.display = "none";
   } catch (error) {
-    log("❌ Erreur lors de la récupération de la définition :", error);
+    log("Erreur lors de la récupération de la définition :", error);
     noDefinitionsContainer.style.display = "block";
   }
 }
 
 /**
-* Affiche les lexiques où le mot sélectionné est présent.
+ * Affiche les lexiques où le mot sélectionné est présent.
+ * @param {object[]} lexicons - Les lexiques où le mot est présent.
 */
 function displayLexiconResults(lexicons) {
   const resultDiv = document.getElementById("lexiconResult");
@@ -693,7 +691,7 @@ function displayLexiconResults(lexicons) {
   resultDiv.innerHTML = "";
 
   if (!lexicons || lexicons.length === 0) {
-    resultDiv.textContent = "❌ Ce mot n'est présent dans aucun lexique.";
+    resultDiv.textContent = "Ce mot n'est présent dans aucun lexique.";
     return;
   }
   const title = document.createElement("p");
diff --git a/src/utils/highlighting.js b/src/utils/highlighting.js
index 1bdcacc684a146e402ed79abb7ff072466802319..6391763a890f1b149bec182845e403574d205273 100644
--- a/src/utils/highlighting.js
+++ b/src/utils/highlighting.js
@@ -663,4 +663,3 @@ log("Initialisation de highlighting.js");
         log("Erreur critique dans l'IIFE:", error);
     }
 })();
-
diff --git a/src/utils/stats.js b/src/utils/stats.js
index 7f1d2b12cb6100cd7d0735a37b4904574b1560db..1ced5bf503bc3e4db1bb694775e9176af4bc88b0 100644
--- a/src/utils/stats.js
+++ b/src/utils/stats.js
@@ -119,25 +119,12 @@
                 if (!readContent.has(text)) {
                     startReadingTimer(element, text, minReadTime);
                 }
-                // highlightElement(element, true);
             } else {
                 stopReadingTimer(element, text);
-                // highlightElement(element, false);
             }
         });
     }
     
-    // /**
-    //  * Ajoute une bordure rouge autour de l'élément
-    //  */
-    // function highlightElement(element, shouldHighlight) {
-    //     if (shouldHighlight) {
-    //         element.style.outline = "3px solid red";
-    //     } else {
-    //         element.style.outline = "";
-    //         removeReadingIndicator(element);
-    //     }
-    // }
     
     /**
      * Démarre un chronomètre pour vérifier si l'élément est lu
diff --git a/stoplist_fr.txt b/stoplist_fr.txt
new file mode 100644
index 0000000000000000000000000000000000000000..36fa27bf0ff4d49b4beb3c965986e4770af75be8
--- /dev/null
+++ b/stoplist_fr.txt
@@ -0,0 +1,116 @@
+alors
+au
+aucuns
+aussi
+autre
+avant
+avec
+avoir
+bon
+car
+ce
+cela
+ces
+ceux
+chaque
+ci
+comme
+comment
+dans
+des
+du
+dedans
+dehors
+depuis
+devrait
+doit
+donc
+dos
+début
+elle
+elles
+en
+encore
+essai
+est
+et
+eu
+fait
+faites
+fois
+font
+hors
+ici
+il
+ils
+je
+juste
+la
+le
+les
+leur
+là
+ma
+maintenant
+mais
+mes
+mien
+moins
+mon
+mot
+même
+ni
+nommés
+notre
+nous
+ou
+où
+par
+parce
+pas
+peut
+peu
+plupart
+pour
+pourquoi
+quand
+que
+quel
+quelle
+quelles
+quels
+qui
+sa
+sans
+ses
+seulement
+si
+sien
+son
+sont
+sous
+soyez
+sujet
+sur
+ta
+tandis
+tellement
+tels
+tes
+ton
+tous
+tout
+trop
+très
+tu
+voient
+vont
+votre
+vous
+vu
+ça
+étaient
+état
+étions
+été
+être
\ No newline at end of file