Registro delle modifiche
Tutte le modifiche importanti a VitaPulse
Non rilasciato
v2.31.02026-06-27
- AggiuntoConsentement 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. - AggiuntoPolitique 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 »). - AggiuntoNavigation 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 ». - AggiuntoFeature 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). - ModificatoSEO — 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. - ModificatoRenommage 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. - ModificatoBouton « 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.
- ModificatoRé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é). - ModificatoFeature 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. - CorrettoSEO — 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. - Sicurezzanpm 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
- Sicurezzanpm audit → 0 — non-breaking dependency updates (lockfile only, no
package.jsonrange
v2.30.02026-06-06
- SicurezzaNon-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
- ModificatoLiens 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). - CorrettoDé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
- ModificatoImage 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
- CorrettoLien 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
- CorrettoCapture 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. - CorrettoManifest 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
- CorrettoCapture 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
- CorrettoCapture 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). - ModificatoAffichage 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).
- ModificatoCapture 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
- AggiuntoRapports 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). - AggiuntoCapture 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.
- AggiuntoCascade 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.
- AggiuntoSection « 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. - ModificatoPlaywright (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). - ModificatoLighthouse (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). - ModificatoOnglets 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.
- ModificatoFinition 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.
- CorrettoPage 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). - CorrettoChangelog (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. - CorrettoNews (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
- ContenutoSite 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
- AggiuntoPage 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. - ModificatoBadge hero — « Powered by Google Lighthouse » devient « Runs on Google Lighthouse » (et désormais correctement traduit en allemand et italien, auparavant restés en anglais)
- ModificatoRefonte 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. - ModificatoRéé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. - ModificatoPropagation 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. - ModificatoVouvoiement 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. - ModificatoFlag
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). - ModificatoRenforcement 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
- AggiuntoPalier 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 - ModificatoRefonte 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 - ModificatoQuotas 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
- ModificatoWhite-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 - ModificatoAlertes de régression — désormais incluses dans Business ET Agency (auparavant Business uniquement)
- ModificatoRé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
- ModificatoPage 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
- Correttopackage.json — suppression de la virgule traînante après le script
scan(causait unEJSONPARSEaunpm ci)
v2.23.22026-03-22
- ModificatoSitemap 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
- CorrettoEmails discussions — correction de l'URL de fallback dans les templates email de discussion :
vitapulse.io→vitapulse.e-xode.net(5 langues) - ModificatoLighthouse 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 - ModificatoVite 7 → 8 — migration vers Rolldown (bundler Rust). Option
api: 'modern-compiler'retirée des options SCSS (seul mode supporté). Builds ~2x plus rapides - ModificatoVue Router 4 → 5 — mise à jour majeure sans breaking changes (merge de unplugin-vue-router dans le core)
- Modificato@vitejs/plugin-vue 5 → 6 — alignement sur Vite 8
- ModificatoDé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
- ModificatoTipTap épinglé à 3.20.0 — overrides npm pour contourner le publish cassé de 3.20.3 (dist/ manquant)
- ModificatoPerformance 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) - ModificatoPerformance 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) - ModificatoPerformance 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)
- ModificatoAuditDetailTable — subItems et nouveaux valueTypes — support des sous-éléments expandables (clic pour déplier), et des types
source-location,code,numeric - ModificatoLighthouse — 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 - ModificatoLighthouse —
effortcalculé depuisguidanceLevel— le champeffortdes opportunités est maintenant calculé depuisaudit.guidanceLevel(1→high, 2→medium, 3→low) au lieu d'être hardcodé à'medium' - ModificatoLighthouse —
languagedefault cohérent — le fallback de langue passe de'fr'hardcodé àDEFAULT_LOCALE('en') pour respecter la convention du projet - ModificatoLighthouse — desktop timeouts configurables —
maxWaitForFcp(15s) etmaxWaitForLoad(35s) desktop sont maintenant dansLIGHTHOUSE_CONFIG.timingau lieu d'être hardcodés - AggiuntoInsightChecklist — nouveau composant pour afficher les insights de type checklist (document-latency, lcp-discovery) avec icônes de validation
- AggiuntoInsightListRenderer — nouveau composant pour afficher les insights de type list (cls-culprits, forced-reflow, breakdowns, network-tree) avec rendu récursif
- AggiuntoLighthouse —
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
- ModificatoGitHub 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
- SicurezzaGoogle 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
- AggiuntoStatut 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
- AggiuntoSuppression 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
- SicurezzaValidation 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
- SicurezzaValidation serveur signin — ajout de la validation email côté serveur dans l'endpoint de connexion
- SicurezzaRate limit signup renforcé — réduction du rate limit signup de 10 à 5 requêtes par 15 minutes
- SicurezzaTraduction 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
- AggiuntoSuivi 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 - AggiuntoValidation 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
- AggiuntoValidation 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 - CorrettoTextes 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
- AggiuntoLangue 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)
- CorrettoTraductions 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)
- CorrettoTraductions 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
- CorrettoAppel parasite quick-audit/convert — nettoyage du localStorage lorsque la conversion échoue, évitant un appel API inutile à chaque connexion
v2.18.12026-03-08
- ModificatoLimite 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)
- CorrettoLimite scans Business — correction de la limite de scans manuels du plan Business (était
Infinity, maintenant 100). Seul l'admin est illimité - CorrettoReset 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) - CorrettoAffichage compteur scans — le dashboard Billing affiche maintenant les scans du mois en cours (
scansThisMonth) au lieu du total à vie - CorrettoAlignement 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
- AggiuntoLangue 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)
- AggiuntoNews 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 - ModificatoRé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
- ModificatoPage 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
- AggiuntoLanding 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 - ModificatoLimites 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)
- ModificatoCheckoutView factorisé — les features hardcodées en anglais sont remplacées par les traductions i18n de la page pricing
v2.16.22026-03-07
- AggiuntoProjectBanner 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
- SicurezzaCodes de sécurité cryptographiques — remplacement de
Math.random()parcrypto.randomInt()pour la génération des codes 2FA - SicurezzaComparaison timing-safe — les vérifications de codes de sécurité utilisent désormais
crypto.timingSafeEqualpour prévenir les attaques par timing - SicurezzaProtection open redirect — validation du paramètre
redirectdans les pages d'authentification (signin, signup, verify-code) - SicurezzaInvalidation des sessions — les autres sessions sont détruites lors d'un changement de mot de passe ou d'email
- SicurezzaFuite de stack trace — les erreurs 500 n'exposent plus la stack trace en production
- SicurezzaSecret de cookie — le secret de session est désormais obligatoire en production (plus de fallback en dur)
- SicurezzaCSP Helmet activé — Content Security Policy configuré en production (script-src, style-src, frame-src, etc.)
- SicurezzaSanitization v-html — les descriptions Stack Packs sont désormais sanitizées via DOMPurify
- SicurezzaWebhook Stripe — les messages d'erreur ne divulguent plus les détails Stripe internes
- SicurezzaSanitization HTML durcie — restriction de l'attribut
styleau tagspanuniquement, regex de couleur stricte - SicurezzaRate limiting étendu — ajout de limites sur change-password, change-email, verify-email-change
- SicurezzaPlages IPv6 privées complètes — ajout des plages
fd00:,::ffff:mapped pour bloquer les scans sur IPs privées - CorrettoBug associates/invite.js — correction d'un crash
ReferenceErrorquand la variableprojectétait utilisée avant sa déclaration
v2.16.12026-03-07
- CorrettoSSR 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
- AggiuntoPage 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)
- AggiuntoMé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 - Aggiuntox-default dans le sitemap — le générateur de sitemap inclut désormais le hreflang
x-default - ModificatoOptimisation fonts — suppression du double chargement Google Fonts dans
index.html(déjà chargé viastyle.css) et de la police IBM Plex Mono inutilisée - ModificatoRemplacement 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 - Correttorobots.txt — correction du domaine du sitemap (pointait vers un domaine inexistant)
- CorrettoSchema Pricing — suppression du faux
AggregateRating(données inventées) - Rimosso
useMeta.js— composable jamais utilisé, supprimé (dead code) - Rimosso
sitemap.xmldu dépôt Git — fichier régénéré quotidiennement par cron, ne doit pas être versionné
v2.15.02026-03-07
- AggiuntoSuppression 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
- AggiuntoNavigation 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
- CorrettoBadge 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
- AggiuntoRedirection 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)
- AggiuntoLiens 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
- AggiuntoBadge 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
- AggiuntoAnnulation 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
- AggiuntoBanniè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 - AggiuntoLien résultats complets — lien "Consulter tous les résultats de l'audit" sous les scores dans la page projet
- ModificatoLogo 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
- ModificatoAvatar 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
- ModificatoMenu header — l'option "Administration" est déplacée juste avant "Déconnexion" (après le divider) au lieu d'être en première position
- ModificatoMongoDB connection — encodage
encodeURIComponent()du nom d'utilisateur et mot de passe dans l'URI de connexion pour gérer les caractères spéciaux - ModificatoTraduction française — remplacement de tous les termes "scan/scans" par "audit/audits" dans l'interface française
- ModificatoHarmonisation 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
- CorrettoEmail 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
- ModificatoFactorisation
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
- ModificatoMongoDB 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) - ModificatoOptimisation 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 - ModificatoAggregation
$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 - ModificatoAdmin 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 - ModificatoIndex compound scans — ajout de l'index
{ projectId: 1, status: 1, createdAt: -1 }pour optimiser les requêtes filtrées par statut - CorrettoMongoDB 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
- ModificatoSé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) - ModificatoSécurité : projection MongoDB sur
users— exclusion systématique des champs sensibles (password,securityCode,securityCodeExpires,securityCodeAttempts) viafindUserSafe()dans 18 fichiers API (billing, projects, associates, scans) - ModificatoSécurité : sanitization formulaire de contact — les champs
name,subjectetmessagesont désormais trimés et sanitizés viasanitize-htmlavant envoi - ModificatoExtraction IP centralisée — remplacement de 9 occurrences de
req.headers['x-forwarded-for']manuelles pargetClientIp(req)dans les endpoints commentaires, discussions et admin - ModificatoConsolidation
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 ('→') - ModificatoHelpers backend factorisés —
parseObjectId(),parsePagination(),findUserSafe()dansdbHelpers.js; pagination utilisée dans 4 endpoints (logs, discussions, news, scans) - ModificatoRobustesse logging —
logEvent()loggue désormais les erreurs d'écriture MongoDB au lieu de les ignorer silencieusement - ModificatoRobustesse router — le catch vide dans
router.beforeEachloggue désormais les erreurs de vérification auth
v2.13.02026-03-06
- AggiuntoProject 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.
- AggiuntoUnified discussion system — news comments and project discussions now share the same data architecture (
discussions,discussionMessages,discussionReadscollections) and reusableCommentThreadcomponent - AggiuntoDiscussion email notifications — configurable alerts for new discussions and new messages, with separate toggles in project settings (available for all plans)
- AggiuntoAdmin discussions page — manage all discussions (news and projects) from admin panel with filtering by type and deletion capabilities
- AggiuntoRich 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 - AggiuntoServer-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 - AggiuntoClient-side HTML sanitization — DOMPurify applied to all
v-htmlrendering (discussion messages, news article content, news comments) - AggiuntoSource 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
- AggiuntoPage 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
- ModificatoNews comments — migrated from
newsComments/newsReadsto unifieddiscussions/discussionMessages/discussionReadscollections (breaking: existing news comments are lost, fresh start) - ModificatoTiptapEditor — moved from
components/admin/tocomponents/common/for reuse across discussions and news. AddedshowRawModeprop (raw HTML mode now admin-only) - ModificatoDiscussion & 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
- CorrettoNews comment log events — posting or editing a news comment now logs
news-comment-createandnews-comment-editevents (was missing)
v2.12.12026-03-03
- CorrettoAssociate sharing bug — re-inviting an accepted associate on a new project incorrectly returned an "already associate" error instead of sharing the project
- CorrettoAssociate 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
- CorrettoProject settings centering — page was not centered due to missing
container-narrowclass - AggiuntoAssociate empty states — each section (project associates, pending invitations, other associates) now shows an explicit message when empty
- AggiuntoSignup 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
- AggiuntoUser 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
- AggiuntoNews author display — news articles show "Published by {name}" with author avatar below the title. Author is automatically tracked when creating news
- ModificatoEmail templates — added VitaPulse logo (icon-192.png) in email header above the brand name for better visual identity
- ModificatoAssociate invite emails — include the inviter's avatar and name in a styled card
- CorrettoSecurity 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
- AggiuntoGoogle 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 - AggiuntoSitemap 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 - AggiuntoPublic 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 - AggiuntoDynamic news back link — back button on news detail page dynamically adapts based on navigation history (returns to news list, dashboard or previous page)
- AggiuntoTipTap HTML raw mode — toggle button in the editor toolbar to switch between WYSIWYG and raw HTML editing, allowing direct HTML paste
- AggiuntoBlog link in footer — added Blog link in the Resources column of the footer
- ModificatoOptimized 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.) - ModificatoVue Router navigation guard — migrated from deprecated
next()callback to return-based API - CorrettoTipTap duplicate extensions warning — disabled
linkandunderlinein StarterKit config since they are added separately with custom configuration - CorrettoNews validation error messages — admin news creation/update now returns specific missing field names instead of generic
error.validation - CorrettoNewsDetailView comments crash — restored missing
commentsref declaration
v2.10.02026-03-01
- AggiuntoEmail 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)
- AggiuntoEnriched 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
- AggiuntoSecurity alerts email helper — new
renderSecurityAlerts()shared helper inemailLayout.jsfor displaying missing security headers with severity badges - AggiuntoResponsive 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 - Aggiunto
.form-narrowutility class — constrains form widths to 640px max, applied to ProjectSettingsView and ProjectNewView - ModificatoUnified 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. - ModificatoUpgraded Vuetify from 3.x to 4.0.0 — full Material Design 3 migration
- ModificatoMigrated all typography classes from MD2 to MD3 (text-h1→text-display-large, text-body-2→text-body-medium, text-caption→text-body-small, etc.)
- ModificatoMigrated VRow grid props (
align→ CSS class,dense→density="compact") - ModificatoUpdated SCSS breakpoints to MD3 values (md: 840px, lg: 1145px, xl: 1545px, xxl: 2138px)
- ModificatoAdded
xxlbreakpoint mixin to SCSS design system - ModificatoAdded CSS reset for headings/paragraphs to replace Vuetify 4's removed global reset
- ModificatoUpdated
vuefrom 3.5.27 to 3.5.29 - ModificatoUpdated
playwrightfrom 1.58.1 to 1.58.2 - ModificatoUpdated
corsfrom 2.8.5 to 2.8.6 - ModificatoUpdated
vue-routerfrom 4.6.4 to 5.0.3 - ModificatoUpdated
mongodbfrom 6.21.0 to 7.1.0 - ModificatoUpdated
nodemailerfrom 6.10.1 to 8.0.1 - ModificatoUpdated
stripefrom 14.25.0 to 20.4.0 - ModificatoUpdated
@stripe/stripe-jsfrom 3.5.0 to 8.8.0 - CorrettoEmail link colors — fixed link colors being overridden by email clients (Gmail, Outlook) using
<span>wrapper technique - CorrettoPending associates visibility — associates with pending status now appear in the project settings list instead of being hidden until they accept
- CorrettoNode watch paths — added
src/translate/emails/to--watch-pathlist for email template hot-reload in development
v2.9.02026-02-28
- AggiuntoSecurity vulnerabilities documentation page (
/docs/vulnerabilities) with detailed guides for HTTP security headers, TLS/SSL, Lighthouse security audits, and software version exposure (26 vulnerabilities total) - AggiuntoSeparate translation files for vulnerabilities (
src/translate/vulnerabilities/en.json,fr.json) - AggiuntoVulnerability detail view with route
/docs/vulnerabilities/:idand breadcrumb navigation - AggiuntoVulnerabilities listed in Docs page section #10 with severity chips and direct links
- Aggiunto4 vulnerability categories: HTTP Security Headers (10), TLS/SSL Certificate (5), Lighthouse Security Audits (7), Software Version Exposure (4)
- AggiuntoSpanish language support (es.json, vulnerability translations, email templates, flag icon)
- AggiuntoCentralized locale configuration (
SUPPORTED_LOCALES,LOCALE_CODES,getIntlLocale(),getOgLocale()inshared/const.js) — adding a new language only requires updating the single source of truth - AggiuntoChangelog page now auto-generated from
CHANGELOG.md— single source of truth, no duplication in translation files - ModificatoRedesigned header action elements (language switcher, account, sign in) with consistent pill-style buttons using shared SCSS mixin
- ModificatoLanguage switcher now displays country flag emoji (🇬🇧/🇫🇷) with locale code, clearly interactive at rest
- ModificatoCTA buttons (Dashboard, Start Free) use rounded pill style for visual consistency
- ModificatoMobile drawer language buttons also show flag emojis
v2.8.32026-02-28
- CorrettoPDF section order now matches app tab order: Security → Quality → Performance → Resources → Advanced (Global → Framework → Critical Chains → Scripts Treemap → Audit Timing → Passed)
- CorrettoMoved
runWarningsfrom after CWV to Advanced/Global section in PDF - CorrettoMoved
consoleto first position in Advanced section in PDF - CorrettoAdded missing translation key
scan.details.showAll(EN/FR)
v2.8.22026-02-28
- ModificatoMoved Server Response Time block from Advanced > Global to Performance tab (displayed before Opportunities/Diagnostics)
- ModificatoPDF report updated to match new Server Response Time placement
v2.8.12026-02-28
- AggiuntoAdvanced tab split into 6 sub-tabs: Global, Framework, Critical Chains, Scripts Treemap, Audit Timing, Passed
- AggiuntoNew components:
ScanStackPacksSection,ScanCriticalChainsSection,ScanScriptTreemapSection,ScanAuditTimingSection - ModificatoAdvanced > Global sub-tab: Console section displayed first, then Server Response Time, then remaining technical data
- ModificatoFixed console section scrollbar overflow (removed unnecessary max-height constraint)
- CorrettoConsole section displaying unwanted horizontal/vertical scrollbars
v2.8.02026-02-28
- AggiuntoHTTP response headers extraction from Lighthouse artifacts (
NetworkRecords) during scans - AggiuntoStandalone Security tab in scan results with four sub-tabs: "TLS Certificate", "Response Headers", "Software Versions" and "Lighthouse Audits"
- AggiuntoSecurity headers analysis: 10 critical headers checked (HSTS, CSP, X-Frame-Options, etc.) with present/missing status and risk severity levels (high/medium/low)
- AggiuntoFull response headers table in Security > Headers sub-tab
- AggiuntoTLS certificate analysis: protocol version, cipher suite, signature algorithm, issuer, expiration with warnings for weak/expired certificates
- AggiuntoSoftware versions detection from HTTP headers (Server, X-Powered-By), HTML content (CMS, meta generator, frameworks) and TLS protocol
- AggiuntoPDF report: security section now includes TLS certificate, response headers, software versions and Lighthouse security audits
- AggiuntoGlobal CSS gap utilities (
.gap-1to.gap-16) in design system — fixes allgap-*classes that were non-functional with Vuetify - AggiuntoLighthouse scores sorted worst-to-best on scan details page and project overview page
- AggiuntoCore Web Vitals sorted worst-to-best on scan details page and project overview page
- AggiuntoQuick stats clickable: navigate to corresponding tab and sub-tab with smooth scroll
- AggiuntoPassed audits click scrolls directly to Passed section anchor within Advanced tab
- ModificatoScan result tabs reordered: Security → Quality → Performance → Resources → Advanced
- ModificatoSecurity tab is now the default selected tab on scan results
- ModificatoSecurity issues moved from Quality tab sub-tab to standalone Security tab
- ModificatoScan results overview layout reorganized: environment chips before quick-stats, screenshot in 3rd column
- ModificatoLoading timeline moved from overview to Resources tab (after stat-cards, before resources by type)
- ModificatoQuality tab reduced from 4 sub-tabs to 3 (accessibility, SEO, best practices)
v2.7.12026-02-28
- ModificatoRefactored project creation wizard: removed step 4 (scan progress), now redirects to project overview after creation where
ScanProgressCardhandles scan progress display - ModificatoProject creation wizard reduced from 4 steps to 3 steps (Info → Pages → Alerts → Launch)
- CorrettoDashboard news section not displaying:
NewsSectionwas readingdata.newsinstead ofdata.itemsfrom API response - CorrettoScan results: overview section extracted from tabs and displayed permanently between CWV and tab navigation
v2.7.02026-02-28
- AggiuntoLocalized URLs: all routes now prefixed with locale (
/en/*,/fr/*) - Aggiunto
useLocalePathcomposable for locale-aware navigation - AggiuntoAutomatic locale detection from browser on first visit
- AggiuntoSEO: hreflang, canonical, og:locale, and Schema.org inLanguage in SSR
- AggiuntoLocale switcher updates URL path in real-time
- AggiuntoNews system: CRUD backend with bilingual content (FR/EN), cover image upload, sticky/homepage banner flags
- AggiuntoNews comments with moderation: users can post, edit own comments; admin approval workflow with pending/approved/rejected status
- AggiuntoComment rate limiting: configurable max comments per time window via admin settings
- AggiuntoAdmin news management: TipTap WYSIWYG editor, bilingual tabs, publish/draft, sticky and homepage banner controls
- AggiuntoAdmin comments moderation panel: approve, reject, delete comments with filters
- AggiuntoDashboard news section: latest 3 articles with unread badge and sticky indicator
- AggiuntoNews detail page with full content rendering and comments section
- AggiuntoHomepage news banner: dismissible gradient banner for featured articles
- AggiuntoIP tracking: user login IPs stored with history for security auditing
- AggiuntoUser blocking system: admin can block by account and/or IP addresses
- AggiuntoAdmin user detail: security section with block/unblock UI, IP history table with per-IP status and unblock action
- AggiuntoAdmin bypass: administrators exempt from all plan limits (projects, scans, associates, pages)
- AggiuntoFavicon: SVG/PNG/ICO with VitaPulse branding (gradient V + pulse line)
- AggiuntoNews publicly accessible: reading news and comments no longer requires authentication
- AggiuntoComment posting/editing still requires authentication, with "Sign in to comment" prompt for visitors
- AggiuntoCentralized event logging system:
logEvent()helper,logscollection, admin logs page with search/filter/delete - AggiuntoEvent logging instrumented across all endpoints: auth, projects, scans, billing, associates, admin, contact, quick audit, PDF download (40+ events)
- AggiuntoAdmin user detail: recent activity logs section with link to filtered logs page
- AggiuntoForgot password flow: email verification code, reset password page
- AggiuntoChange password: authenticated users can change password from account page
- AggiuntoAccount page: profile editing (name) and password change under
/app/account - ModificatoPricing FAQ completely rewritten with 20 comprehensive questions covering all features, plans, and capabilities
- ModificatoBackend-generated URLs (Stripe checkout, emails, Google Chat webhooks, share links) now include locale prefix
- ModificatoAdmin user detail page shows IP history and blocking controls
- ModificatoSCSS design system: all hardcoded hex colors, border-radius, font-size, font-weight replaced with variables across 30+ files
- ModificatoNew SCSS mixins:
hover-row,hover-lift,hover-light-on-dark,link-on-dark,link-primaryfor consistent hover effects - ModificatoRemoved unused SCSS mixins (
status-good/warning/error,score-gauge) - ModificatoAdded
$border-radius-xs,$gradient-dark-diagonalSCSS variables - ModificatoFavicon and apple-touch-icon now use relative paths (fixes cross-origin issues in dev)
- ModificatoRemoved orphan
src/views/auth/directory (duplicate ofsrc/views/Auth/) - ModificatoRefactored: auth page SCSS extracted to global
.auth-pageclass in_components.scss - ModificatoRefactored:
getEventColor/getEventCategory/formatLogMetaextracted touseLogUtilscomposable - ModificatoRefactored: business downgrade logic extracted to
handleBusinessDowngrade()indbHelpers.js - ModificatoRefactored: inline URL truncation styles replaced with
.admin-url-truncateSCSS class - ModificatoLogger
logEvent()changed to fire-and-forget with.catch(() => {})(no more async/await) - SicurezzaObjectId validation added to all news/comments API endpoints
- SicurezzaObjectId.isValid() validation added to all API endpoints accepting ID parameters (17+ routes)
- SicurezzaError logging (
console.error) added to all catch blocks across the entire API (15+ files) - SicurezzaBlocked users/IPs rejected at login with appropriate error messages
- SicurezzaMongoDB projection added to user query in lighthouse.js to exclude password hash
- SicurezzaWebhook error responses standardized to JSON format
- SicurezzasetReference race condition fixed with atomic bulkWrite operation
- CorrettoHardcoded French progress messages in scan store replaced with i18n keys (
scan.progress.*) - CorrettoDefault locale inconsistency: backend now uses
DEFAULT_LOCALE('en') everywhere instead of mixed 'fr'/'en' - CorrettoHardcoded French in
useDateFormat.jsreplaced with i18n keys (dashboard.fewSeconds,dashboard.days) - CorrettoDefault locale for
formatDateShort/formatDateFullchanged from'fr-FR'to'en-US' - CorrettoScan status colors centralized in
SCAN_STATUS_COLORSconstant (removed duplication in 3 admin views) - CorrettoObjectId validation added to
findUserOrSharedProjecthelper (prevents crash on invalid IDs) - CorrettoCron notifications now log warnings on failure instead of silently swallowing errors
- CorrettoCron scheduled scans now validate
project.urlbefore launching scan - CorrettoTiptapEditor image upload now handles fetch errors and checks
res.ok - CorrettoUnused
shallowRefimport removed from NewsDetailView - CorrettoUnused
mdiEyeOffimport removed from AdminNewsEditView
v2.6.12026-02-27
- ModificatoCWV tooltips on scan detail page now show per-metric descriptions matching project overview page
- ModificatoRemoved non-functional expandable CWV cards on scan detail page
- ModificatoAdded spacing between Mobile/Desktop toggle buttons
- ModificatoRemoved share report button from scan detail page
v2.6.02026-02-27
- AggiuntoPlan upgrade/downgrade with Stripe proration (Pro ↔ Business, monthly ↔ yearly)
- AggiuntoUpgrade preview dialog showing prorated amount before confirmation
- AggiuntoWebhook handler for
customer.subscription.updatedas backup sync - AggiuntoCheckout guard preventing duplicate subscriptions
- AggiuntoProject screenshot thumbnail on dashboard cards and project overview header
- AggiuntoPlaceholder image for projects without scans (VitaPulse branded SVG)
- ModificatoUpgrade button in Billing page now opens inline preview dialog instead of redirecting to pricing
- ModificatoPricing page buttons adapt for existing subscribers (upgrade, downgrade, cycle change)
- ModificatoDowngrade from Business automatically revokes associates
- ModificatoAdmin downgrade from Business now properly revokes associates and cleans shared projects
v2.5.12026-02-27
- AggiuntoAssociates can now view project settings in read-only mode
- AggiuntoAssociates can manage their own email notification preferences (scan results and regression alerts) based on their plan
- AggiuntoAssociate notification emails are sent after each scan completion
v2.5.02026-02-27
- ModificatoCase Studies page: fixed all section-to-page mappings to match actual PDF content (16 sections for 28 pages)
- ModificatoCase Studies page: corrected metrics values (mobile 82, desktop 78)
- ModificatoDocumentation page: complete rebuild with comprehensive VitaPulse user guide (10 sections: Quick Audit, Projects, Scans, Scores, CWV, Opportunities, Regressions, PDF Reports, Associates, Plans)
- ModificatoDocumentation page: added quick start cards, table of contents, and screenshot illustrations
- ModificatoLanding page: enhanced features section with 6 benefit cards and 4 illustrated feature showcases
- ModificatoChangelog page: complete rewrite with full version history (v1.0.0 to v2.4.0)
- ModificatoSecurity page: updated with VitaPulse-specific security practices and technical details
- ModificatoTerms of Service: comprehensive rewrite with 12 sections covering SaaS-specific terms
- ModificatoPrivacy Policy: GDPR-compliant rewrite with detailed data collection, storage, and rights information
- ModificatoCookie Policy: rewritten to reflect actual minimal cookie usage (single session cookie)
- RimossoAPI documentation page and route (no public API)
- RimossoBlog page link from footer (no blog content)
- RimossoStatus page link from footer
v2.4.12026-02-26
- ModificatoProject settings page: split into tabs (Settings / Associates) for Business plan users
- ModificatoDashboard: search field and project filter now on the same line
- CorrettoAssociates tab not switching (missing activeTab ref)
- CorrettoInvite button not vertically centered next to email input
v2.4.02026-02-26
- AggiuntoAssociates system for Business plan users: invite up to 5 associates by email to share project access
- AggiuntoAssociates management section in project settings (invite, share, remove per project)
- AggiuntoDashboard filter (All / My projects / Shared with me) with shared badge showing owner name
- AggiuntoEmail invitation templates for associates (existing user + new user) in EN/FR
- AggiuntoAutomatic project linking when invited associate registers a new account
- AggiuntoAssociate access inheritance: associates inherit PDF download and report sharing capabilities from project owner's plan
- AggiuntoScan ownership awareness: project owners can manage scans launched by associates
- AggiuntoAutomatic associate revocation on plan downgrade (Business → Pro/Free)
v2.3.22026-02-26
- CorrettoGlobal button spacing: adjacent buttons in card actions are no longer visually stuck together
- CorrettoCWV history chart now auto-rebuilds project stats from existing scans when collection is empty
v2.3.12026-02-22
- CorrettoAdmin scores display not showing due to per-device nested data structure
- CorrettoAdmin CWV table empty due to same nested structure issue
- CorrettoScan detail page now shows scores and CWV per device with mobile/desktop toggle
v2.3.02026-02-22
- AggiuntoAdmin user detail page with editable plan, type, name, company
- AggiuntoUser projects list in admin user detail
- AggiuntoClickable rows in admin users table
- AggiuntoAdmin project detail page with editable name, URL, scan frequency
- AggiuntoProject scans list in admin project detail with status, score, device
- AggiuntoClickable project rows in admin projects list and user detail
- AggiuntoLink to project owner from project detail page
- AggiuntoAdmin scan detail page with scores, CWV, regressions display
- AggiuntoEditable scan status and reference flag from admin
- AggiuntoAdmin scan delete with confirmation dialog
- AggiuntoClickable scan rows in admin scans list and project detail
- AggiuntoLinks to owner and project from scan detail page
v2.2.12026-02-22
- CorrettoLanding page hero section alignment and height
v2.2.02026-02-22
- AggiuntoUser
typefield (userdefault,adminmanual) for role-based access - AggiuntoAdmin dashboard with user listing (email, plan, projects, scans, registration date)
- AggiuntoAdmin projects page listing all projects with owner, scan count, latest score
- AggiuntoAdmin scans page listing 200 most recent scans with project, owner, status, score, duration
- Aggiunto
requireAdminmiddleware for admin-only API endpoints - AggiuntoAdmin menu in header (crown icon) visible only for admin users
- AggiuntoAdmin route guard (
requiresAdmin) on frontend router - ModificatoCWV history chart now uses dedicated
projectStatscollection with incremental aggregation instead of paginated scan data - ModificatoStats are pushed to
projectStatson each scan completion (no cron needed) - ModificatoNew
GET /api/projects/:id/statsendpoint for lightweight chart data
v2.1.02026-02-21
- Aggiunto"Set as reference" action on scan details page with
isReferencebadge display - AggiuntoNetwork requests table in Resources tab (URL, type, protocol, status, transfer/resource size, priority)
- AggiuntoMain thread time column in third-party summary table
- AggiuntoParse/Compile column in script bootup table
- AggiuntoOverview stat cards in Resources tab (requests, transferred, third parties count, JS libraries count)
- AggiuntoShow more/less toggle on script bootup, third-party, and network requests tables
- AggiuntoCore Web Vitals history chart (Plotly) on project overview page, visible when at least 2 completed scans exist
- ModificatoMerged "Insights" tab into "Performance" tab (opportunities + diagnostics + insights)
- ModificatoMerged "Technical", "Console", and "Passed" tabs into a single "Advanced" tab
- ModificatoReplaced
v-btn-togglenavigation withv-tabsfor scan result sections - ModificatoRedesigned Resources tab with section headers, sorted resource bars, and detailed tables
- ModificatoThird-party section now displays data directly from
thirdPartySummarywith entity name and main thread time - ModificatoReplaced
networkSummary(aggregate) with detailednetworkRequeststable - ModificatoRegression detection now prioritizes scans marked as
isReferencebefore falling back to latest scan - ModificatoSynchronized 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
- AggiuntoComprehensive 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)
- AggiuntoCase studies page with real audit data from www.e-xode.net (23-page PDF, per-page screenshots, key metrics, takeaways)
- AggiuntoComplete i18n localization system with
createT(locale)server-side translation resolver - AggiuntoShared component library: 13 reusable components extracted (
AlertError,ConfirmDialog,DataTable,EmptyState,LoadingSpinner,PageHeader,ScoreCircle,ScanProgressCard,SearchInput,SectionCard,StatCard,StatusChip,UpgradeCta) - AggiuntoShared utilities module (
shared/utils.js) withescapeHtml,formatBytes,formatMs,getScoreColor,getScoreLabel,getScoreBg,getCwvStatus,getCwvColor,formatCwvValue - AggiuntoShared constants module (
shared/const.js) withDEVICES,CWV_METRICS,INSIGHTS_FAILING_THRESHOLD,SCAN_DATA_FIELDS - AggiuntoShared database helpers (
shared/dbHelpers.js) for MongoDB operations - AggiuntoShared API client (
shared/api.js) with centralized error handling - AggiuntoRate limiting on all API endpoints with configurable windows
- AggiuntoSession management with automatic cleanup on dev startup
- AggiuntoVersion number displayed in application footer
- AggiuntoPDF White Label mode for Business plan users
- AggiuntoApp version exposed via Vite
definefor frontend access - ModificatoRewrote
pdfTemplate.js(~580 lines) with all scan data sections, matching app UX/design (brand gradient, score colors, impact badges, CWV thresholds) - ModificatoRewrote
downloadPdf.jswith comprehensivepreparePdfData()extracting all 35+ scan data fields per device - ModificatoRefactored all Pinia stores to use shared utilities and constants
- ModificatoRefactored all API endpoints to use shared database helpers and middleware
- ModificatoUpdated all Vue components to use shared component library
- ModificatoMigrated all hardcoded strings to i18n translation files (en.json, fr.json)
- ModificatoUpdated
entry-server.jswith i18n-aware SSR (getRouteMeta,generateMetaTags,getSchemaMarkup) - ModificatoUpdated
index.htmlwith<!--app-lang-->placeholder for dynamic lang attribute - ModificatoRewrote
CaseStudiesView.vuewith real audit content and PDF page screenshots - ModificatoImproved error handling across all API routes with safe JSON parsing
- CorrettoSecurity audit: input validation, authorization checks, rate limiting on all endpoints
- CorrettoData parity between scan storage and display fields
- CorrettoDocker and Playwright configuration for PDF generation
- CorrettoSession cleanup preventing stale session file accumulation
- CorrettoRate limiting configuration for different endpoint categories
- CorrettoSSR hydration for localized meta tags and schema markup
- CorrettoTranslation key consistency across all components
- SicurezzaAdded
requireAuthmiddleware on all protected routes - SicurezzaAdded input sanitization with
escapeHtmlutility - SicurezzaEnforced ownership checks on scan/project access
- SicurezzaConfigured Helmet CSP and CORS policies
- SicurezzaAdded rate limiting per API category (auth, scans, general)
v1.3.02026-02-10
- AggiuntoCase studies page showcasing VitaPulse audit capabilities
- AggiuntoGitHub Actions workflow for CI testing
- ModificatoLayout improvements across all views
- ModificatoTranslation updates for all supported locales
- ModificatoMajor layout and code refactoring
v1.2.02026-02-07
- AggiuntoCoupon management system for Stripe payments
- AggiuntoQuick audit rate limiting (max audits per plan)
- AggiuntoAutomated cron jobs for data pruning
- AggiuntoEmail notifications with scoring reports
- AggiuntoMulti-page scan support
- ModificatoPricing logic refactored with plan-based feature gating
- ModificatoHeader theme improvements
- ModificatoReport results display fixes
- CorrettoDocker environment variables for Stripe integration
- CorrettoTranslation consistency issues
v1.1.02026-02-06
- AggiuntoPDF report export with Chromium rendering
- AggiuntoSEO optimizations (meta tags, schema markup, sitemap)
- AggiuntoScan animation and progress indicators
- AggiuntoCSS design system with variables and mixins
- AggiuntoDetailed audit results display (8 tabbed sections)
- AggiuntoNew project creation workflow with guided steps
- ModificatoFactorized scan animation components
- ModificatoServer-side rendering fixes for Vue Router
- CorrettoTranslation loading and fallback behavior
- CorrettoServer rendering hydration issues
v1.0.02026-02-04
- AggiuntoInitial release of VitaPulse platform
- AggiuntoLighthouse 12 audit engine integration
- AggiuntoCore Web Vitals monitoring (LCP, FCP, CLS, TBT, INP, TTFB, Speed Index, TTI)
- AggiuntoMobile and desktop device analysis
- AggiuntoPerformance, Accessibility, Best Practices and SEO scoring
- AggiuntoStripe payment integration with Pro and Business plans
- AggiuntoUser authentication with email verification
- AggiuntoLegal pages (Terms, Privacy, Cookies)
- AggiuntoCORS and security configuration
- AggiuntoDocker containerization with docker-compose