Changelog

Suivez l'évolution de VitaPulse — nouvelles fonctionnalités, améliorations et corrections.

À venir
v2.31.02026-06-27
  • AjoutéConsentement aux cookies (RGPD) + Google Consent Mode v2 — Google Analytics démarre désormais avec un consentement par défaut refusé (ad_storage, ad_user_data, ad_personalization, analytics_storage à denied, wait_for_update: 500) ; aucun cookie de mesure ou publicitaire n'est posé tant que l'utilisateur n'a pas accepté. Une bannière de consentement (composant CookieConsent, montée globalement) propose deux boutons de présentation équivalente — « Accepter » et « Refuser » (exigence CNIL d'équité) — avec lien vers la politique cookies ; le choix est mémorisé 6 mois dans le cookie vp_consent et réappliqué via gtag('consent','update'). Un lien « Gérer les cookies » dans le pied de page permet de rouvrir la bannière et de modifier son choix à tout moment. Textes traduits dans les 5 locales.
  • AjoutéPolitique cookies mise à jour — la page /legal/cookies (et la section cookies de la politique de confidentialité + la meta-description) a été réécrite pour refléter le nouveau système : nom réel du cookie de session (e-xode.vitapulse.sid), GA4 via Consent Mode v2 avec signaux refusés par défaut, documentation du cookie vp_consent (rétention 180 jours, SameSite=Lax), description de la bannière et du retrait du consentement, périmètre 5 locales ; suppression des mentions devenues fausses (« aucune bannière », « aucun cookie analytique »).
  • AjoutéNavigation projet multi-features — chaque page projet affiche désormais une barre de navigation partagée et persistante (onglets Material) : Scans / Scenarios / Discussions / Settings, posée sous le bandeau projet (ProjectNav). Prépare l'arrivée de la 2ᵉ feature « Scenarios ».
  • AjoutéFeature Scénarios (socle) — nouvelle feature de monitoring de parcours utilisateur sur /$lang/app/projects/:id/scenarios. Définissez un scénario (suite d'étapes : aller à, cliquer, saisir, et assertions « voir tel texte / tel écran ») via un constructeur en formulaire, lancez-le à la demande, et obtenez un résultat pass/fail par étape avec captures d'écran, rejoué par le moteur Playwright déjà utilisé pour les scans. Cibles décrites en langage humain (bouton/champ/texte par libellé, sans CSS). Historique des runs par scénario. Limites par plan (scénarios par projet + runs/mois, compteur mensuel).
  • ModifiéSEO — redirection 301 de la racineGET / renvoie désormais une vraie redirection HTTP 301 vers /${DEFAULT_LOCALE} (/en), au lieu de répondre 200 en rendant le contenu de /en. Consolide le signal de crawl (le canonical pointait déjà vers /en) et économise le budget d'exploration. La détection de locale côté client reste active lors de la navigation dans la SPA.
  • ModifiéRenommage de la page projet overview en scans/$lang/app/projects/:id/overview devient /$lang/app/projects/:id/scans ; l'ancienne URL redirige automatiquement (bookmarks et liens d'e-mails préservés). Tous les liens internes (tableau de bord, quick-audit, création de projet, vérification de code, e-mails de partage et d'invitation) pointent vers /scans.
  • ModifiéBouton « New Scan » déplacé dans la page Scans — il n'apparaît plus que sur la liste des scans (absent du détail d'un scan), aligné à droite après le sélecteur mobile/desktop, au lieu d'être dans le menu projet.
  • ModifiéRéorganisation des onglets Settings — la page Réglages passe à 4 onglets adressables par URL (?tab=) : General (informations du projet + zone de danger), Scans (pages surveillées + alertes & fréquence), Scenarios (à venir), Associates (inchangé).
  • ModifiéFeature Scénarios derrière un flag (désactivée par défaut) — l'ensemble de la feature Scénarios est désormais conditionné par la variable d'environnement FEATURE_SCENARIOS (défaut false). Tant qu'elle n'est pas à true, la feature est masquée de bout en bout : onglet Scenarios absent de la navigation projet et des Réglages, route /$lang/app/projects/:id/scenarios non déclarée (404), et routes API scenarios / scenario-runs non enregistrées. La passer à true (présente au build) réactive l'ensemble.
  • CorrigéSEO — soft-404 sur les articles inexistants — une URL /{locale}/news/{id} dont l'article est introuvable ou non publié renvoie désormais un statut HTTP 404 (au lieu de 200 avec des métadonnées génériques), évitant que Google n'explore/indexe des pages fantômes.
  • Sécuriténpm audit — high résolus — élimination des 3 advisories high détectés par le gate CI (npm audit --omit=dev --audit-level=high). Mises à jour non-breaking lockfile-only (dans les ranges existants) pour multer (DoS), dompurify et markdown-it ; bump direct nodemailer ^8.0.5^9.0.1 (injection CRLF d'en-têtes, SSRF/lecture de fichier via l'option raw/jsonTransport — usage SMTP standard inchangé) ; ajout d'un override ws ^8.18.3 forçant le ws@7.5.10 transitif de lighthouse vers 8.21.0 (DoS par fragmentation) sans downgrader Lighthouse. Restent 17 advisories moderate dans la chaîne transitive @opentelemetry/* → @sentry/node → lighthouse, non bloquantes et seulement corrigeables en downgradant Lighthouse (écarté). Build + 17 tests unitaires OK.
v2.30.12026-06-07
  • Sécuriténpm audit → 0 — non-breaking dependency updates (lockfile only, no package.json range
v2.30.02026-06-06
  • SécuritéNon-root container — the production image now runs as the built-in non-root node user (UID/GID 1000) instead of root. The runner stage chowns /app + /home/node (which also re-establishes node ownership of the Playwright/Chromium cache that npx playwright install wrote as root) and adds USER node; supervisord's pidfile moved /run/tmp to work unprivileged. Chromium already launches with --no-sandbox, and the audit/scan crons run via docker exec … node as the container user, so both keep working. Reduces the blast radius of any RCE. Operational note: the host bind-mounts /home/e-xode.vitapulse/{logs,public} must be owned 1000:1000 (applied by the deploy script) or sessions/uploads/audit-scratch cannot be written.
v2.29.02026-06-03
  • ModifiéLiens de documentation cliquables dans les descriptions d'audit Lighthouse — les liens Markdown présents dans les descriptions d'audit Lighthouse (par ex. « [Learn more](…) ») sont désormais rendus en vrais liens <a> cliquables au lieu d'afficher la syntaxe Markdown brute. Appliqué de façon cohérente sur le rapport public, l'affichage du scan dans l'application et le PDF (modes brandé et white-label), via les helpers mdLinksToHtml/stripMd (src/shared/utils.js).
  • CorrigéDébordement des onglets de facturation sur mobile — la barre d'onglets de la page Facturation débordait horizontalement sur les petits écrans. Ajout de show-arrows pour permettre le défilement des onglets, supprimant le débordement.
v2.28.02026-06-03
  • ModifiéImage de couverture par défaut pour les actualités — chaque article sans coverImage (et tout article dont l'image de couverture échoue à charger) affiche désormais la couverture de marque news-default.png (1200×630) au lieu d'une icône générique, d'un emplacement vide ou d'une image cassée — en liste (/news), sur l'aperçu du tableau de bord et sur la page article. La même image alimente le og:image par défaut (public/og-image.png) pour le partage social des pages sans visuel propre.
v2.27.42026-06-03
  • CorrigéLien de documentation cassé (Permissions-Policy / géolocalisation) — la référence « Permission UX - web.dev » de la vulnérabilité geolocation-on-start pointait vers https://web.dev/articles/permission-ux, désormais en 404 (article déplacé). Remplacée par https://web.dev/articles/permissions-best-practices (équivalent, 200) dans les 4 locales concernées (en, fr, es, de).
v2.27.32026-06-02
  • CorrigéCapture du rapport au bon format d'appareil — la capture du site affichée sur l'onglet Desktop était en réalité prise en largeur mobile étroite (~770 px, layout mobile), identique à l'onglet Mobile : une page étroite et démesurément haute. La capture est désormais prise nous-mêmes via Playwright à la largeur réelle de l'appareil (1350 px desktop, 412 px mobile, depuis LIGHTHOUSE_CONFIG), donnant un vrai rendu desktop sur l'onglet Desktop. Hauteur bornée à 8000 px (haut de page) pour rester léger et fiable en mémoire : desktop ~88 Ko, mobile ~223 Ko (contre 640 Ko auparavant). Libellé honnête « Capture (haut de page) » quand la page est tronquée.
  • CorrigéManifest PWA — screenshots fantômes — le public/manifest.json référençait screenshot-desktop.png / screenshot-mobile.png (champ screenshots optionnel) qui n'existent pas, provoquant des 404 et un warning dans la console du navigateur. Tableau screenshots retiré (sans impact fonctionnel ; l'écran d'installation PWA n'affichera simplement pas d'aperçus).
v2.27.22026-06-02
  • CorrigéCapture de secours quand le full-page Lighthouse échoue — sur les pages très hautes en environnement contraint en mémoire (typiquement la prod), le gatherer de capture pleine page de Lighthouse échouait silencieusement (fullPageScreenshot null), et le rapport retombait sur le minuscule screenshot viewport (« un petit bout de page »). Désormais, dans ce cas, une capture de secours via Playwright à hauteur bornée (haut 6000 px, downscalée) fournit un grand screenshot utile. Libellé honnête « Capture (haut de page) » quand la page a été tronquée, sinon « Capture pleine page ». La capture de secours est plus légère que la tentative de Lighthouse, donc fiable même en mémoire contrainte.
v2.27.12026-06-02
  • CorrigéCapture pleine page et Baseline désormais réellement enregistrées — les champs annotations (capture pleine page + calques LCP/CLS) et baselineFeatures, introduits en 2.27.0, étaient calculés pendant le scan mais jamais persistés (oubliés dans le $set de sauvegarde, src/services/lighthouse/index.js) ni renvoyés par l'API publique de scan (absents de la projection PUBLIC_SCAN_PROJECTION, src/api/scans/get.js). La capture pleine page annotée et la section Baseline n'apparaissaient donc jamais. Corrigé : les nouveaux scans les enregistrent et les affichent (les anciens scans restent sans, faute de données).
  • ModifiéAffichage de la capture du site dans le rapport — vignette compacte cliquable (montrant le haut de la page, titre visible) ouvrant la capture en grand dans une surcouche (avec les calques LCP/CLS quand disponibles). Libellés honnêtes distinguant la vraie capture pleine page de l'aperçu viewport basse résolution de Lighthouse (plus de « pleine page » trompeur).
  • ModifiéCapture pleine page allégée avant stockage — downscale via sharp (largeur ~500 px, JPEG q50) appliqué sur le chemin de scan, réduisant la taille des documents de scan (~-23 %, ex. 2548 → 1963 Ko ; capture mobile 494 → 315 Ko). Les dimensions d'origine sont conservées en métadonnées pour que le positionnement des calques reste correct. Ajout de la dépendance runtime sharp.
v2.27.02026-06-02
  • AjoutéRapports PDF navigables et accessibles — les PDF de scan embarquent désormais un sommaire de signets (outline) et sont générés en PDF balisé (tagged/accessible). L'arborescence des signets suit la hiérarchie de titres du rapport : appareil (Mobile/Desktop) → section → sous-section, identique en modes brandé et white-label. Activé via page.pdf({ tagged, outline }) dans generatePdf() (src/api/scans/downloadPdf.js) ; le titre d'appareil passe en h1 dans pdfTemplate.js (changement de balise neutre visuellement, le style étant piloté par classe).
  • AjoutéCapture d'écran annotée LCP/CLS — le rapport affiche désormais la capture pleine page du site avec un calque surlignant l'élément LCP (best-effort, quand disponible) et les éléments responsables du CLS, basculable. Mirroré dans le PDF (modes brandé et white-label). Nécessite l'activation du full-page screenshot Lighthouse.
  • AjoutéCascade réseau (waterfall) — nouvelle visualisation requête-par-requête (barres positionnées par timings, couleur par type de ressource) au-dessus de la table réseau existante, dans le rapport et le PDF.
  • AjoutéSection « Baseline web features » — liste des fonctionnalités de la plateforme web utilisées par la page et leur statut de disponibilité Baseline (widely / newly / limited), issue du nouvel audit baseline de Lighthouse 13.3. Présente dans le rapport et le PDF.
  • ModifiéPlaywright (dépendance runtime) — plancher relevé ^1.40.0^1.60.0 — Chromium embarqué porté à 148.0.7778.96. Ce Chromium étant aussi le moteur des audits Lighthouse, les scores/diagnostics peuvent légèrement varier sur une même URL (nouvelles API plateforme, audits dépréciés) — à considérer comme une dérive de mesure attendue, pas une régression. Aucun changement de l'API consommée (PDF/scan/screenshots).
  • ModifiéLighthouse (dépendance runtime) — plancher relevé ^13.0.0^13.3.0 — vérification empirique d'un scan réel : aucun audit retiré, 4 audits ajoutés (autocomplete-valid, presentation-role-conflict, svg-img-alt, baseline), catégories inchangées, dérive de scores nulle à minime (à considérer comme une variation de mesure attendue). Le full-page screenshot Lighthouse est désormais activé (disableFullPageScreenshot: false) pour alimenter les annotations LCP/CLS, ce qui augmente légèrement la taille des scans stockés (~+60 Ko/appareil).
  • ModifiéOnglets appareil par défaut sur Desktop — l'affichage des résultats de scan (détails, rapport partageable, vue projet, admin) sélectionne désormais Desktop par défaut quand aucun choix utilisateur n'a été fait, avec repli automatique sur Mobile si seules les données mobiles existent.
  • ModifiéFinition visuelle des pages publiques — rythme d'espacement homogénéisé entre rubriques (écart titre→contenu cohérent avec ou sans sous-titre, frontières entre sections de même fond, paddings symétriques, hero mobile), survols de cartes ramenés à l'archétype canonique (plus d'ombre colorée sur les grilles de contenu), couleurs sémantiques de score réservées aux vraies valeurs de score, et boutons d'action principaux passés au dégradé cyan→violet.
  • CorrigéPage Contact (crash SSR) — le caractère @ du libellé d'email (you@company.com et variantes localisées) était interprété par vue-i18n comme une directive de message lié, provoquant une erreur de compilation et une page blanche. Échappé en {'@'} dans les 5 locales (plus les emails des pages légales).
  • CorrigéChangelog (rendu) — les entrées affichaient le markdown brut (gras, ` code `) ; elles sont désormais rendues en HTML sûr (échappement puis conversion). Ajout du libellé de catégorie « Content » manquant (5 locales) et correction du débordement de texte des cartes sur mobile.
  • CorrigéNews (rendu SSR + couvertures) — la liste d'actualités n'était pas rendue côté serveur (spinner au premier affichage, invisible pour les crawlers) ; elle est désormais pré-chargée en SSR avec transfert d'état serveur→client (window.__VP_SSR__) évitant tout re-fetch et désalignement d'hydratation. Les images de couverture manquantes affichent un visuel de remplacement de marque au lieu d'une image cassée.
v2.26.02026-06-01
  • ContenuSite news article — pricing and Agency plan launch — Article published to the news MongoDB collection in all 5 locales (EN/FR/ES/DE/IT). Covers the four-tier pricing structure (Free/Pro/Business/Agency), corrected quotas, regression alerts on Business and Agency, and the Agency white-label PDF feature. coverImage is null — a human follow-up is needed to add a cover image via the admin panel.
v2.25.02026-05-31
  • AjoutéPage auteur (E-E-A-T) — nouvelle page publique /author/christophe-bragard (bio rédigée à la première personne, photo, expertise, lien LinkedIn), traduite dans les 5 langues, avec schéma JSON-LD ProfilePage/Person. L'auteur des articles de news est enrichi en Person (rôle, photo, sameAs LinkedIn) et la byline des articles renvoie désormais vers la page auteur. Entrée ajoutée au sitemap. Renforce les signaux d'auteur pour le SEO.
  • ModifiéBadge hero — « Powered by Google Lighthouse » devient « Runs on Google Lighthouse » (et désormais correctement traduit en allemand et italien, auparavant restés en anglais)
  • ModifiéRefonte du copy marketing anglais (src/translate/en.json) — réécriture ciblée de tous les espaces de noms visibles publiquement (landing, pricing, quickAudit, agencies, developers, coreWebVitals, caseStudies, about, author, security, docs, contact, footer, nav, errors 404) et de toutes les entrées meta.* SEO (title/description/keywords) pour les routes publiques et légales. Correction des nombres de plan obsolètes (« 5 scores » → 4, pages/projet alignées sur const.js), suppression de FID (remplacé par INP), conformité au guide éditorial (zéro flèche →, zéro buzzword de la liste noire). Source pour la propagation vers les 5 locales via l'agent translate.
  • ModifiéRéécriture du copy marketing français (src/translate/fr.json) — mise à parité avec l'anglais sur les mêmes espaces de noms (landing, pricing, quickAudit, agencies, developers, coreWebVitals, caseStudies, about, author, security, docs, contact, footer, nav, errors, meta.*). Vouvoiement uniformisé sur l'ensemble du fichier. Voix fondateur (Christophe Bragard, première personne) sur about/author/takeaways. Tous les nombres de plan mis à jour (plans/pages/scans/historique). legal.terms.plans.content inclut désormais le plan Agency. Parité de clés exacte : 1 701 valeurs feuilles EN = FR. Zéro flèche.
  • ModifiéPropagation du copy marketing en espagnol, allemand et italien (es/de/it.json) — re-localisation native et idiomatique des mêmes espaces de noms marketing et des entrées meta.* depuis la source anglaise. Correction de nombres erronés et de statistiques inventées dans les anciennes FAQ, alignement des libellés (4 scores, 6 Core Web Vitals, historiques 30/180/365/730 jours, 10 sièges). Conventions par langue respectées (ES tú, DE Sie + noms capitalisés, IT Lei). Parité de clés stricte sur les 5 locales (1 701 clés), zéro flèche.
  • ModifiéVouvoiement français sur tout le produit — bascule du tutoiement au vouvoiement pour l'ensemble de src/translate/fr.json (interface app, tableau de bord, authentification, facturation, erreurs de paiement, rapports) en plus des pages marketing, pour un ton B2B cohérent avec les locales formelles DE (Sie) et IT (Lei). Zéro tutoiement résiduel.
  • ModifiéFlag multi_device retiré des features des plans (src/shared/const.js) — l'analyse mobile + desktop est une capacité de base disponible sur tous les paliers (y compris Free) et n'était gardée par aucune logique applicative. Le flag, listé à tort comme avantage Pro+, est supprimé des features Pro/Business/Agency pour aligner le modèle tarifaire sur le comportement réel. Aucun changement fonctionnel (le flag n'était jamais évalué) ; la page tarifs reste inchangée (elle s'appuie sur les listes i18n).
  • ModifiéRenforcement SEO et données structurées (src/entry-server.js) — émission de la balise meta keywords (auparavant résolue mais jamais rendue), meta author réel (Christophe Bragard) sur la page auteur et les articles, Person.worksFor (E-XODE) pour l'E-E-A-T, schéma Product enrichi de 4 Offer (prix réels par palier) sur la page tarifs, BreadcrumbList sur docs/vulnérabilités/articles. La route des rapports de scan partageables (/report/:scanId) passe en noindex, follow.
v2.24.02026-05-31
  • AjoutéPalier Agency (249 €/mois, 199 €/mois en annuel) — nouveau plan haut de gamme dédié aux agences : rapports PDF white-label, gestion d'équipe jusqu'à 10 membres (associates), support prioritaire, 50 projets, 25 pages/projet, 30 000 scans/mois, rétention 24 mois. Nécessite la création des prix Stripe STRIPE_PRICE_AGENCY_MONTHLY / STRIPE_PRICE_AGENCY_YEARLY (placeholders en attente). Cron de purge dédié src/crons/pruneAgency.js
  • ModifiéRefonte de la grille tarifaire (3 → 4 paliers) — Free 0 €, Pro 29 € (49 € avant), Business 99 € (199 € avant), Agency 249 €. Remise annuelle ~20 % (Pro 23 €, Business 79 €, Agency 199 €/mois). Les prix de la page tarifs et du schéma JSON-LD sont désormais sourcés depuis PLANS (src/shared/const.js), plus aucune valeur en dur
  • ModifiéQuotas alignés sur la fréquence promise — correction du modèle de volume incohérent (auparavant scans quotidiens promis mais plafond à 100/mois). Free 1 projet / 1 page / 30 scans ; Pro 3 / 5 / 500 ; Business 15 / 15 / 6 000 ; Agency 50 / 25 / 30 000. Fréquences auto : Free mensuel, Pro hebdo, Business + Agency quotidien
  • ModifiéWhite-label PDF et gestion d'équipe (associates) déplacés de Business vers Agency — Business conserve le PDF brandé et les alertes de régression ; le white-label et les associés (jusqu'à 10) sont désormais réservés à Agency. canManageAssociates et le nettoyage des associés au downgrade (handleBusinessDowngradehandleAssociatesDowngrade) basculent sur le palier Agency
  • ModifiéAlertes de régression — désormais incluses dans Business ET Agency (auparavant Business uniquement)
  • ModifiéRétention des données — Free 90 → 30 jours, Pro 180 j, Business 365 j, Agency 730 j. ⚠️ La réduction du palier Free purgera, au prochain passage du cron, les scans Free de plus de 30 jours
  • ModifiéPage tarifs — affichage en 4 colonnes (2×2 jusqu'au breakpoint lg), badge « Le plus populaire » repositionné sur Business, CTA du plan mis en avant en dégradé cyan → violet
v2.23.32026-03-22
  • Corrigépackage.json — suppression de la virgule traînante après le script scan (causait un EJSONPARSE au npm ci)
v2.23.22026-03-22
  • ModifiéSitemap dynamique — suppression du cron quotidien generateSitemap.js et du fichier statique public/sitemap.xml. Le sitemap est désormais servi dynamiquement via une route Express /sitemap.xml avec cache in-memory (TTL 1h)
v2.23.12026-03-17
  • CorrigéEmails discussions — correction de l'URL de fallback dans les templates email de discussion : vitapulse.iovitapulse.e-xode.net (5 langues)
  • ModifiéLighthouse 12 → 13 — mise à jour majeure du moteur d'audit. 27 audits individuels supprimés (consolidés dans les 17 insights). Diagnostics réduits de 33 à 13 IDs. Fallback CLS elements vers cls-culprits-insight. uses-http2 retiré des skipAudits. Scores a11y/SEO/BP ajustés (poids modifiés). Rétrocompatibilité totale avec les anciens scans
  • ModifiéVite 7 → 8 — migration vers Rolldown (bundler Rust). Option api: 'modern-compiler' retirée des options SCSS (seul mode supporté). Builds ~2x plus rapides
  • ModifiéVue Router 4 → 5 — mise à jour majeure sans breaking changes (merge de unplugin-vue-router dans le core)
  • Modifié@vitejs/plugin-vue 5 → 6 — alignement sur Vite 8
  • ModifiéDépendances mises à jour — vue 3.5.18→3.5.30, vuetify 4.0.0→4.0.2, vue-i18n 11.1.11→11.3.0, pinia 3.0.3→3.0.4, dompurify 3.2.6→3.3.3, express 5.1.0→5.2.1, express-rate-limit 8.2.1→8.3.1, stripe 20.4.0→20.4.1, nodemailer 8.0.1→8.0.2, multer 2.0.3→2.1.1, sass-embedded 1.87.0→1.98.0
  • ModifiéTipTap épinglé à 3.20.0 — overrides npm pour contourner le publish cassé de 3.20.3 (dist/ manquant)
  • ModifiéPerformance Insights — extraction enrichieextractPerformanceInsights() capture désormais la structure complète des insights Lighthouse : headings, metricSavings, overallSavingsMs/Bytes, scoreDisplayMode, debugData, sortedBy, isEntityGrouped, subItems imbriqués, et items sans troncature abusive (50 max pour tables, 30 pour listes)
  • ModifiéPerformance Insights — UI refondéeScanInsightsSection.vue remplacé par une interface riche avec recherche, filtre par métrique impactée (LCP/CLS/INP/TBT/FCP), tri par score ou par gains, chips metricSavings, badges overallSavings, et rendu adaptatif selon le type de données (table/list/checklist)
  • ModifiéPerformance Insights — PDF enrichi — le PDF affiche désormais les metricSavings, warnings, et les tables de détails des insights (même rendu que les opportunités et diagnostics)
  • ModifiéAuditDetailTable — subItems et nouveaux valueTypes — support des sous-éléments expandables (clic pour déplier), et des types source-location, code, numeric
  • ModifiéLighthouse — capture runtimeError — vérification de lhr.runtimeError après chaque appel à lighthouse() pour détecter les erreurs fatales (page non chargée, crash GPU, timeout DNS) et éviter les scans silencieusement marqués "completed" avec des scores null
  • ModifiéLighthouse — effort calculé depuis guidanceLevel — le champ effort des opportunités est maintenant calculé depuis audit.guidanceLevel (1→high, 2→medium, 3→low) au lieu d'être hardcodé à 'medium'
  • ModifiéLighthouse — language default cohérent — le fallback de langue passe de 'fr' hardcodé à DEFAULT_LOCALE ('en') pour respecter la convention du projet
  • ModifiéLighthouse — desktop timeouts configurablesmaxWaitForFcp (15s) et maxWaitForLoad (35s) desktop sont maintenant dans LIGHTHOUSE_CONFIG.timing au lieu d'être hardcodés
  • AjoutéInsightChecklist — nouveau composant pour afficher les insights de type checklist (document-latency, lcp-discovery) avec icônes de validation
  • AjoutéInsightListRenderer — nouveau composant pour afficher les insights de type list (cls-culprits, forced-reflow, breakdowns, network-tree) avec rendu récursif
  • AjoutéLighthouse — audit.explanation — extraction et affichage du champ explanation de Lighthouse dans les opportunités, diagnostics, issues (a11y/SEO/BP/security), insights et le PDF de résultats. Ce champ fournit un texte contextuel expliquant pourquoi l'audit a échoué pour la page spécifique testée
v2.22.12026-03-14
  • ModifiéGitHub Actions — build workflow déclenché sur push/PR vers main (remplace npm run lint/test:run inexistants par npm run build), Docker build déclenché uniquement sur les tags de release (v*), CodeQL aligné sur la branche main
v2.22.02026-03-12
  • SécuritéGoogle reCAPTCHA v3 — intégration CAPTCHA invisible sur les 3 endpoints publics (signup, quick audit, contact). Vérification serveur du token avec score minimum 0.5. Désactivé en développement. Composable Vue useCaptcha partagé, helper serveur verifyCaptcha factorisé
v2.21.02026-03-12
  • AjoutéStatut de vérification utilisateur — l'administration affiche si un utilisateur a validé son compte (code de sécurité vérifié au moins une fois) : chip vert/gris dans la liste et dans le détail utilisateur
  • AjoutéSuppression de compte utilisateur — les administrateurs peuvent supprimer un compte utilisateur avec cascade complète (projets, scans, stats, discussions, messages, audits, associés, logs, sessions, avatar). Les comptes admin sont protégés contre la suppression
  • SécuritéValidation serveur signup — ajout de la validation email (EMAIL_REGEX), password (≥ 8 caractères), et name (≥ 2 caractères) côté serveur dans l'endpoint d'inscription. Normalisation de l'email en lowercase et trim du name
  • SécuritéValidation serveur signin — ajout de la validation email côté serveur dans l'endpoint de connexion
  • SécuritéRate limit signup renforcé — réduction du rate limit signup de 10 à 5 requêtes par 15 minutes
  • SécuritéTraduction des erreurs serveur — les erreurs renvoyées par le serveur (signup, signin, forgot, reset) sont désormais traduites via i18n au lieu d'afficher les clés brutes
v2.20.02026-03-12
  • AjoutéSuivi conversions Google Ads — événement GA4 purchase déclenché après un checkout réussi (Pro/Business) avec valeur de conversion, devise EUR et cycle de facturation. L'événement est automatiquement importé par Google Ads via ads_conversion_PURCHASE_1
  • AjoutéValidation URL — vérification du format URL sur la page Quick Audit et la page d'accueil (protocole http/https, hostname valide avec au moins un point). Le bouton est désactivé tant que l'URL est invalide
  • AjoutéValidation email — vérification du format email sur les pages de connexion et d'inscription. Utilise le regex partagé EMAIL_REGEX au lieu d'un regex inline moins strict
  • CorrigéTextes de validation en dur — remplacement des messages de validation en français hardcodés (signup/signin) par des clés i18n traduites dans les 5 langues
v2.19.02026-03-08
  • AjoutéLangue italienne — ajout de l'italien (it) comme 5ème langue supportée : traductions complètes (interface, vulnérabilités, emails), drapeau, imports dans tous les modules (main, email, googleWebhook, downloadPdf)
  • CorrigéTraductions allemandes incomplètes — correction de 697 clés manquantes dans de.json (landing, admin, billing, project, cwv, caseStudies, pdf, et toutes les autres sections). Nettoyage des clés obsolètes et correction des types incompatibles (tableaux FAQ, takeaways, includes)
  • CorrigéTraductions italiennes incomplètes — correction de 320 clés manquantes dans it.json. Nettoyage des clés obsolètes pour alignement parfait avec la structure anglaise de référence
v2.18.22026-03-08
  • CorrigéAppel parasite quick-audit/convert — nettoyage du localStorage lorsque la conversion échoue, évitant un appel API inutile à chaque connexion
v2.18.12026-03-08
  • ModifiéLimite scans Pro — réduction de la limite de scans manuels du plan Pro de 50 à 30 par mois. Code et textes mis à jour dans les 4 langues (en/fr/es/de)
  • CorrigéLimite scans Business — correction de la limite de scans manuels du plan Business (était Infinity, maintenant 100). Seul l'admin est illimité
  • CorrigéReset mensuel du compteur de scans — ajout d'un reset lazy du compteur scansThisMonth (le compteur n'était jamais remis à zéro, bloquant les utilisateurs définitivement après X scans)
  • CorrigéAffichage compteur scans — le dashboard Billing affiche maintenant les scans du mois en cours (scansThisMonth) au lieu du total à vie
  • CorrigéAlignement textes/code limites scans — correction des incohérences entre les textes (5/50/200) et les valeurs réelles dans le code (10/30/100) pour les 3 plans dans les 4 langues
v2.18.02026-03-08
  • AjoutéLangue allemande (DE) — support complet de l'allemand comme 4ème langue : traductions UI (de.json), vulnérabilités (vulnerabilities/de.json), templates email (emails/de.js), drapeau SVG, intégration dans les imports (main.js, email.js, googleWebhook.js, downloadPdf.js)
  • AjoutéNews multilingues dynamiques — refonte de l'éditeur de news admin : EN toujours obligatoire, ajout de langues supplémentaires via bouton (+), onglets dynamiques par langue. Champ languages stocké sur chaque news. Recherche admin étendue à toutes les langues. Chips de langues affichées dans la liste admin
  • ModifiéRétention plan Free — passage de 1 mois à 3 mois d'historique de scans (retentionDays 30 → 90). Textes pricing, FAQ et labels mis à jour dans les 4 langues
v2.17.12026-03-08
  • ModifiéPage Free Audit enrichie — ajout de 3 sections marketing sous le formulaire : highlights des fonctionnalités, aperçu du rapport PDF (screenshots case study), et CTA vers l'inscription
v2.17.02026-03-08
  • AjoutéLanding pages campagnes — 3 pages dédiées pour Google Ads : /agencies (agences web, white label), /developers (développeurs, régressions), /core-web-vitals (métriques Google). Traduites en FR/EN/ES, intégrées au sitemap
  • ModifiéLimites de plans — rétention réduite : free 1 mois (était 6), pro 6 mois (était 12), business 1 an (était 3 ans). URLs par projet pro : 3 (était 5)
  • ModifiéCheckoutView factorisé — les features hardcodées en anglais sont remplacées par les traductions i18n de la page pricing
v2.16.22026-03-07
  • AjoutéProjectBanner sur la page scan — affichage du screenshot et de l'URL du projet dans les résultats de scan, avec lien cliquable vers la page du projet
  • SécuritéCodes de sécurité cryptographiques — remplacement de Math.random() par crypto.randomInt() pour la génération des codes 2FA
  • SécuritéComparaison timing-safe — les vérifications de codes de sécurité utilisent désormais crypto.timingSafeEqual pour prévenir les attaques par timing
  • SécuritéProtection open redirect — validation du paramètre redirect dans les pages d'authentification (signin, signup, verify-code)
  • SécuritéInvalidation des sessions — les autres sessions sont détruites lors d'un changement de mot de passe ou d'email
  • SécuritéFuite de stack trace — les erreurs 500 n'exposent plus la stack trace en production
  • SécuritéSecret de cookie — le secret de session est désormais obligatoire en production (plus de fallback en dur)
  • SécuritéCSP Helmet activé — Content Security Policy configuré en production (script-src, style-src, frame-src, etc.)
  • SécuritéSanitization v-html — les descriptions Stack Packs sont désormais sanitizées via DOMPurify
  • SécuritéWebhook Stripe — les messages d'erreur ne divulguent plus les détails Stripe internes
  • SécuritéSanitization HTML durcie — restriction de l'attribut style au tag span uniquement, regex de couleur stricte
  • SécuritéRate limiting étendu — ajout de limites sur change-password, change-email, verify-email-change
  • SécuritéPlages IPv6 privées complètes — ajout des plages fd00:, ::ffff: mapped pour bloquer les scans sur IPs privées
  • CorrigéBug associates/invite.js — correction d'un crash ReferenceError quand la variable project était utilisée avant sa déclaration
v2.16.12026-03-07
  • CorrigéSSR 404 systématique — toutes les pages retournaient HTTP 404 quand JavaScript est désactivé (le slash initial de l'URL était supprimé avant résolution du routeur Vue)
v2.16.02026-03-07
  • AjoutéPage 404 — les URLs inexistantes affichent désormais une page 404 dédiée avec HTTP 404 au lieu de rediriger vers la homepage (amélioration SEO)
  • AjoutéMéta dynamiques pour les news — les pages de détail des articles ont désormais un titre, description et image OG uniques générés côté SSR. Schema JSON-LD NewsArticle avec auteur et dates
  • Ajoutéx-default dans le sitemap — le générateur de sitemap inclut désormais le hreflang x-default
  • ModifiéOptimisation fonts — suppression du double chargement Google Fonts dans index.html (déjà chargé via style.css) et de la police IBM Plex Mono inutilisée
  • ModifiéRemplacement de Plotly par Chart.js — le graphique d'historique CWV utilise désormais Chart.js (tree-shaked) au lieu de plotly.js-dist-min, réduisant le bundle de ~4.6 MB à ~50 KB
  • Corrigérobots.txt — correction du domaine du sitemap (pointait vers un domaine inexistant)
  • CorrigéSchema Pricing — suppression du faux AggregateRating (données inventées)
  • SuppriméuseMeta.js — composable jamais utilisé, supprimé (dead code)
  • Supprimésitemap.xml du dépôt Git — fichier régénéré quotidiennement par cron, ne doit pas être versionné
v2.15.02026-03-07
  • AjoutéSuppression de projet — les propriétaires peuvent supprimer un projet depuis la page Paramètres (zone de danger). La suppression cascade sur tous les scans, statistiques, discussions et messages associés. Les associés perdent automatiquement l'accès
  • AjoutéNavigation par clic sur les scores — cliquer sur une carte de score (Performance, Accessibilité, SEO, Best Practices) redirige automatiquement vers l'onglet ou sous-onglet correspondant dans les résultats du scan
  • CorrigéBadge non lu des news — les news sans commentaire restaient toujours marquées comme non lues même après consultation, car la discussion nécessaire au suivi de lecture n'était créée qu'au premier commentaire
v2.14.0
  • AjoutéRedirection post-auth vers le projet partagé — lorsqu'un associé clique sur le lien d'un email de partage de projet, il est redirigé automatiquement vers la page du projet après connexion ou inscription (au lieu du dashboard)
  • AjoutéLiens documentation dans les résultats de scan — les éléments de sécurité documentés (headers HTTP, audits Lighthouse, warnings TLS, versions logicielles) affichent une icône "doc" avec tooltip, cliquable pour ouvrir la page de documentation correspondante dans un nouvel onglet
  • AjoutéBadge non lu en cyan — les badges de contenu non lu (news, discussions) utilisent la couleur primaire au lieu du rouge pour éviter la confusion avec les erreurs
  • AjoutéAnnulation des invitations en attente — les propriétaires de projet peuvent annuler les invitations en attente d'un associé via un bouton dans la section "Invitations en attente" des paramètres du projet
  • AjoutéBannière projet partagée — le titre, l'URL et le screenshot du projet sont affichés sur les pages Discussions et Paramètres via un composant ProjectBanner réutilisable
  • AjoutéLien résultats complets — lien "Consulter tous les résultats de l'audit" sous les scores dans la page projet
  • ModifiéLogo email embarqué (CID) — le logo VitaPulse dans les emails est désormais embarqué en pièce jointe CID au lieu d'être référencé par URL externe, garantissant son affichage dans Gmail, Outlook et tous les clients email
  • ModifiéAvatar email embarqué (CID) — l'avatar de l'utilisateur dans les emails d'invitation associé est embarqué en pièce jointe CID pour un affichage fiable dans tous les clients email
  • ModifiéMenu header — l'option "Administration" est déplacée juste avant "Déconnexion" (après le divider) au lieu d'être en première position
  • ModifiéMongoDB connection — encodage encodeURIComponent() du nom d'utilisateur et mot de passe dans l'URI de connexion pour gérer les caractères spéciaux
  • ModifiéTraduction française — remplacement de tous les termes "scan/scans" par "audit/audits" dans l'interface française
  • ModifiéHarmonisation responsive — remplacement de tous les breakpoints hardcodés (768px, 960px, 600px) par des mixins SCSS centralisés (max-md, max-sm, max-lg) basés sur les variables du design system. Harmonisation des 4 pages projet (overview, settings, discussions, discussion detail) : même background ($gradient-light), même padding, même breakpoint (max-md), même variable $header-height. Remplacement de calc(100vh - 72px) par $header-height dans 6 pages app
v2.13.32026-03-06
  • CorrigéEmail partage projet — l'email envoyé lors du partage d'un projet avec un associé déjà inscrit inclut désormais les scores de performance et les alertes de sécurité (headers manquants), comme c'était déjà le cas pour les invitations de nouveaux utilisateurs
  • ModifiéFactorisation getProjectScanData() — la logique d'extraction des scores et headers de sécurité pour les emails d'invitation est centralisée dans dbHelpers.js (utilisée par invite.js et share.js)
v2.13.22026-03-06
  • ModifiéMongoDB indexes initializationinitializeCollections(db) est désormais appelée au démarrage du serveur, garantissant la création des index sur toutes les collections (users, projects, scans, quickAudits)
  • ModifiéOptimisation N+1 project list — remplacement de 2N requêtes individuelles (find + count par projet) par 2 aggregations batch ($group + $facet), réduisant drastiquement la charge MongoDB sur le dashboard
  • ModifiéAggregation $facet — les endpoints GET /api/projects/:id/scans et GET /api/admin/projects/:id combinent désormais data + count en une seule requête MongoDB au lieu de deux
  • ModifiéAdmin scans pagination — l'endpoint GET /api/admin/scans est désormais paginé (50 résultats/page avec navigation) au lieu de charger 200 résultats d'un coup
  • ModifiéIndex compound scans — ajout de l'index { projectId: 1, status: 1, createdAt: -1 } pour optimiser les requêtes filtrées par statut
  • CorrigéMongoDB sort memory overflow — ajout de allowDiskUse() sur les requêtes de listing scans pour éviter le crash QueryExceededMemoryLimitNoDiskUseAllowed sur les collections volumineuses
v2.13.12026-03-06
  • ModifiéSécurité : hashage des codes de vérification — remplacement de l'encodage Base64 (réversible) par SHA-256 pour le stockage des codes de sécurité 2FA (hashCode/verifyCode dans email.js)
  • ModifiéSécurité : projection MongoDB sur users — exclusion systématique des champs sensibles (password, securityCode, securityCodeExpires, securityCodeAttempts) via findUserSafe() dans 18 fichiers API (billing, projects, associates, scans)
  • ModifiéSécurité : sanitization formulaire de contact — les champs name, subject et message sont désormais trimés et sanitizés via sanitize-html avant envoi
  • ModifiéExtraction IP centralisée — remplacement de 9 occurrences de req.headers['x-forwarded-for'] manuelles par getClientIp(req) dans les endpoints commentaires, discussions et admin
  • ModifiéConsolidation escapeHtml — suppression des 2 implémentations dupliquées (entry-server.js, useMeta.js), import unique depuis shared/utils.js. Ajout de l'échappement des quotes simples ('&#039;)
  • ModifiéHelpers backend factorisésparseObjectId(), parsePagination(), findUserSafe() dans dbHelpers.js ; pagination utilisée dans 4 endpoints (logs, discussions, news, scans)
  • ModifiéRobustesse logginglogEvent() loggue désormais les erreurs d'écriture MongoDB au lieu de les ignorer silencieusement
  • ModifiéRobustesse router — le catch vide dans router.beforeEach loggue désormais les erreurs de vérification auth
v2.13.02026-03-06
  • AjoutéProject discussions — forum-style discussions for project associates. Owner and associates can create discussions, post messages, and track unread discussions. Accessible from the project overview via a "Discussions" button with unread badge.
  • AjoutéUnified discussion system — news comments and project discussions now share the same data architecture (discussions, discussionMessages, discussionReads collections) and reusable CommentThread component
  • AjoutéDiscussion email notifications — configurable alerts for new discussions and new messages, with separate toggles in project settings (available for all plans)
  • AjoutéAdmin discussions page — manage all discussions (news and projects) from admin panel with filtering by type and deletion capabilities
  • AjoutéRich text messages — discussion messages and news comments now support rich text editing (TipTap) with full toolbar: bold, italic, underline, colors, headings, lists, blockquotes, code blocks, images, YouTube, links. Images uploaded to dedicated public/uploads/discussions/ directory
  • AjoutéServer-side HTML sanitization — all user-generated HTML content (discussions and news comments) is sanitized server-side via sanitize-html to prevent XSS attacks. Only safe tags, attributes, and YouTube iframes are allowed
  • AjoutéClient-side HTML sanitization — DOMPurify applied to all v-html rendering (discussion messages, news article content, news comments)
  • AjoutéSource Serif 4 content font — discussion messages, news articles, and rich text editor now use Source Serif 4 (serif) for content readability, creating a clear visual distinction between app UI (Inter) and user-generated content
  • AjoutéPage comments — users can read and post comments on documentation pages (vulnerability details). Public read, authenticated write, comment count badges and unread indicators on the vulnerability list page. Admin panel updated with "Pages" filter for page-type discussions
  • ModifiéNews comments — migrated from newsComments/newsReads to unified discussions/discussionMessages/discussionReads collections (breaking: existing news comments are lost, fresh start)
  • ModifiéTiptapEditor — moved from components/admin/ to components/common/ for reuse across discussions and news. Added showRawMode prop (raw HTML mode now admin-only)
  • ModifiéDiscussion & news UI redesign — card-based message layout with left accent border, proper page backgrounds (gradient-light), white card containers for articles and comments, improved typography with content font, hover effects on messages, styled empty states and form areas
  • CorrigéNews comment log events — posting or editing a news comment now logs news-comment-create and news-comment-edit events (was missing)
v2.12.12026-03-03
  • CorrigéAssociate sharing bug — re-inviting an accepted associate on a new project incorrectly returned an "already associate" error instead of sharing the project
  • CorrigéAssociate display per project — associates tab in project settings now correctly filters by current project: shows only associates with access to this project, pending invitations for this project, and other associates without access
  • CorrigéProject settings centering — page was not centered due to missing container-narrow class
  • AjoutéAssociate empty states — each section (project associates, pending invitations, other associates) now shows an explicit message when empty
  • AjoutéSignup email pre-fill — associate invitation emails for new users include the email as query parameter, pre-filling the signup form
v2.12.02026-03-02
  • AjoutéUser avatar system — users can upload a profile picture (JPEG/PNG/WebP, 2MB max) from their account page. Avatar displayed in header menu, news comments, associate invite emails, and admin user pages
  • AjoutéNews author display — news articles show "Published by {name}" with author avatar below the title. Author is automatically tracked when creating news
  • ModifiéEmail templates — added VitaPulse logo (icon-192.png) in email header above the brand name for better visual identity
  • ModifiéAssociate invite emails — include the inviter's avatar and name in a styled card
  • CorrigéSecurity headers detection — response headers were extracted from redirect responses (301/302) instead of the final response (200), causing security headers like strict-transport-security to be incorrectly reported as missing. Now uses lhr.finalDisplayedUrl for URL matching and filters only 2xx responses
v2.11.02026-03-01
  • AjoutéGoogle Analytics 4 integration — GA4 tracking with SSR-compatible injection, SPA page view tracking on route changes, and custom events for key user actions (sign_up, login, quick_audit, project_create, scan_start, pdf_download, begin_checkout, contact form, share report). Configurable via GA_MEASUREMENT_ID environment variable
  • AjoutéSitemap generator cron — automated public/sitemap.xml generation with all static pages (11 routes × 3 locales with hreflang alternates) and dynamic news pages from database. Run via npm run sitemap or scheduled cron
  • AjoutéPublic news list page — new paginated /news page accessible without authentication, SEO-indexable with cover images, excerpts and pagination. News routes moved from /app/news/ to /news/ for better search engine visibility
  • AjoutéDynamic news back link — back button on news detail page dynamically adapts based on navigation history (returns to news list, dashboard or previous page)
  • AjoutéTipTap HTML raw mode — toggle button in the editor toolbar to switch between WYSIWYG and raw HTML editing, allowing direct HTML paste
  • AjoutéBlog link in footer — added Blog link in the Resources column of the footer
  • ModifiéOptimized robots.txt for SEO — locale-aware Disallow rules for all private routes (/*/app/, /*/signup, /*/signin, /*/auth/, /*/checkout, /*/report/), allowing proper crawling of public content pages (landing, pricing, docs, news, case studies, etc.)
  • ModifiéVue Router navigation guard — migrated from deprecated next() callback to return-based API
  • CorrigéTipTap duplicate extensions warning — disabled link and underline in StarterKit config since they are added separately with custom configuration
  • CorrigéNews validation error messages — admin news creation/update now returns specific missing field names instead of generic error.validation
  • CorrigéNewsDetailView comments crash — restored missing comments ref declaration
v2.10.02026-03-01
  • AjoutéEmail change with verification — users can change their email address from the Account page via a secure 6-digit code sent to the new address (10 min expiry, 3 attempts max). Inline UI with two-step flow (enter new email → enter code)
  • AjoutéEnriched associate invitation emails — invitation emails now include latest performance scores (4 categories with color-coded badges) and missing high/medium-severity security headers to incentivize recipients to sign up and view full reports
  • AjoutéSecurity alerts email helper — new renderSecurityAlerts() shared helper in emailLayout.js for displaying missing security headers with severity badges
  • AjoutéResponsive container widths — optimized Vuetify container max-widths for all breakpoints (92% at md, 1080px at lg, 1400px at xl, 1800px at xxl) with .container-narrow opt-out for form/centered pages
  • Ajouté.form-narrow utility class — constrains form widths to 640px max, applied to ProjectSettingsView and ProjectNewView
  • ModifiéUnified email templates — all 7 email types now share a consistent branded layout via emailLayout.js (gradient header with VitaPulse/e-xode branding, navigation footer with links to Pricing, Docs, Contact, Terms, Privacy). Factored shared helpers (score colors, CWV formatting, CTA buttons, code boxes) to eliminate duplication across locale files.
  • ModifiéUpgraded Vuetify from 3.x to 4.0.0 — full Material Design 3 migration
  • ModifiéMigrated all typography classes from MD2 to MD3 (text-h1→text-display-large, text-body-2→text-body-medium, text-caption→text-body-small, etc.)
  • ModifiéMigrated VRow grid props (align → CSS class, densedensity="compact")
  • ModifiéUpdated SCSS breakpoints to MD3 values (md: 840px, lg: 1145px, xl: 1545px, xxl: 2138px)
  • ModifiéAdded xxl breakpoint mixin to SCSS design system
  • ModifiéAdded CSS reset for headings/paragraphs to replace Vuetify 4's removed global reset
  • ModifiéUpdated vue from 3.5.27 to 3.5.29
  • ModifiéUpdated playwright from 1.58.1 to 1.58.2
  • ModifiéUpdated cors from 2.8.5 to 2.8.6
  • ModifiéUpdated vue-router from 4.6.4 to 5.0.3
  • ModifiéUpdated mongodb from 6.21.0 to 7.1.0
  • ModifiéUpdated nodemailer from 6.10.1 to 8.0.1
  • ModifiéUpdated stripe from 14.25.0 to 20.4.0
  • ModifiéUpdated @stripe/stripe-js from 3.5.0 to 8.8.0
  • CorrigéEmail link colors — fixed link colors being overridden by email clients (Gmail, Outlook) using <span> wrapper technique
  • CorrigéPending associates visibility — associates with pending status now appear in the project settings list instead of being hidden until they accept
  • CorrigéNode watch paths — added src/translate/emails/ to --watch-path list for email template hot-reload in development
v2.9.02026-02-28
  • AjoutéSecurity vulnerabilities documentation page (/docs/vulnerabilities) with detailed guides for HTTP security headers, TLS/SSL, Lighthouse security audits, and software version exposure (26 vulnerabilities total)
  • AjoutéSeparate translation files for vulnerabilities (src/translate/vulnerabilities/en.json, fr.json)
  • AjoutéVulnerability detail view with route /docs/vulnerabilities/:id and breadcrumb navigation
  • AjoutéVulnerabilities listed in Docs page section #10 with severity chips and direct links
  • Ajouté4 vulnerability categories: HTTP Security Headers (10), TLS/SSL Certificate (5), Lighthouse Security Audits (7), Software Version Exposure (4)
  • AjoutéSpanish language support (es.json, vulnerability translations, email templates, flag icon)
  • AjoutéCentralized locale configuration (SUPPORTED_LOCALES, LOCALE_CODES, getIntlLocale(), getOgLocale() in shared/const.js) — adding a new language only requires updating the single source of truth
  • AjoutéChangelog page now auto-generated from CHANGELOG.md — single source of truth, no duplication in translation files
  • ModifiéRedesigned header action elements (language switcher, account, sign in) with consistent pill-style buttons using shared SCSS mixin
  • ModifiéLanguage switcher now displays country flag emoji (🇬🇧/🇫🇷) with locale code, clearly interactive at rest
  • ModifiéCTA buttons (Dashboard, Start Free) use rounded pill style for visual consistency
  • ModifiéMobile drawer language buttons also show flag emojis
v2.8.32026-02-28
  • CorrigéPDF section order now matches app tab order: Security → Quality → Performance → Resources → Advanced (Global → Framework → Critical Chains → Scripts Treemap → Audit Timing → Passed)
  • CorrigéMoved runWarnings from after CWV to Advanced/Global section in PDF
  • CorrigéMoved console to first position in Advanced section in PDF
  • CorrigéAdded missing translation key scan.details.showAll (EN/FR)
v2.8.22026-02-28
  • ModifiéMoved Server Response Time block from Advanced > Global to Performance tab (displayed before Opportunities/Diagnostics)
  • ModifiéPDF report updated to match new Server Response Time placement
v2.8.12026-02-28
  • AjoutéAdvanced tab split into 6 sub-tabs: Global, Framework, Critical Chains, Scripts Treemap, Audit Timing, Passed
  • AjoutéNew components: ScanStackPacksSection, ScanCriticalChainsSection, ScanScriptTreemapSection, ScanAuditTimingSection
  • ModifiéAdvanced > Global sub-tab: Console section displayed first, then Server Response Time, then remaining technical data
  • ModifiéFixed console section scrollbar overflow (removed unnecessary max-height constraint)
  • CorrigéConsole section displaying unwanted horizontal/vertical scrollbars
v2.8.02026-02-28
  • AjoutéHTTP response headers extraction from Lighthouse artifacts (NetworkRecords) during scans
  • AjoutéStandalone Security tab in scan results with four sub-tabs: "TLS Certificate", "Response Headers", "Software Versions" and "Lighthouse Audits"
  • AjoutéSecurity headers analysis: 10 critical headers checked (HSTS, CSP, X-Frame-Options, etc.) with present/missing status and risk severity levels (high/medium/low)
  • AjoutéFull response headers table in Security > Headers sub-tab
  • AjoutéTLS certificate analysis: protocol version, cipher suite, signature algorithm, issuer, expiration with warnings for weak/expired certificates
  • AjoutéSoftware versions detection from HTTP headers (Server, X-Powered-By), HTML content (CMS, meta generator, frameworks) and TLS protocol
  • AjoutéPDF report: security section now includes TLS certificate, response headers, software versions and Lighthouse security audits
  • AjoutéGlobal CSS gap utilities (.gap-1 to .gap-16) in design system — fixes all gap-* classes that were non-functional with Vuetify
  • AjoutéLighthouse scores sorted worst-to-best on scan details page and project overview page
  • AjoutéCore Web Vitals sorted worst-to-best on scan details page and project overview page
  • AjoutéQuick stats clickable: navigate to corresponding tab and sub-tab with smooth scroll
  • AjoutéPassed audits click scrolls directly to Passed section anchor within Advanced tab
  • ModifiéScan result tabs reordered: Security → Quality → Performance → Resources → Advanced
  • ModifiéSecurity tab is now the default selected tab on scan results
  • ModifiéSecurity issues moved from Quality tab sub-tab to standalone Security tab
  • ModifiéScan results overview layout reorganized: environment chips before quick-stats, screenshot in 3rd column
  • ModifiéLoading timeline moved from overview to Resources tab (after stat-cards, before resources by type)
  • ModifiéQuality tab reduced from 4 sub-tabs to 3 (accessibility, SEO, best practices)
v2.7.12026-02-28
  • ModifiéRefactored project creation wizard: removed step 4 (scan progress), now redirects to project overview after creation where ScanProgressCard handles scan progress display
  • ModifiéProject creation wizard reduced from 4 steps to 3 steps (Info → Pages → Alerts → Launch)
  • CorrigéDashboard news section not displaying: NewsSection was reading data.news instead of data.items from API response
  • CorrigéScan results: overview section extracted from tabs and displayed permanently between CWV and tab navigation
v2.7.02026-02-28
  • AjoutéLocalized URLs: all routes now prefixed with locale (/en/*, /fr/*)
  • AjoutéuseLocalePath composable for locale-aware navigation
  • AjoutéAutomatic locale detection from browser on first visit
  • AjoutéSEO: hreflang, canonical, og:locale, and Schema.org inLanguage in SSR
  • AjoutéLocale switcher updates URL path in real-time
  • AjoutéNews system: CRUD backend with bilingual content (FR/EN), cover image upload, sticky/homepage banner flags
  • AjoutéNews comments with moderation: users can post, edit own comments; admin approval workflow with pending/approved/rejected status
  • AjoutéComment rate limiting: configurable max comments per time window via admin settings
  • AjoutéAdmin news management: TipTap WYSIWYG editor, bilingual tabs, publish/draft, sticky and homepage banner controls
  • AjoutéAdmin comments moderation panel: approve, reject, delete comments with filters
  • AjoutéDashboard news section: latest 3 articles with unread badge and sticky indicator
  • AjoutéNews detail page with full content rendering and comments section
  • AjoutéHomepage news banner: dismissible gradient banner for featured articles
  • AjoutéIP tracking: user login IPs stored with history for security auditing
  • AjoutéUser blocking system: admin can block by account and/or IP addresses
  • AjoutéAdmin user detail: security section with block/unblock UI, IP history table with per-IP status and unblock action
  • AjoutéAdmin bypass: administrators exempt from all plan limits (projects, scans, associates, pages)
  • AjoutéFavicon: SVG/PNG/ICO with VitaPulse branding (gradient V + pulse line)
  • AjoutéNews publicly accessible: reading news and comments no longer requires authentication
  • AjoutéComment posting/editing still requires authentication, with "Sign in to comment" prompt for visitors
  • AjoutéCentralized event logging system: logEvent() helper, logs collection, admin logs page with search/filter/delete
  • AjoutéEvent logging instrumented across all endpoints: auth, projects, scans, billing, associates, admin, contact, quick audit, PDF download (40+ events)
  • AjoutéAdmin user detail: recent activity logs section with link to filtered logs page
  • AjoutéForgot password flow: email verification code, reset password page
  • AjoutéChange password: authenticated users can change password from account page
  • AjoutéAccount page: profile editing (name) and password change under /app/account
  • ModifiéPricing FAQ completely rewritten with 20 comprehensive questions covering all features, plans, and capabilities
  • ModifiéBackend-generated URLs (Stripe checkout, emails, Google Chat webhooks, share links) now include locale prefix
  • ModifiéAdmin user detail page shows IP history and blocking controls
  • ModifiéSCSS design system: all hardcoded hex colors, border-radius, font-size, font-weight replaced with variables across 30+ files
  • ModifiéNew SCSS mixins: hover-row, hover-lift, hover-light-on-dark, link-on-dark, link-primary for consistent hover effects
  • ModifiéRemoved unused SCSS mixins (status-good/warning/error, score-gauge)
  • ModifiéAdded $border-radius-xs, $gradient-dark-diagonal SCSS variables
  • ModifiéFavicon and apple-touch-icon now use relative paths (fixes cross-origin issues in dev)
  • ModifiéRemoved orphan src/views/auth/ directory (duplicate of src/views/Auth/)
  • ModifiéRefactored: auth page SCSS extracted to global .auth-page class in _components.scss
  • ModifiéRefactored: getEventColor/getEventCategory/formatLogMeta extracted to useLogUtils composable
  • ModifiéRefactored: business downgrade logic extracted to handleBusinessDowngrade() in dbHelpers.js
  • ModifiéRefactored: inline URL truncation styles replaced with .admin-url-truncate SCSS class
  • ModifiéLogger logEvent() changed to fire-and-forget with .catch(() => {}) (no more async/await)
  • SécuritéObjectId validation added to all news/comments API endpoints
  • SécuritéObjectId.isValid() validation added to all API endpoints accepting ID parameters (17+ routes)
  • SécuritéError logging (console.error) added to all catch blocks across the entire API (15+ files)
  • SécuritéBlocked users/IPs rejected at login with appropriate error messages
  • SécuritéMongoDB projection added to user query in lighthouse.js to exclude password hash
  • SécuritéWebhook error responses standardized to JSON format
  • SécuritésetReference race condition fixed with atomic bulkWrite operation
  • CorrigéHardcoded French progress messages in scan store replaced with i18n keys (scan.progress.*)
  • CorrigéDefault locale inconsistency: backend now uses DEFAULT_LOCALE ('en') everywhere instead of mixed 'fr'/'en'
  • CorrigéHardcoded French in useDateFormat.js replaced with i18n keys (dashboard.fewSeconds, dashboard.days)
  • CorrigéDefault locale for formatDateShort/formatDateFull changed from 'fr-FR' to 'en-US'
  • CorrigéScan status colors centralized in SCAN_STATUS_COLORS constant (removed duplication in 3 admin views)
  • CorrigéObjectId validation added to findUserOrSharedProject helper (prevents crash on invalid IDs)
  • CorrigéCron notifications now log warnings on failure instead of silently swallowing errors
  • CorrigéCron scheduled scans now validate project.url before launching scan
  • CorrigéTiptapEditor image upload now handles fetch errors and checks res.ok
  • CorrigéUnused shallowRef import removed from NewsDetailView
  • CorrigéUnused mdiEyeOff import removed from AdminNewsEditView
v2.6.12026-02-27
  • ModifiéCWV tooltips on scan detail page now show per-metric descriptions matching project overview page
  • ModifiéRemoved non-functional expandable CWV cards on scan detail page
  • ModifiéAdded spacing between Mobile/Desktop toggle buttons
  • ModifiéRemoved share report button from scan detail page
v2.6.02026-02-27
  • AjoutéPlan upgrade/downgrade with Stripe proration (Pro ↔ Business, monthly ↔ yearly)
  • AjoutéUpgrade preview dialog showing prorated amount before confirmation
  • AjoutéWebhook handler for customer.subscription.updated as backup sync
  • AjoutéCheckout guard preventing duplicate subscriptions
  • AjoutéProject screenshot thumbnail on dashboard cards and project overview header
  • AjoutéPlaceholder image for projects without scans (VitaPulse branded SVG)
  • ModifiéUpgrade button in Billing page now opens inline preview dialog instead of redirecting to pricing
  • ModifiéPricing page buttons adapt for existing subscribers (upgrade, downgrade, cycle change)
  • ModifiéDowngrade from Business automatically revokes associates
  • ModifiéAdmin downgrade from Business now properly revokes associates and cleans shared projects
v2.5.12026-02-27
  • AjoutéAssociates can now view project settings in read-only mode
  • AjoutéAssociates can manage their own email notification preferences (scan results and regression alerts) based on their plan
  • AjoutéAssociate notification emails are sent after each scan completion
v2.5.02026-02-27
  • ModifiéCase Studies page: fixed all section-to-page mappings to match actual PDF content (16 sections for 28 pages)
  • ModifiéCase Studies page: corrected metrics values (mobile 82, desktop 78)
  • ModifiéDocumentation page: complete rebuild with comprehensive VitaPulse user guide (10 sections: Quick Audit, Projects, Scans, Scores, CWV, Opportunities, Regressions, PDF Reports, Associates, Plans)
  • ModifiéDocumentation page: added quick start cards, table of contents, and screenshot illustrations
  • ModifiéLanding page: enhanced features section with 6 benefit cards and 4 illustrated feature showcases
  • ModifiéChangelog page: complete rewrite with full version history (v1.0.0 to v2.4.0)
  • ModifiéSecurity page: updated with VitaPulse-specific security practices and technical details
  • ModifiéTerms of Service: comprehensive rewrite with 12 sections covering SaaS-specific terms
  • ModifiéPrivacy Policy: GDPR-compliant rewrite with detailed data collection, storage, and rights information
  • ModifiéCookie Policy: rewritten to reflect actual minimal cookie usage (single session cookie)
  • SuppriméAPI documentation page and route (no public API)
  • SuppriméBlog page link from footer (no blog content)
  • SuppriméStatus page link from footer
v2.4.12026-02-26
  • ModifiéProject settings page: split into tabs (Settings / Associates) for Business plan users
  • ModifiéDashboard: search field and project filter now on the same line
  • CorrigéAssociates tab not switching (missing activeTab ref)
  • CorrigéInvite button not vertically centered next to email input
v2.4.02026-02-26
  • AjoutéAssociates system for Business plan users: invite up to 5 associates by email to share project access
  • AjoutéAssociates management section in project settings (invite, share, remove per project)
  • AjoutéDashboard filter (All / My projects / Shared with me) with shared badge showing owner name
  • AjoutéEmail invitation templates for associates (existing user + new user) in EN/FR
  • AjoutéAutomatic project linking when invited associate registers a new account
  • AjoutéAssociate access inheritance: associates inherit PDF download and report sharing capabilities from project owner's plan
  • AjoutéScan ownership awareness: project owners can manage scans launched by associates
  • AjoutéAutomatic associate revocation on plan downgrade (Business → Pro/Free)
v2.3.22026-02-26
  • CorrigéGlobal button spacing: adjacent buttons in card actions are no longer visually stuck together
  • CorrigéCWV history chart now auto-rebuilds project stats from existing scans when collection is empty
v2.3.12026-02-22
  • CorrigéAdmin scores display not showing due to per-device nested data structure
  • CorrigéAdmin CWV table empty due to same nested structure issue
  • CorrigéScan detail page now shows scores and CWV per device with mobile/desktop toggle
v2.3.02026-02-22
  • AjoutéAdmin user detail page with editable plan, type, name, company
  • AjoutéUser projects list in admin user detail
  • AjoutéClickable rows in admin users table
  • AjoutéAdmin project detail page with editable name, URL, scan frequency
  • AjoutéProject scans list in admin project detail with status, score, device
  • AjoutéClickable project rows in admin projects list and user detail
  • AjoutéLink to project owner from project detail page
  • AjoutéAdmin scan detail page with scores, CWV, regressions display
  • AjoutéEditable scan status and reference flag from admin
  • AjoutéAdmin scan delete with confirmation dialog
  • AjoutéClickable scan rows in admin scans list and project detail
  • AjoutéLinks to owner and project from scan detail page
v2.2.12026-02-22
  • CorrigéLanding page hero section alignment and height
v2.2.02026-02-22
  • AjoutéUser type field (user default, admin manual) for role-based access
  • AjoutéAdmin dashboard with user listing (email, plan, projects, scans, registration date)
  • AjoutéAdmin projects page listing all projects with owner, scan count, latest score
  • AjoutéAdmin scans page listing 200 most recent scans with project, owner, status, score, duration
  • AjoutérequireAdmin middleware for admin-only API endpoints
  • AjoutéAdmin menu in header (crown icon) visible only for admin users
  • AjoutéAdmin route guard (requiresAdmin) on frontend router
  • ModifiéCWV history chart now uses dedicated projectStats collection with incremental aggregation instead of paginated scan data
  • ModifiéStats are pushed to projectStats on each scan completion (no cron needed)
  • ModifiéNew GET /api/projects/:id/stats endpoint for lightweight chart data
v2.1.02026-02-21
  • Ajouté"Set as reference" action on scan details page with isReference badge display
  • AjoutéNetwork requests table in Resources tab (URL, type, protocol, status, transfer/resource size, priority)
  • AjoutéMain thread time column in third-party summary table
  • AjoutéParse/Compile column in script bootup table
  • AjoutéOverview stat cards in Resources tab (requests, transferred, third parties count, JS libraries count)
  • AjoutéShow more/less toggle on script bootup, third-party, and network requests tables
  • AjoutéCore Web Vitals history chart (Plotly) on project overview page, visible when at least 2 completed scans exist
  • ModifiéMerged "Insights" tab into "Performance" tab (opportunities + diagnostics + insights)
  • ModifiéMerged "Technical", "Console", and "Passed" tabs into a single "Advanced" tab
  • ModifiéReplaced v-btn-toggle navigation with v-tabs for scan result sections
  • ModifiéRedesigned Resources tab with section headers, sorted resource bars, and detailed tables
  • ModifiéThird-party section now displays data directly from thirdPartySummary with entity name and main thread time
  • ModifiéReplaced networkSummary (aggregate) with detailed networkRequests table
  • ModifiéRegression detection now prioritizes scans marked as isReference before falling back to latest scan
  • ModifiéSynchronized PDF report generation with all scan result display changes (4 stat cards, parseCompile column, network requests table, third-party mainThreadTime, section ordering)
v2.0.02026-02-15
  • AjoutéComprehensive PDF report generation matching the full application display with 25+ sections (screenshots, filmstrip, audit detail tables, resource bar charts, critical chains, layout shifts, script treemap, entities, BF cache, user timings, server response time, config settings)
  • AjoutéCase studies page with real audit data from www.e-xode.net (23-page PDF, per-page screenshots, key metrics, takeaways)
  • AjoutéComplete i18n localization system with createT(locale) server-side translation resolver
  • AjoutéShared component library: 13 reusable components extracted (AlertError, ConfirmDialog, DataTable, EmptyState, LoadingSpinner, PageHeader, ScoreCircle, ScanProgressCard, SearchInput, SectionCard, StatCard, StatusChip, UpgradeCta)
  • AjoutéShared utilities module (shared/utils.js) with escapeHtml, formatBytes, formatMs, getScoreColor, getScoreLabel, getScoreBg, getCwvStatus, getCwvColor, formatCwvValue
  • AjoutéShared constants module (shared/const.js) with DEVICES, CWV_METRICS, INSIGHTS_FAILING_THRESHOLD, SCAN_DATA_FIELDS
  • AjoutéShared database helpers (shared/dbHelpers.js) for MongoDB operations
  • AjoutéShared API client (shared/api.js) with centralized error handling
  • AjoutéRate limiting on all API endpoints with configurable windows
  • AjoutéSession management with automatic cleanup on dev startup
  • AjoutéVersion number displayed in application footer
  • AjoutéPDF White Label mode for Business plan users
  • AjoutéApp version exposed via Vite define for frontend access
  • ModifiéRewrote pdfTemplate.js (~580 lines) with all scan data sections, matching app UX/design (brand gradient, score colors, impact badges, CWV thresholds)
  • ModifiéRewrote downloadPdf.js with comprehensive preparePdfData() extracting all 35+ scan data fields per device
  • ModifiéRefactored all Pinia stores to use shared utilities and constants
  • ModifiéRefactored all API endpoints to use shared database helpers and middleware
  • ModifiéUpdated all Vue components to use shared component library
  • ModifiéMigrated all hardcoded strings to i18n translation files (en.json, fr.json)
  • ModifiéUpdated entry-server.js with i18n-aware SSR (getRouteMeta, generateMetaTags, getSchemaMarkup)
  • ModifiéUpdated index.html with <!--app-lang--> placeholder for dynamic lang attribute
  • ModifiéRewrote CaseStudiesView.vue with real audit content and PDF page screenshots
  • ModifiéImproved error handling across all API routes with safe JSON parsing
  • CorrigéSecurity audit: input validation, authorization checks, rate limiting on all endpoints
  • CorrigéData parity between scan storage and display fields
  • CorrigéDocker and Playwright configuration for PDF generation
  • CorrigéSession cleanup preventing stale session file accumulation
  • CorrigéRate limiting configuration for different endpoint categories
  • CorrigéSSR hydration for localized meta tags and schema markup
  • CorrigéTranslation key consistency across all components
  • SécuritéAdded requireAuth middleware on all protected routes
  • SécuritéAdded input sanitization with escapeHtml utility
  • SécuritéEnforced ownership checks on scan/project access
  • SécuritéConfigured Helmet CSP and CORS policies
  • SécuritéAdded rate limiting per API category (auth, scans, general)
v1.3.02026-02-10
  • AjoutéCase studies page showcasing VitaPulse audit capabilities
  • AjoutéGitHub Actions workflow for CI testing
  • ModifiéLayout improvements across all views
  • ModifiéTranslation updates for all supported locales
  • ModifiéMajor layout and code refactoring
v1.2.02026-02-07
  • AjoutéCoupon management system for Stripe payments
  • AjoutéQuick audit rate limiting (max audits per plan)
  • AjoutéAutomated cron jobs for data pruning
  • AjoutéEmail notifications with scoring reports
  • AjoutéMulti-page scan support
  • ModifiéPricing logic refactored with plan-based feature gating
  • ModifiéHeader theme improvements
  • ModifiéReport results display fixes
  • CorrigéDocker environment variables for Stripe integration
  • CorrigéTranslation consistency issues
v1.1.02026-02-06
  • AjoutéPDF report export with Chromium rendering
  • AjoutéSEO optimizations (meta tags, schema markup, sitemap)
  • AjoutéScan animation and progress indicators
  • AjoutéCSS design system with variables and mixins
  • AjoutéDetailed audit results display (8 tabbed sections)
  • AjoutéNew project creation workflow with guided steps
  • ModifiéFactorized scan animation components
  • ModifiéServer-side rendering fixes for Vue Router
  • CorrigéTranslation loading and fallback behavior
  • CorrigéServer rendering hydration issues
v1.0.02026-02-04
  • AjoutéInitial release of VitaPulse platform
  • AjoutéLighthouse 12 audit engine integration
  • AjoutéCore Web Vitals monitoring (LCP, FCP, CLS, TBT, INP, TTFB, Speed Index, TTI)
  • AjoutéMobile and desktop device analysis
  • AjoutéPerformance, Accessibility, Best Practices and SEO scoring
  • AjoutéStripe payment integration with Pro and Business plans
  • AjoutéUser authentication with email verification
  • AjoutéLegal pages (Terms, Privacy, Cookies)
  • AjoutéCORS and security configuration
  • AjoutéDocker containerization with docker-compose