Changelog
Follow the evolution of VitaPulse — new features, improvements and fixes.
Unreleased
v2.31.02026-06-27
- AddedConsentement 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 (composantCookieConsent, 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 cookievp_consentet réappliqué viagtag('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. - AddedPolitique 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 cookievp_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 »). - AddedNavigation 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 ». - AddedFeature 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). - ChangedSEO — redirection 301 de la racine —
GET /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. - ChangedRenommage de la page projet
overviewenscans—/$lang/app/projects/:id/overviewdevient/$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. - ChangedBouton « 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.
- ChangedRé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é). - ChangedFeature 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éfautfalse). 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/scenariosnon déclarée (404), et routes APIscenarios/scenario-runsnon enregistrées. La passer àtrue(présente au build) réactive l'ensemble. - FixedSEO — 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. - Securitynpm 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'optionraw/jsonTransport— usage SMTP standard inchangé) ; ajout d'unoverridews^8.18.3forçant lews@7.5.10transitif de lighthouse vers8.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
- Securitynpm audit → 0 — non-breaking dependency updates (lockfile only, no
package.jsonrange
v2.30.02026-06-06
- SecurityNon-root container — the production image now runs as the built-in non-root
nodeuser (UID/GID 1000) instead of root. The runner stagechowns/app+/home/node(which also re-establishes node ownership of the Playwright/Chromium cache thatnpx playwright installwrote as root) and addsUSER node; supervisord's pidfile moved/run→/tmpto work unprivileged. Chromium already launches with--no-sandbox, and the audit/scan crons run viadocker exec … nodeas 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 owned1000:1000(applied by the deploy script) or sessions/uploads/audit-scratch cannot be written.
v2.29.02026-06-03
- ChangedLiens 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 helpersmdLinksToHtml/stripMd(src/shared/utils.js). - FixedDé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-arrowspour permettre le défilement des onglets, supprimant le débordement.
v2.28.02026-06-03
- ChangedImage 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 marquenews-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 leog:imagepar défaut (public/og-image.png) pour le partage social des pages sans visuel propre.
v2.27.42026-06-03
- FixedLien de documentation cassé (Permissions-Policy / géolocalisation) — la référence « Permission UX - web.dev » de la vulnérabilité
geolocation-on-startpointait vershttps://web.dev/articles/permission-ux, désormais en 404 (article déplacé). Remplacée parhttps://web.dev/articles/permissions-best-practices(équivalent, 200) dans les 4 locales concernées (en, fr, es, de).
v2.27.32026-06-02
- FixedCapture 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. - FixedManifest PWA — screenshots fantômes — le
public/manifest.jsonréférençaitscreenshot-desktop.png/screenshot-mobile.png(champscreenshotsoptionnel) qui n'existent pas, provoquant des 404 et un warning dans la console du navigateur. Tableauscreenshotsretiré (sans impact fonctionnel ; l'écran d'installation PWA n'affichera simplement pas d'aperçus).
v2.27.22026-06-02
- FixedCapture 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 (
fullPageScreenshotnull), 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
- FixedCapture pleine page et Baseline désormais réellement enregistrées — les champs
annotations(capture pleine page + calques LCP/CLS) etbaselineFeatures, introduits en 2.27.0, étaient calculés pendant le scan mais jamais persistés (oubliés dans le$setde sauvegarde,src/services/lighthouse/index.js) ni renvoyés par l'API publique de scan (absents de la projectionPUBLIC_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). - ChangedAffichage 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).
- ChangedCapture 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 runtimesharp.
v2.27.02026-06-02
- AddedRapports 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 })dansgeneratePdf()(src/api/scans/downloadPdf.js) ; le titre d'appareil passe enh1danspdfTemplate.js(changement de balise neutre visuellement, le style étant piloté par classe). - AddedCapture 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.
- AddedCascade 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.
- AddedSection « 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
baselinede Lighthouse 13.3. Présente dans le rapport et le PDF. - ChangedPlaywright (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). - ChangedLighthouse (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). - ChangedOnglets 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.
- ChangedFinition 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.
- FixedPage Contact (crash SSR) — le caractère
@du libellé d'email (you@company.comet 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). - FixedChangelog (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. - FixedNews (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
- ContentSite news article — pricing and Agency plan launch — Article published to the
newsMongoDB 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.coverImageisnull— a human follow-up is needed to add a cover image via the admin panel.
v2.25.02026-05-31
- AddedPage 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-LDProfilePage/Person. L'auteur des articles de news est enrichi enPerson(rôle, photo,sameAsLinkedIn) 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. - ChangedBadge hero — « Powered by Google Lighthouse » devient « Runs on Google Lighthouse » (et désormais correctement traduit en allemand et italien, auparavant restés en anglais)
- ChangedRefonte 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éesmeta.*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 surconst.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. - ChangedRéé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. - ChangedPropagation 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éesmeta.*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. - ChangedVouvoiement 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. - ChangedFlag
multi_deviceretiré 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). - ChangedRenforcement SEO et données structurées (
src/entry-server.js) — émission de la balisemeta keywords(auparavant résolue mais jamais rendue),meta authorréel (Christophe Bragard) sur la page auteur et les articles,Person.worksFor(E-XODE) pour l'E-E-A-T, schémaProductenrichi de 4Offer(prix réels par palier) sur la page tarifs,BreadcrumbListsur docs/vulnérabilités/articles. La route des rapports de scan partageables (/report/:scanId) passe ennoindex, follow.
v2.24.02026-05-31
- AddedPalier 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 - ChangedRefonte 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 - ChangedQuotas 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
- ChangedWhite-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.
canManageAssociateset le nettoyage des associés au downgrade (handleBusinessDowngrade→handleAssociatesDowngrade) basculent sur le palier Agency - ChangedAlertes de régression — désormais incluses dans Business ET Agency (auparavant Business uniquement)
- ChangedRé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
- ChangedPage 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
- Fixedpackage.json — suppression de la virgule traînante après le script
scan(causait unEJSONPARSEaunpm ci)
v2.23.22026-03-22
- ChangedSitemap dynamique — suppression du cron quotidien
generateSitemap.jset du fichier statiquepublic/sitemap.xml. Le sitemap est désormais servi dynamiquement via une route Express/sitemap.xmlavec cache in-memory (TTL 1h)
v2.23.12026-03-17
- FixedEmails discussions — correction de l'URL de fallback dans les templates email de discussion :
vitapulse.io→vitapulse.e-xode.net(5 langues) - ChangedLighthouse 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-http2retiré desskipAudits. Scores a11y/SEO/BP ajustés (poids modifiés). Rétrocompatibilité totale avec les anciens scans - ChangedVite 7 → 8 — migration vers Rolldown (bundler Rust). Option
api: 'modern-compiler'retirée des options SCSS (seul mode supporté). Builds ~2x plus rapides - ChangedVue Router 4 → 5 — mise à jour majeure sans breaking changes (merge de unplugin-vue-router dans le core)
- Changed@vitejs/plugin-vue 5 → 6 — alignement sur Vite 8
- ChangedDé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
- ChangedTipTap épinglé à 3.20.0 — overrides npm pour contourner le publish cassé de 3.20.3 (dist/ manquant)
- ChangedPerformance Insights — extraction enrichie —
extractPerformanceInsights()capture désormais la structure complète des insights Lighthouse :headings,metricSavings,overallSavingsMs/Bytes,scoreDisplayMode,debugData,sortedBy,isEntityGrouped,subItemsimbriqués, et items sans troncature abusive (50 max pour tables, 30 pour listes) - ChangedPerformance Insights — UI refondée —
ScanInsightsSection.vueremplacé 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) - ChangedPerformance 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)
- ChangedAuditDetailTable — subItems et nouveaux valueTypes — support des sous-éléments expandables (clic pour déplier), et des types
source-location,code,numeric - ChangedLighthouse — capture
runtimeError— vérification delhr.runtimeErroraprè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 - ChangedLighthouse —
effortcalculé depuisguidanceLevel— le champeffortdes opportunités est maintenant calculé depuisaudit.guidanceLevel(1→high, 2→medium, 3→low) au lieu d'être hardcodé à'medium' - ChangedLighthouse —
languagedefault cohérent — le fallback de langue passe de'fr'hardcodé àDEFAULT_LOCALE('en') pour respecter la convention du projet - ChangedLighthouse — desktop timeouts configurables —
maxWaitForFcp(15s) etmaxWaitForLoad(35s) desktop sont maintenant dansLIGHTHOUSE_CONFIG.timingau lieu d'être hardcodés - AddedInsightChecklist — nouveau composant pour afficher les insights de type checklist (document-latency, lcp-discovery) avec icônes de validation
- AddedInsightListRenderer — nouveau composant pour afficher les insights de type list (cls-culprits, forced-reflow, breakdowns, network-tree) avec rendu récursif
- AddedLighthouse —
audit.explanation— extraction et affichage du champexplanationde 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
- ChangedGitHub Actions — build workflow déclenché sur push/PR vers
main(remplacenpm run lint/test:runinexistants parnpm run build), Docker build déclenché uniquement sur les tags de release (v*), CodeQL aligné sur la branchemain
v2.22.02026-03-12
- SecurityGoogle 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
useCaptchapartagé, helper serveurverifyCaptchafactorisé
v2.21.02026-03-12
- AddedStatut 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
- AddedSuppression 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
- SecurityValidation 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
- SecurityValidation serveur signin — ajout de la validation email côté serveur dans l'endpoint de connexion
- SecurityRate limit signup renforcé — réduction du rate limit signup de 10 à 5 requêtes par 15 minutes
- SecurityTraduction 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
- AddedSuivi conversions Google Ads — événement GA4
purchasedé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 viaads_conversion_PURCHASE_1 - AddedValidation 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
- AddedValidation email — vérification du format email sur les pages de connexion et d'inscription. Utilise le regex partagé
EMAIL_REGEXau lieu d'un regex inline moins strict - FixedTextes 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
- AddedLangue 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)
- FixedTraductions 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)
- FixedTraductions 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
- FixedAppel parasite quick-audit/convert — nettoyage du localStorage lorsque la conversion échoue, évitant un appel API inutile à chaque connexion
v2.18.12026-03-08
- ChangedLimite 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)
- FixedLimite scans Business — correction de la limite de scans manuels du plan Business (était
Infinity, maintenant 100). Seul l'admin est illimité - FixedReset 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) - FixedAffichage compteur scans — le dashboard Billing affiche maintenant les scans du mois en cours (
scansThisMonth) au lieu du total à vie - FixedAlignement 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
- AddedLangue 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)
- AddedNews multilingues dynamiques — refonte de l'éditeur de news admin : EN toujours obligatoire, ajout de langues supplémentaires via bouton (+), onglets dynamiques par langue. Champ
languagesstocké sur chaque news. Recherche admin étendue à toutes les langues. Chips de langues affichées dans la liste admin - ChangedRé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
- ChangedPage 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
- AddedLanding 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 - ChangedLimites 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)
- ChangedCheckoutView factorisé — les features hardcodées en anglais sont remplacées par les traductions i18n de la page pricing
v2.16.22026-03-07
- AddedProjectBanner 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
- SecurityCodes de sécurité cryptographiques — remplacement de
Math.random()parcrypto.randomInt()pour la génération des codes 2FA - SecurityComparaison timing-safe — les vérifications de codes de sécurité utilisent désormais
crypto.timingSafeEqualpour prévenir les attaques par timing - SecurityProtection open redirect — validation du paramètre
redirectdans les pages d'authentification (signin, signup, verify-code) - SecurityInvalidation des sessions — les autres sessions sont détruites lors d'un changement de mot de passe ou d'email
- SecurityFuite de stack trace — les erreurs 500 n'exposent plus la stack trace en production
- SecuritySecret de cookie — le secret de session est désormais obligatoire en production (plus de fallback en dur)
- SecurityCSP Helmet activé — Content Security Policy configuré en production (script-src, style-src, frame-src, etc.)
- SecuritySanitization v-html — les descriptions Stack Packs sont désormais sanitizées via DOMPurify
- SecurityWebhook Stripe — les messages d'erreur ne divulguent plus les détails Stripe internes
- SecuritySanitization HTML durcie — restriction de l'attribut
styleau tagspanuniquement, regex de couleur stricte - SecurityRate limiting étendu — ajout de limites sur change-password, change-email, verify-email-change
- SecurityPlages IPv6 privées complètes — ajout des plages
fd00:,::ffff:mapped pour bloquer les scans sur IPs privées - FixedBug associates/invite.js — correction d'un crash
ReferenceErrorquand la variableprojectétait utilisée avant sa déclaration
v2.16.12026-03-07
- FixedSSR 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
- AddedPage 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)
- AddedMé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
NewsArticleavec auteur et dates - Addedx-default dans le sitemap — le générateur de sitemap inclut désormais le hreflang
x-default - ChangedOptimisation fonts — suppression du double chargement Google Fonts dans
index.html(déjà chargé viastyle.css) et de la police IBM Plex Mono inutilisée - ChangedRemplacement 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 - Fixedrobots.txt — correction du domaine du sitemap (pointait vers un domaine inexistant)
- FixedSchema Pricing — suppression du faux
AggregateRating(données inventées) - Removed
useMeta.js— composable jamais utilisé, supprimé (dead code) - Removed
sitemap.xmldu dépôt Git — fichier régénéré quotidiennement par cron, ne doit pas être versionné
v2.15.02026-03-07
- AddedSuppression 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
- AddedNavigation 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
- FixedBadge 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
- AddedRedirection 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)
- AddedLiens 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
- AddedBadge 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
- AddedAnnulation 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
- AddedBanniè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
ProjectBannerréutilisable - AddedLien résultats complets — lien "Consulter tous les résultats de l'audit" sous les scores dans la page projet
- ChangedLogo 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
- ChangedAvatar 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
- ChangedMenu header — l'option "Administration" est déplacée juste avant "Déconnexion" (après le divider) au lieu d'être en première position
- ChangedMongoDB connection — encodage
encodeURIComponent()du nom d'utilisateur et mot de passe dans l'URI de connexion pour gérer les caractères spéciaux - ChangedTraduction française — remplacement de tous les termes "scan/scans" par "audit/audits" dans l'interface française
- ChangedHarmonisation 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 decalc(100vh - 72px)par$header-heightdans 6 pages app
v2.13.32026-03-06
- FixedEmail 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
- ChangedFactorisation
getProjectScanData()— la logique d'extraction des scores et headers de sécurité pour les emails d'invitation est centralisée dansdbHelpers.js(utilisée parinvite.jsetshare.js)
v2.13.22026-03-06
- ChangedMongoDB indexes initialization —
initializeCollections(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) - ChangedOptimisation 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 - ChangedAggregation
$facet— les endpointsGET /api/projects/:id/scansetGET /api/admin/projects/:idcombinent désormais data + count en une seule requête MongoDB au lieu de deux - ChangedAdmin scans pagination — l'endpoint
GET /api/admin/scansest désormais paginé (50 résultats/page avec navigation) au lieu de charger 200 résultats d'un coup - ChangedIndex compound scans — ajout de l'index
{ projectId: 1, status: 1, createdAt: -1 }pour optimiser les requêtes filtrées par statut - FixedMongoDB sort memory overflow — ajout de
allowDiskUse()sur les requêtes de listing scans pour éviter le crashQueryExceededMemoryLimitNoDiskUseAllowedsur les collections volumineuses
v2.13.12026-03-06
- ChangedSé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/verifyCodedansemail.js) - ChangedSécurité : projection MongoDB sur
users— exclusion systématique des champs sensibles (password,securityCode,securityCodeExpires,securityCodeAttempts) viafindUserSafe()dans 18 fichiers API (billing, projects, associates, scans) - ChangedSécurité : sanitization formulaire de contact — les champs
name,subjectetmessagesont désormais trimés et sanitizés viasanitize-htmlavant envoi - ChangedExtraction IP centralisée — remplacement de 9 occurrences de
req.headers['x-forwarded-for']manuelles pargetClientIp(req)dans les endpoints commentaires, discussions et admin - ChangedConsolidation
escapeHtml— suppression des 2 implémentations dupliquées (entry-server.js, useMeta.js), import unique depuisshared/utils.js. Ajout de l'échappement des quotes simples ('→') - ChangedHelpers backend factorisés —
parseObjectId(),parsePagination(),findUserSafe()dansdbHelpers.js; pagination utilisée dans 4 endpoints (logs, discussions, news, scans) - ChangedRobustesse logging —
logEvent()loggue désormais les erreurs d'écriture MongoDB au lieu de les ignorer silencieusement - ChangedRobustesse router — le catch vide dans
router.beforeEachloggue désormais les erreurs de vérification auth
v2.13.02026-03-06
- AddedProject 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.
- AddedUnified discussion system — news comments and project discussions now share the same data architecture (
discussions,discussionMessages,discussionReadscollections) and reusableCommentThreadcomponent - AddedDiscussion email notifications — configurable alerts for new discussions and new messages, with separate toggles in project settings (available for all plans)
- AddedAdmin discussions page — manage all discussions (news and projects) from admin panel with filtering by type and deletion capabilities
- AddedRich 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 - AddedServer-side HTML sanitization — all user-generated HTML content (discussions and news comments) is sanitized server-side via
sanitize-htmlto prevent XSS attacks. Only safe tags, attributes, and YouTube iframes are allowed - AddedClient-side HTML sanitization — DOMPurify applied to all
v-htmlrendering (discussion messages, news article content, news comments) - AddedSource 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
- AddedPage 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
- ChangedNews comments — migrated from
newsComments/newsReadsto unifieddiscussions/discussionMessages/discussionReadscollections (breaking: existing news comments are lost, fresh start) - ChangedTiptapEditor — moved from
components/admin/tocomponents/common/for reuse across discussions and news. AddedshowRawModeprop (raw HTML mode now admin-only) - ChangedDiscussion & 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
- FixedNews comment log events — posting or editing a news comment now logs
news-comment-createandnews-comment-editevents (was missing)
v2.12.12026-03-03
- FixedAssociate sharing bug — re-inviting an accepted associate on a new project incorrectly returned an "already associate" error instead of sharing the project
- FixedAssociate 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
- FixedProject settings centering — page was not centered due to missing
container-narrowclass - AddedAssociate empty states — each section (project associates, pending invitations, other associates) now shows an explicit message when empty
- AddedSignup 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
- AddedUser 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
- AddedNews author display — news articles show "Published by {name}" with author avatar below the title. Author is automatically tracked when creating news
- ChangedEmail templates — added VitaPulse logo (icon-192.png) in email header above the brand name for better visual identity
- ChangedAssociate invite emails — include the inviter's avatar and name in a styled card
- FixedSecurity headers detection — response headers were extracted from redirect responses (301/302) instead of the final response (200), causing security headers like
strict-transport-securityto be incorrectly reported as missing. Now useslhr.finalDisplayedUrlfor URL matching and filters only 2xx responses
v2.11.02026-03-01
- AddedGoogle 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_IDenvironment variable - AddedSitemap generator cron — automated
public/sitemap.xmlgeneration with all static pages (11 routes × 3 locales with hreflang alternates) and dynamic news pages from database. Run vianpm run sitemapor scheduled cron - AddedPublic news list page — new paginated
/newspage accessible without authentication, SEO-indexable with cover images, excerpts and pagination. News routes moved from/app/news/to/news/for better search engine visibility - AddedDynamic news back link — back button on news detail page dynamically adapts based on navigation history (returns to news list, dashboard or previous page)
- AddedTipTap HTML raw mode — toggle button in the editor toolbar to switch between WYSIWYG and raw HTML editing, allowing direct HTML paste
- AddedBlog link in footer — added Blog link in the Resources column of the footer
- ChangedOptimized 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.) - ChangedVue Router navigation guard — migrated from deprecated
next()callback to return-based API - FixedTipTap duplicate extensions warning — disabled
linkandunderlinein StarterKit config since they are added separately with custom configuration - FixedNews validation error messages — admin news creation/update now returns specific missing field names instead of generic
error.validation - FixedNewsDetailView comments crash — restored missing
commentsref declaration
v2.10.02026-03-01
- AddedEmail 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)
- AddedEnriched 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
- AddedSecurity alerts email helper — new
renderSecurityAlerts()shared helper inemailLayout.jsfor displaying missing security headers with severity badges - AddedResponsive container widths — optimized Vuetify container max-widths for all breakpoints (92% at md, 1080px at lg, 1400px at xl, 1800px at xxl) with
.container-narrowopt-out for form/centered pages - Added
.form-narrowutility class — constrains form widths to 640px max, applied to ProjectSettingsView and ProjectNewView - ChangedUnified 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. - ChangedUpgraded Vuetify from 3.x to 4.0.0 — full Material Design 3 migration
- ChangedMigrated all typography classes from MD2 to MD3 (text-h1→text-display-large, text-body-2→text-body-medium, text-caption→text-body-small, etc.)
- ChangedMigrated VRow grid props (
align→ CSS class,dense→density="compact") - ChangedUpdated SCSS breakpoints to MD3 values (md: 840px, lg: 1145px, xl: 1545px, xxl: 2138px)
- ChangedAdded
xxlbreakpoint mixin to SCSS design system - ChangedAdded CSS reset for headings/paragraphs to replace Vuetify 4's removed global reset
- ChangedUpdated
vuefrom 3.5.27 to 3.5.29 - ChangedUpdated
playwrightfrom 1.58.1 to 1.58.2 - ChangedUpdated
corsfrom 2.8.5 to 2.8.6 - ChangedUpdated
vue-routerfrom 4.6.4 to 5.0.3 - ChangedUpdated
mongodbfrom 6.21.0 to 7.1.0 - ChangedUpdated
nodemailerfrom 6.10.1 to 8.0.1 - ChangedUpdated
stripefrom 14.25.0 to 20.4.0 - ChangedUpdated
@stripe/stripe-jsfrom 3.5.0 to 8.8.0 - FixedEmail link colors — fixed link colors being overridden by email clients (Gmail, Outlook) using
<span>wrapper technique - FixedPending associates visibility — associates with pending status now appear in the project settings list instead of being hidden until they accept
- FixedNode watch paths — added
src/translate/emails/to--watch-pathlist for email template hot-reload in development
v2.9.02026-02-28
- AddedSecurity vulnerabilities documentation page (
/docs/vulnerabilities) with detailed guides for HTTP security headers, TLS/SSL, Lighthouse security audits, and software version exposure (26 vulnerabilities total) - AddedSeparate translation files for vulnerabilities (
src/translate/vulnerabilities/en.json,fr.json) - AddedVulnerability detail view with route
/docs/vulnerabilities/:idand breadcrumb navigation - AddedVulnerabilities listed in Docs page section #10 with severity chips and direct links
- Added4 vulnerability categories: HTTP Security Headers (10), TLS/SSL Certificate (5), Lighthouse Security Audits (7), Software Version Exposure (4)
- AddedSpanish language support (es.json, vulnerability translations, email templates, flag icon)
- AddedCentralized locale configuration (
SUPPORTED_LOCALES,LOCALE_CODES,getIntlLocale(),getOgLocale()inshared/const.js) — adding a new language only requires updating the single source of truth - AddedChangelog page now auto-generated from
CHANGELOG.md— single source of truth, no duplication in translation files - ChangedRedesigned header action elements (language switcher, account, sign in) with consistent pill-style buttons using shared SCSS mixin
- ChangedLanguage switcher now displays country flag emoji (🇬🇧/🇫🇷) with locale code, clearly interactive at rest
- ChangedCTA buttons (Dashboard, Start Free) use rounded pill style for visual consistency
- ChangedMobile drawer language buttons also show flag emojis
v2.8.32026-02-28
- FixedPDF section order now matches app tab order: Security → Quality → Performance → Resources → Advanced (Global → Framework → Critical Chains → Scripts Treemap → Audit Timing → Passed)
- FixedMoved
runWarningsfrom after CWV to Advanced/Global section in PDF - FixedMoved
consoleto first position in Advanced section in PDF - FixedAdded missing translation key
scan.details.showAll(EN/FR)
v2.8.22026-02-28
- ChangedMoved Server Response Time block from Advanced > Global to Performance tab (displayed before Opportunities/Diagnostics)
- ChangedPDF report updated to match new Server Response Time placement
v2.8.12026-02-28
- AddedAdvanced tab split into 6 sub-tabs: Global, Framework, Critical Chains, Scripts Treemap, Audit Timing, Passed
- AddedNew components:
ScanStackPacksSection,ScanCriticalChainsSection,ScanScriptTreemapSection,ScanAuditTimingSection - ChangedAdvanced > Global sub-tab: Console section displayed first, then Server Response Time, then remaining technical data
- ChangedFixed console section scrollbar overflow (removed unnecessary max-height constraint)
- FixedConsole section displaying unwanted horizontal/vertical scrollbars
v2.8.02026-02-28
- AddedHTTP response headers extraction from Lighthouse artifacts (
NetworkRecords) during scans - AddedStandalone Security tab in scan results with four sub-tabs: "TLS Certificate", "Response Headers", "Software Versions" and "Lighthouse Audits"
- AddedSecurity headers analysis: 10 critical headers checked (HSTS, CSP, X-Frame-Options, etc.) with present/missing status and risk severity levels (high/medium/low)
- AddedFull response headers table in Security > Headers sub-tab
- AddedTLS certificate analysis: protocol version, cipher suite, signature algorithm, issuer, expiration with warnings for weak/expired certificates
- AddedSoftware versions detection from HTTP headers (Server, X-Powered-By), HTML content (CMS, meta generator, frameworks) and TLS protocol
- AddedPDF report: security section now includes TLS certificate, response headers, software versions and Lighthouse security audits
- AddedGlobal CSS gap utilities (
.gap-1to.gap-16) in design system — fixes allgap-*classes that were non-functional with Vuetify - AddedLighthouse scores sorted worst-to-best on scan details page and project overview page
- AddedCore Web Vitals sorted worst-to-best on scan details page and project overview page
- AddedQuick stats clickable: navigate to corresponding tab and sub-tab with smooth scroll
- AddedPassed audits click scrolls directly to Passed section anchor within Advanced tab
- ChangedScan result tabs reordered: Security → Quality → Performance → Resources → Advanced
- ChangedSecurity tab is now the default selected tab on scan results
- ChangedSecurity issues moved from Quality tab sub-tab to standalone Security tab
- ChangedScan results overview layout reorganized: environment chips before quick-stats, screenshot in 3rd column
- ChangedLoading timeline moved from overview to Resources tab (after stat-cards, before resources by type)
- ChangedQuality tab reduced from 4 sub-tabs to 3 (accessibility, SEO, best practices)
v2.7.12026-02-28
- ChangedRefactored project creation wizard: removed step 4 (scan progress), now redirects to project overview after creation where
ScanProgressCardhandles scan progress display - ChangedProject creation wizard reduced from 4 steps to 3 steps (Info → Pages → Alerts → Launch)
- FixedDashboard news section not displaying:
NewsSectionwas readingdata.newsinstead ofdata.itemsfrom API response - FixedScan results: overview section extracted from tabs and displayed permanently between CWV and tab navigation
v2.7.02026-02-28
- AddedLocalized URLs: all routes now prefixed with locale (
/en/*,/fr/*) - Added
useLocalePathcomposable for locale-aware navigation - AddedAutomatic locale detection from browser on first visit
- AddedSEO: hreflang, canonical, og:locale, and Schema.org inLanguage in SSR
- AddedLocale switcher updates URL path in real-time
- AddedNews system: CRUD backend with bilingual content (FR/EN), cover image upload, sticky/homepage banner flags
- AddedNews comments with moderation: users can post, edit own comments; admin approval workflow with pending/approved/rejected status
- AddedComment rate limiting: configurable max comments per time window via admin settings
- AddedAdmin news management: TipTap WYSIWYG editor, bilingual tabs, publish/draft, sticky and homepage banner controls
- AddedAdmin comments moderation panel: approve, reject, delete comments with filters
- AddedDashboard news section: latest 3 articles with unread badge and sticky indicator
- AddedNews detail page with full content rendering and comments section
- AddedHomepage news banner: dismissible gradient banner for featured articles
- AddedIP tracking: user login IPs stored with history for security auditing
- AddedUser blocking system: admin can block by account and/or IP addresses
- AddedAdmin user detail: security section with block/unblock UI, IP history table with per-IP status and unblock action
- AddedAdmin bypass: administrators exempt from all plan limits (projects, scans, associates, pages)
- AddedFavicon: SVG/PNG/ICO with VitaPulse branding (gradient V + pulse line)
- AddedNews publicly accessible: reading news and comments no longer requires authentication
- AddedComment posting/editing still requires authentication, with "Sign in to comment" prompt for visitors
- AddedCentralized event logging system:
logEvent()helper,logscollection, admin logs page with search/filter/delete - AddedEvent logging instrumented across all endpoints: auth, projects, scans, billing, associates, admin, contact, quick audit, PDF download (40+ events)
- AddedAdmin user detail: recent activity logs section with link to filtered logs page
- AddedForgot password flow: email verification code, reset password page
- AddedChange password: authenticated users can change password from account page
- AddedAccount page: profile editing (name) and password change under
/app/account - ChangedPricing FAQ completely rewritten with 20 comprehensive questions covering all features, plans, and capabilities
- ChangedBackend-generated URLs (Stripe checkout, emails, Google Chat webhooks, share links) now include locale prefix
- ChangedAdmin user detail page shows IP history and blocking controls
- ChangedSCSS design system: all hardcoded hex colors, border-radius, font-size, font-weight replaced with variables across 30+ files
- ChangedNew SCSS mixins:
hover-row,hover-lift,hover-light-on-dark,link-on-dark,link-primaryfor consistent hover effects - ChangedRemoved unused SCSS mixins (
status-good/warning/error,score-gauge) - ChangedAdded
$border-radius-xs,$gradient-dark-diagonalSCSS variables - ChangedFavicon and apple-touch-icon now use relative paths (fixes cross-origin issues in dev)
- ChangedRemoved orphan
src/views/auth/directory (duplicate ofsrc/views/Auth/) - ChangedRefactored: auth page SCSS extracted to global
.auth-pageclass in_components.scss - ChangedRefactored:
getEventColor/getEventCategory/formatLogMetaextracted touseLogUtilscomposable - ChangedRefactored: business downgrade logic extracted to
handleBusinessDowngrade()indbHelpers.js - ChangedRefactored: inline URL truncation styles replaced with
.admin-url-truncateSCSS class - ChangedLogger
logEvent()changed to fire-and-forget with.catch(() => {})(no more async/await) - SecurityObjectId validation added to all news/comments API endpoints
- SecurityObjectId.isValid() validation added to all API endpoints accepting ID parameters (17+ routes)
- SecurityError logging (
console.error) added to all catch blocks across the entire API (15+ files) - SecurityBlocked users/IPs rejected at login with appropriate error messages
- SecurityMongoDB projection added to user query in lighthouse.js to exclude password hash
- SecurityWebhook error responses standardized to JSON format
- SecuritysetReference race condition fixed with atomic bulkWrite operation
- FixedHardcoded French progress messages in scan store replaced with i18n keys (
scan.progress.*) - FixedDefault locale inconsistency: backend now uses
DEFAULT_LOCALE('en') everywhere instead of mixed 'fr'/'en' - FixedHardcoded French in
useDateFormat.jsreplaced with i18n keys (dashboard.fewSeconds,dashboard.days) - FixedDefault locale for
formatDateShort/formatDateFullchanged from'fr-FR'to'en-US' - FixedScan status colors centralized in
SCAN_STATUS_COLORSconstant (removed duplication in 3 admin views) - FixedObjectId validation added to
findUserOrSharedProjecthelper (prevents crash on invalid IDs) - FixedCron notifications now log warnings on failure instead of silently swallowing errors
- FixedCron scheduled scans now validate
project.urlbefore launching scan - FixedTiptapEditor image upload now handles fetch errors and checks
res.ok - FixedUnused
shallowRefimport removed from NewsDetailView - FixedUnused
mdiEyeOffimport removed from AdminNewsEditView
v2.6.12026-02-27
- ChangedCWV tooltips on scan detail page now show per-metric descriptions matching project overview page
- ChangedRemoved non-functional expandable CWV cards on scan detail page
- ChangedAdded spacing between Mobile/Desktop toggle buttons
- ChangedRemoved share report button from scan detail page
v2.6.02026-02-27
- AddedPlan upgrade/downgrade with Stripe proration (Pro ↔ Business, monthly ↔ yearly)
- AddedUpgrade preview dialog showing prorated amount before confirmation
- AddedWebhook handler for
customer.subscription.updatedas backup sync - AddedCheckout guard preventing duplicate subscriptions
- AddedProject screenshot thumbnail on dashboard cards and project overview header
- AddedPlaceholder image for projects without scans (VitaPulse branded SVG)
- ChangedUpgrade button in Billing page now opens inline preview dialog instead of redirecting to pricing
- ChangedPricing page buttons adapt for existing subscribers (upgrade, downgrade, cycle change)
- ChangedDowngrade from Business automatically revokes associates
- ChangedAdmin downgrade from Business now properly revokes associates and cleans shared projects
v2.5.12026-02-27
- AddedAssociates can now view project settings in read-only mode
- AddedAssociates can manage their own email notification preferences (scan results and regression alerts) based on their plan
- AddedAssociate notification emails are sent after each scan completion
v2.5.02026-02-27
- ChangedCase Studies page: fixed all section-to-page mappings to match actual PDF content (16 sections for 28 pages)
- ChangedCase Studies page: corrected metrics values (mobile 82, desktop 78)
- ChangedDocumentation page: complete rebuild with comprehensive VitaPulse user guide (10 sections: Quick Audit, Projects, Scans, Scores, CWV, Opportunities, Regressions, PDF Reports, Associates, Plans)
- ChangedDocumentation page: added quick start cards, table of contents, and screenshot illustrations
- ChangedLanding page: enhanced features section with 6 benefit cards and 4 illustrated feature showcases
- ChangedChangelog page: complete rewrite with full version history (v1.0.0 to v2.4.0)
- ChangedSecurity page: updated with VitaPulse-specific security practices and technical details
- ChangedTerms of Service: comprehensive rewrite with 12 sections covering SaaS-specific terms
- ChangedPrivacy Policy: GDPR-compliant rewrite with detailed data collection, storage, and rights information
- ChangedCookie Policy: rewritten to reflect actual minimal cookie usage (single session cookie)
- RemovedAPI documentation page and route (no public API)
- RemovedBlog page link from footer (no blog content)
- RemovedStatus page link from footer
v2.4.12026-02-26
- ChangedProject settings page: split into tabs (Settings / Associates) for Business plan users
- ChangedDashboard: search field and project filter now on the same line
- FixedAssociates tab not switching (missing activeTab ref)
- FixedInvite button not vertically centered next to email input
v2.4.02026-02-26
- AddedAssociates system for Business plan users: invite up to 5 associates by email to share project access
- AddedAssociates management section in project settings (invite, share, remove per project)
- AddedDashboard filter (All / My projects / Shared with me) with shared badge showing owner name
- AddedEmail invitation templates for associates (existing user + new user) in EN/FR
- AddedAutomatic project linking when invited associate registers a new account
- AddedAssociate access inheritance: associates inherit PDF download and report sharing capabilities from project owner's plan
- AddedScan ownership awareness: project owners can manage scans launched by associates
- AddedAutomatic associate revocation on plan downgrade (Business → Pro/Free)
v2.3.22026-02-26
- FixedGlobal button spacing: adjacent buttons in card actions are no longer visually stuck together
- FixedCWV history chart now auto-rebuilds project stats from existing scans when collection is empty
v2.3.12026-02-22
- FixedAdmin scores display not showing due to per-device nested data structure
- FixedAdmin CWV table empty due to same nested structure issue
- FixedScan detail page now shows scores and CWV per device with mobile/desktop toggle
v2.3.02026-02-22
- AddedAdmin user detail page with editable plan, type, name, company
- AddedUser projects list in admin user detail
- AddedClickable rows in admin users table
- AddedAdmin project detail page with editable name, URL, scan frequency
- AddedProject scans list in admin project detail with status, score, device
- AddedClickable project rows in admin projects list and user detail
- AddedLink to project owner from project detail page
- AddedAdmin scan detail page with scores, CWV, regressions display
- AddedEditable scan status and reference flag from admin
- AddedAdmin scan delete with confirmation dialog
- AddedClickable scan rows in admin scans list and project detail
- AddedLinks to owner and project from scan detail page
v2.2.12026-02-22
- FixedLanding page hero section alignment and height
v2.2.02026-02-22
- AddedUser
typefield (userdefault,adminmanual) for role-based access - AddedAdmin dashboard with user listing (email, plan, projects, scans, registration date)
- AddedAdmin projects page listing all projects with owner, scan count, latest score
- AddedAdmin scans page listing 200 most recent scans with project, owner, status, score, duration
- Added
requireAdminmiddleware for admin-only API endpoints - AddedAdmin menu in header (crown icon) visible only for admin users
- AddedAdmin route guard (
requiresAdmin) on frontend router - ChangedCWV history chart now uses dedicated
projectStatscollection with incremental aggregation instead of paginated scan data - ChangedStats are pushed to
projectStatson each scan completion (no cron needed) - ChangedNew
GET /api/projects/:id/statsendpoint for lightweight chart data
v2.1.02026-02-21
- Added"Set as reference" action on scan details page with
isReferencebadge display - AddedNetwork requests table in Resources tab (URL, type, protocol, status, transfer/resource size, priority)
- AddedMain thread time column in third-party summary table
- AddedParse/Compile column in script bootup table
- AddedOverview stat cards in Resources tab (requests, transferred, third parties count, JS libraries count)
- AddedShow more/less toggle on script bootup, third-party, and network requests tables
- AddedCore Web Vitals history chart (Plotly) on project overview page, visible when at least 2 completed scans exist
- ChangedMerged "Insights" tab into "Performance" tab (opportunities + diagnostics + insights)
- ChangedMerged "Technical", "Console", and "Passed" tabs into a single "Advanced" tab
- ChangedReplaced
v-btn-togglenavigation withv-tabsfor scan result sections - ChangedRedesigned Resources tab with section headers, sorted resource bars, and detailed tables
- ChangedThird-party section now displays data directly from
thirdPartySummarywith entity name and main thread time - ChangedReplaced
networkSummary(aggregate) with detailednetworkRequeststable - ChangedRegression detection now prioritizes scans marked as
isReferencebefore falling back to latest scan - ChangedSynchronized 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
- AddedComprehensive 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)
- AddedCase studies page with real audit data from www.e-xode.net (23-page PDF, per-page screenshots, key metrics, takeaways)
- AddedComplete i18n localization system with
createT(locale)server-side translation resolver - AddedShared component library: 13 reusable components extracted (
AlertError,ConfirmDialog,DataTable,EmptyState,LoadingSpinner,PageHeader,ScoreCircle,ScanProgressCard,SearchInput,SectionCard,StatCard,StatusChip,UpgradeCta) - AddedShared utilities module (
shared/utils.js) withescapeHtml,formatBytes,formatMs,getScoreColor,getScoreLabel,getScoreBg,getCwvStatus,getCwvColor,formatCwvValue - AddedShared constants module (
shared/const.js) withDEVICES,CWV_METRICS,INSIGHTS_FAILING_THRESHOLD,SCAN_DATA_FIELDS - AddedShared database helpers (
shared/dbHelpers.js) for MongoDB operations - AddedShared API client (
shared/api.js) with centralized error handling - AddedRate limiting on all API endpoints with configurable windows
- AddedSession management with automatic cleanup on dev startup
- AddedVersion number displayed in application footer
- AddedPDF White Label mode for Business plan users
- AddedApp version exposed via Vite
definefor frontend access - ChangedRewrote
pdfTemplate.js(~580 lines) with all scan data sections, matching app UX/design (brand gradient, score colors, impact badges, CWV thresholds) - ChangedRewrote
downloadPdf.jswith comprehensivepreparePdfData()extracting all 35+ scan data fields per device - ChangedRefactored all Pinia stores to use shared utilities and constants
- ChangedRefactored all API endpoints to use shared database helpers and middleware
- ChangedUpdated all Vue components to use shared component library
- ChangedMigrated all hardcoded strings to i18n translation files (en.json, fr.json)
- ChangedUpdated
entry-server.jswith i18n-aware SSR (getRouteMeta,generateMetaTags,getSchemaMarkup) - ChangedUpdated
index.htmlwith<!--app-lang-->placeholder for dynamic lang attribute - ChangedRewrote
CaseStudiesView.vuewith real audit content and PDF page screenshots - ChangedImproved error handling across all API routes with safe JSON parsing
- FixedSecurity audit: input validation, authorization checks, rate limiting on all endpoints
- FixedData parity between scan storage and display fields
- FixedDocker and Playwright configuration for PDF generation
- FixedSession cleanup preventing stale session file accumulation
- FixedRate limiting configuration for different endpoint categories
- FixedSSR hydration for localized meta tags and schema markup
- FixedTranslation key consistency across all components
- SecurityAdded
requireAuthmiddleware on all protected routes - SecurityAdded input sanitization with
escapeHtmlutility - SecurityEnforced ownership checks on scan/project access
- SecurityConfigured Helmet CSP and CORS policies
- SecurityAdded rate limiting per API category (auth, scans, general)
v1.3.02026-02-10
- AddedCase studies page showcasing VitaPulse audit capabilities
- AddedGitHub Actions workflow for CI testing
- ChangedLayout improvements across all views
- ChangedTranslation updates for all supported locales
- ChangedMajor layout and code refactoring
v1.2.02026-02-07
- AddedCoupon management system for Stripe payments
- AddedQuick audit rate limiting (max audits per plan)
- AddedAutomated cron jobs for data pruning
- AddedEmail notifications with scoring reports
- AddedMulti-page scan support
- ChangedPricing logic refactored with plan-based feature gating
- ChangedHeader theme improvements
- ChangedReport results display fixes
- FixedDocker environment variables for Stripe integration
- FixedTranslation consistency issues
v1.1.02026-02-06
- AddedPDF report export with Chromium rendering
- AddedSEO optimizations (meta tags, schema markup, sitemap)
- AddedScan animation and progress indicators
- AddedCSS design system with variables and mixins
- AddedDetailed audit results display (8 tabbed sections)
- AddedNew project creation workflow with guided steps
- ChangedFactorized scan animation components
- ChangedServer-side rendering fixes for Vue Router
- FixedTranslation loading and fallback behavior
- FixedServer rendering hydration issues
v1.0.02026-02-04
- AddedInitial release of VitaPulse platform
- AddedLighthouse 12 audit engine integration
- AddedCore Web Vitals monitoring (LCP, FCP, CLS, TBT, INP, TTFB, Speed Index, TTI)
- AddedMobile and desktop device analysis
- AddedPerformance, Accessibility, Best Practices and SEO scoring
- AddedStripe payment integration with Pro and Business plans
- AddedUser authentication with email verification
- AddedLegal pages (Terms, Privacy, Cookies)
- AddedCORS and security configuration
- AddedDocker containerization with docker-compose