Historial de cambios
Siga la evolución de VitaPulse — nuevas funcionalidades, mejoras y correcciones.
Próximamente
v2.31.02026-06-27
- AñadidoConsentement 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. - AñadidoPolitique 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 »). - AñadidoNavigation 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 ». - AñadidoFeature 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). - ModificadoSEO — 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. - ModificadoRenommage 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. - ModificadoBouton « 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.
- ModificadoRé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é). - ModificadoFeature 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. - CorregidoSEO — 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. - Seguridadnpm 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
- Seguridadnpm audit → 0 — non-breaking dependency updates (lockfile only, no
package.jsonrange
v2.30.02026-06-06
- SeguridadNon-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
- ModificadoLiens 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). - CorregidoDé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
- ModificadoImage 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
- CorregidoLien 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
- CorregidoCapture 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. - CorregidoManifest 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
- CorregidoCapture 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
- CorregidoCapture 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). - ModificadoAffichage 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).
- ModificadoCapture 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
- AñadidoRapports 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). - AñadidoCapture 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.
- AñadidoCascade 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.
- AñadidoSection « 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. - ModificadoPlaywright (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). - ModificadoLighthouse (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). - ModificadoOnglets 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.
- ModificadoFinition 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.
- CorregidoPage 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). - CorregidoChangelog (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. - CorregidoNews (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
- ContenidoSite 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
- AñadidoPage 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. - ModificadoBadge hero — « Powered by Google Lighthouse » devient « Runs on Google Lighthouse » (et désormais correctement traduit en allemand et italien, auparavant restés en anglais)
- ModificadoRefonte 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. - ModificadoRéé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. - ModificadoPropagation 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. - ModificadoVouvoiement 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. - ModificadoFlag
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). - ModificadoRenforcement 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
- AñadidoPalier 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 - ModificadoRefonte 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 - ModificadoQuotas 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
- ModificadoWhite-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 - ModificadoAlertes de régression — désormais incluses dans Business ET Agency (auparavant Business uniquement)
- ModificadoRé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
- ModificadoPage 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
- Corregidopackage.json — suppression de la virgule traînante après le script
scan(causait unEJSONPARSEaunpm ci)
v2.23.22026-03-22
- ModificadoSitemap 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
- CorregidoEmails discussions — correction de l'URL de fallback dans les templates email de discussion :
vitapulse.io→vitapulse.e-xode.net(5 langues) - ModificadoLighthouse 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 - ModificadoVite 7 → 8 — migration vers Rolldown (bundler Rust). Option
api: 'modern-compiler'retirée des options SCSS (seul mode supporté). Builds ~2x plus rapides - ModificadoVue Router 4 → 5 — mise à jour majeure sans breaking changes (merge de unplugin-vue-router dans le core)
- Modificado@vitejs/plugin-vue 5 → 6 — alignement sur Vite 8
- ModificadoDé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
- ModificadoTipTap épinglé à 3.20.0 — overrides npm pour contourner le publish cassé de 3.20.3 (dist/ manquant)
- ModificadoPerformance 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) - ModificadoPerformance 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) - ModificadoPerformance 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)
- ModificadoAuditDetailTable — subItems et nouveaux valueTypes — support des sous-éléments expandables (clic pour déplier), et des types
source-location,code,numeric - ModificadoLighthouse — 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 - ModificadoLighthouse —
effortcalculé depuisguidanceLevel— le champeffortdes opportunités est maintenant calculé depuisaudit.guidanceLevel(1→high, 2→medium, 3→low) au lieu d'être hardcodé à'medium' - ModificadoLighthouse —
languagedefault cohérent — le fallback de langue passe de'fr'hardcodé àDEFAULT_LOCALE('en') pour respecter la convention du projet - ModificadoLighthouse — desktop timeouts configurables —
maxWaitForFcp(15s) etmaxWaitForLoad(35s) desktop sont maintenant dansLIGHTHOUSE_CONFIG.timingau lieu d'être hardcodés - AñadidoInsightChecklist — nouveau composant pour afficher les insights de type checklist (document-latency, lcp-discovery) avec icônes de validation
- AñadidoInsightListRenderer — nouveau composant pour afficher les insights de type list (cls-culprits, forced-reflow, breakdowns, network-tree) avec rendu récursif
- AñadidoLighthouse —
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
- ModificadoGitHub 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
- SeguridadGoogle 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
- AñadidoStatut 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
- AñadidoSuppression 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
- SeguridadValidation 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
- SeguridadValidation serveur signin — ajout de la validation email côté serveur dans l'endpoint de connexion
- SeguridadRate limit signup renforcé — réduction du rate limit signup de 10 à 5 requêtes par 15 minutes
- SeguridadTraduction 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
- AñadidoSuivi 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 - AñadidoValidation 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
- AñadidoValidation 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 - CorregidoTextes 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
- AñadidoLangue 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)
- CorregidoTraductions 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)
- CorregidoTraductions 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
- CorregidoAppel parasite quick-audit/convert — nettoyage du localStorage lorsque la conversion échoue, évitant un appel API inutile à chaque connexion
v2.18.12026-03-08
- ModificadoLimite 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)
- CorregidoLimite scans Business — correction de la limite de scans manuels du plan Business (était
Infinity, maintenant 100). Seul l'admin est illimité - CorregidoReset 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) - CorregidoAffichage compteur scans — le dashboard Billing affiche maintenant les scans du mois en cours (
scansThisMonth) au lieu du total à vie - CorregidoAlignement 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
- AñadidoLangue 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)
- AñadidoNews 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 - ModificadoRé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
- ModificadoPage 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
- AñadidoLanding 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 - ModificadoLimites 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)
- ModificadoCheckoutView factorisé — les features hardcodées en anglais sont remplacées par les traductions i18n de la page pricing
v2.16.22026-03-07
- AñadidoProjectBanner 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
- SeguridadCodes de sécurité cryptographiques — remplacement de
Math.random()parcrypto.randomInt()pour la génération des codes 2FA - SeguridadComparaison timing-safe — les vérifications de codes de sécurité utilisent désormais
crypto.timingSafeEqualpour prévenir les attaques par timing - SeguridadProtection open redirect — validation du paramètre
redirectdans les pages d'authentification (signin, signup, verify-code) - SeguridadInvalidation des sessions — les autres sessions sont détruites lors d'un changement de mot de passe ou d'email
- SeguridadFuite de stack trace — les erreurs 500 n'exposent plus la stack trace en production
- SeguridadSecret de cookie — le secret de session est désormais obligatoire en production (plus de fallback en dur)
- SeguridadCSP Helmet activé — Content Security Policy configuré en production (script-src, style-src, frame-src, etc.)
- SeguridadSanitization v-html — les descriptions Stack Packs sont désormais sanitizées via DOMPurify
- SeguridadWebhook Stripe — les messages d'erreur ne divulguent plus les détails Stripe internes
- SeguridadSanitization HTML durcie — restriction de l'attribut
styleau tagspanuniquement, regex de couleur stricte - SeguridadRate limiting étendu — ajout de limites sur change-password, change-email, verify-email-change
- SeguridadPlages IPv6 privées complètes — ajout des plages
fd00:,::ffff:mapped pour bloquer les scans sur IPs privées - CorregidoBug associates/invite.js — correction d'un crash
ReferenceErrorquand la variableprojectétait utilisée avant sa déclaration
v2.16.12026-03-07
- CorregidoSSR 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
- AñadidoPage 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)
- AñadidoMé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 - Añadidox-default dans le sitemap — le générateur de sitemap inclut désormais le hreflang
x-default - ModificadoOptimisation fonts — suppression du double chargement Google Fonts dans
index.html(déjà chargé viastyle.css) et de la police IBM Plex Mono inutilisée - ModificadoRemplacement 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 - Corregidorobots.txt — correction du domaine du sitemap (pointait vers un domaine inexistant)
- CorregidoSchema Pricing — suppression du faux
AggregateRating(données inventées) - Eliminado
useMeta.js— composable jamais utilisé, supprimé (dead code) - Eliminado
sitemap.xmldu dépôt Git — fichier régénéré quotidiennement par cron, ne doit pas être versionné
v2.15.02026-03-07
- AñadidoSuppression 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
- AñadidoNavigation 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
- CorregidoBadge 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
- AñadidoRedirection 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)
- AñadidoLiens 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
- AñadidoBadge 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
- AñadidoAnnulation 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
- AñadidoBanniè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 - AñadidoLien résultats complets — lien "Consulter tous les résultats de l'audit" sous les scores dans la page projet
- ModificadoLogo 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
- ModificadoAvatar 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
- ModificadoMenu header — l'option "Administration" est déplacée juste avant "Déconnexion" (après le divider) au lieu d'être en première position
- ModificadoMongoDB connection — encodage
encodeURIComponent()du nom d'utilisateur et mot de passe dans l'URI de connexion pour gérer les caractères spéciaux - ModificadoTraduction française — remplacement de tous les termes "scan/scans" par "audit/audits" dans l'interface française
- ModificadoHarmonisation 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
- CorregidoEmail 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
- ModificadoFactorisation
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
- ModificadoMongoDB 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) - ModificadoOptimisation 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 - ModificadoAggregation
$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 - ModificadoAdmin 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 - ModificadoIndex compound scans — ajout de l'index
{ projectId: 1, status: 1, createdAt: -1 }pour optimiser les requêtes filtrées par statut - CorregidoMongoDB 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
- ModificadoSé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) - ModificadoSécurité : projection MongoDB sur
users— exclusion systématique des champs sensibles (password,securityCode,securityCodeExpires,securityCodeAttempts) viafindUserSafe()dans 18 fichiers API (billing, projects, associates, scans) - ModificadoSécurité : sanitization formulaire de contact — les champs
name,subjectetmessagesont désormais trimés et sanitizés viasanitize-htmlavant envoi - ModificadoExtraction IP centralisée — remplacement de 9 occurrences de
req.headers['x-forwarded-for']manuelles pargetClientIp(req)dans les endpoints commentaires, discussions et admin - ModificadoConsolidation
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 ('→') - ModificadoHelpers backend factorisés —
parseObjectId(),parsePagination(),findUserSafe()dansdbHelpers.js; pagination utilisée dans 4 endpoints (logs, discussions, news, scans) - ModificadoRobustesse logging —
logEvent()loggue désormais les erreurs d'écriture MongoDB au lieu de les ignorer silencieusement - ModificadoRobustesse router — le catch vide dans
router.beforeEachloggue désormais les erreurs de vérification auth
v2.13.02026-03-06
- AñadidoProject 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.
- AñadidoUnified discussion system — news comments and project discussions now share the same data architecture (
discussions,discussionMessages,discussionReadscollections) and reusableCommentThreadcomponent - AñadidoDiscussion email notifications — configurable alerts for new discussions and new messages, with separate toggles in project settings (available for all plans)
- AñadidoAdmin discussions page — manage all discussions (news and projects) from admin panel with filtering by type and deletion capabilities
- AñadidoRich 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 - AñadidoServer-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 - AñadidoClient-side HTML sanitization — DOMPurify applied to all
v-htmlrendering (discussion messages, news article content, news comments) - AñadidoSource 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
- AñadidoPage 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
- ModificadoNews comments — migrated from
newsComments/newsReadsto unifieddiscussions/discussionMessages/discussionReadscollections (breaking: existing news comments are lost, fresh start) - ModificadoTiptapEditor — moved from
components/admin/tocomponents/common/for reuse across discussions and news. AddedshowRawModeprop (raw HTML mode now admin-only) - ModificadoDiscussion & 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
- CorregidoNews comment log events — posting or editing a news comment now logs
news-comment-createandnews-comment-editevents (was missing)
v2.12.12026-03-03
- CorregidoAssociate sharing bug — re-inviting an accepted associate on a new project incorrectly returned an "already associate" error instead of sharing the project
- CorregidoAssociate 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
- CorregidoProject settings centering — page was not centered due to missing
container-narrowclass - AñadidoAssociate empty states — each section (project associates, pending invitations, other associates) now shows an explicit message when empty
- AñadidoSignup 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
- AñadidoUser 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
- AñadidoNews author display — news articles show "Published by {name}" with author avatar below the title. Author is automatically tracked when creating news
- ModificadoEmail templates — added VitaPulse logo (icon-192.png) in email header above the brand name for better visual identity
- ModificadoAssociate invite emails — include the inviter's avatar and name in a styled card
- CorregidoSecurity 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
- AñadidoGoogle 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 - AñadidoSitemap 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 - AñadidoPublic 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 - AñadidoDynamic news back link — back button on news detail page dynamically adapts based on navigation history (returns to news list, dashboard or previous page)
- AñadidoTipTap HTML raw mode — toggle button in the editor toolbar to switch between WYSIWYG and raw HTML editing, allowing direct HTML paste
- AñadidoBlog link in footer — added Blog link in the Resources column of the footer
- ModificadoOptimized 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.) - ModificadoVue Router navigation guard — migrated from deprecated
next()callback to return-based API - CorregidoTipTap duplicate extensions warning — disabled
linkandunderlinein StarterKit config since they are added separately with custom configuration - CorregidoNews validation error messages — admin news creation/update now returns specific missing field names instead of generic
error.validation - CorregidoNewsDetailView comments crash — restored missing
commentsref declaration
v2.10.02026-03-01
- AñadidoEmail 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)
- AñadidoEnriched 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
- AñadidoSecurity alerts email helper — new
renderSecurityAlerts()shared helper inemailLayout.jsfor displaying missing security headers with severity badges - AñadidoResponsive 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 - Añadido
.form-narrowutility class — constrains form widths to 640px max, applied to ProjectSettingsView and ProjectNewView - ModificadoUnified 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. - ModificadoUpgraded Vuetify from 3.x to 4.0.0 — full Material Design 3 migration
- ModificadoMigrated all typography classes from MD2 to MD3 (text-h1→text-display-large, text-body-2→text-body-medium, text-caption→text-body-small, etc.)
- ModificadoMigrated VRow grid props (
align→ CSS class,dense→density="compact") - ModificadoUpdated SCSS breakpoints to MD3 values (md: 840px, lg: 1145px, xl: 1545px, xxl: 2138px)
- ModificadoAdded
xxlbreakpoint mixin to SCSS design system - ModificadoAdded CSS reset for headings/paragraphs to replace Vuetify 4's removed global reset
- ModificadoUpdated
vuefrom 3.5.27 to 3.5.29 - ModificadoUpdated
playwrightfrom 1.58.1 to 1.58.2 - ModificadoUpdated
corsfrom 2.8.5 to 2.8.6 - ModificadoUpdated
vue-routerfrom 4.6.4 to 5.0.3 - ModificadoUpdated
mongodbfrom 6.21.0 to 7.1.0 - ModificadoUpdated
nodemailerfrom 6.10.1 to 8.0.1 - ModificadoUpdated
stripefrom 14.25.0 to 20.4.0 - ModificadoUpdated
@stripe/stripe-jsfrom 3.5.0 to 8.8.0 - CorregidoEmail link colors — fixed link colors being overridden by email clients (Gmail, Outlook) using
<span>wrapper technique - CorregidoPending associates visibility — associates with pending status now appear in the project settings list instead of being hidden until they accept
- CorregidoNode watch paths — added
src/translate/emails/to--watch-pathlist for email template hot-reload in development
v2.9.02026-02-28
- AñadidoSecurity vulnerabilities documentation page (
/docs/vulnerabilities) with detailed guides for HTTP security headers, TLS/SSL, Lighthouse security audits, and software version exposure (26 vulnerabilities total) - AñadidoSeparate translation files for vulnerabilities (
src/translate/vulnerabilities/en.json,fr.json) - AñadidoVulnerability detail view with route
/docs/vulnerabilities/:idand breadcrumb navigation - AñadidoVulnerabilities listed in Docs page section #10 with severity chips and direct links
- Añadido4 vulnerability categories: HTTP Security Headers (10), TLS/SSL Certificate (5), Lighthouse Security Audits (7), Software Version Exposure (4)
- AñadidoSpanish language support (es.json, vulnerability translations, email templates, flag icon)
- AñadidoCentralized locale configuration (
SUPPORTED_LOCALES,LOCALE_CODES,getIntlLocale(),getOgLocale()inshared/const.js) — adding a new language only requires updating the single source of truth - AñadidoChangelog page now auto-generated from
CHANGELOG.md— single source of truth, no duplication in translation files - ModificadoRedesigned header action elements (language switcher, account, sign in) with consistent pill-style buttons using shared SCSS mixin
- ModificadoLanguage switcher now displays country flag emoji (🇬🇧/🇫🇷) with locale code, clearly interactive at rest
- ModificadoCTA buttons (Dashboard, Start Free) use rounded pill style for visual consistency
- ModificadoMobile drawer language buttons also show flag emojis
v2.8.32026-02-28
- CorregidoPDF section order now matches app tab order: Security → Quality → Performance → Resources → Advanced (Global → Framework → Critical Chains → Scripts Treemap → Audit Timing → Passed)
- CorregidoMoved
runWarningsfrom after CWV to Advanced/Global section in PDF - CorregidoMoved
consoleto first position in Advanced section in PDF - CorregidoAdded missing translation key
scan.details.showAll(EN/FR)
v2.8.22026-02-28
- ModificadoMoved Server Response Time block from Advanced > Global to Performance tab (displayed before Opportunities/Diagnostics)
- ModificadoPDF report updated to match new Server Response Time placement
v2.8.12026-02-28
- AñadidoAdvanced tab split into 6 sub-tabs: Global, Framework, Critical Chains, Scripts Treemap, Audit Timing, Passed
- AñadidoNew components:
ScanStackPacksSection,ScanCriticalChainsSection,ScanScriptTreemapSection,ScanAuditTimingSection - ModificadoAdvanced > Global sub-tab: Console section displayed first, then Server Response Time, then remaining technical data
- ModificadoFixed console section scrollbar overflow (removed unnecessary max-height constraint)
- CorregidoConsole section displaying unwanted horizontal/vertical scrollbars
v2.8.02026-02-28
- AñadidoHTTP response headers extraction from Lighthouse artifacts (
NetworkRecords) during scans - AñadidoStandalone Security tab in scan results with four sub-tabs: "TLS Certificate", "Response Headers", "Software Versions" and "Lighthouse Audits"
- AñadidoSecurity headers analysis: 10 critical headers checked (HSTS, CSP, X-Frame-Options, etc.) with present/missing status and risk severity levels (high/medium/low)
- AñadidoFull response headers table in Security > Headers sub-tab
- AñadidoTLS certificate analysis: protocol version, cipher suite, signature algorithm, issuer, expiration with warnings for weak/expired certificates
- AñadidoSoftware versions detection from HTTP headers (Server, X-Powered-By), HTML content (CMS, meta generator, frameworks) and TLS protocol
- AñadidoPDF report: security section now includes TLS certificate, response headers, software versions and Lighthouse security audits
- AñadidoGlobal CSS gap utilities (
.gap-1to.gap-16) in design system — fixes allgap-*classes that were non-functional with Vuetify - AñadidoLighthouse scores sorted worst-to-best on scan details page and project overview page
- AñadidoCore Web Vitals sorted worst-to-best on scan details page and project overview page
- AñadidoQuick stats clickable: navigate to corresponding tab and sub-tab with smooth scroll
- AñadidoPassed audits click scrolls directly to Passed section anchor within Advanced tab
- ModificadoScan result tabs reordered: Security → Quality → Performance → Resources → Advanced
- ModificadoSecurity tab is now the default selected tab on scan results
- ModificadoSecurity issues moved from Quality tab sub-tab to standalone Security tab
- ModificadoScan results overview layout reorganized: environment chips before quick-stats, screenshot in 3rd column
- ModificadoLoading timeline moved from overview to Resources tab (after stat-cards, before resources by type)
- ModificadoQuality tab reduced from 4 sub-tabs to 3 (accessibility, SEO, best practices)
v2.7.12026-02-28
- ModificadoRefactored project creation wizard: removed step 4 (scan progress), now redirects to project overview after creation where
ScanProgressCardhandles scan progress display - ModificadoProject creation wizard reduced from 4 steps to 3 steps (Info → Pages → Alerts → Launch)
- CorregidoDashboard news section not displaying:
NewsSectionwas readingdata.newsinstead ofdata.itemsfrom API response - CorregidoScan results: overview section extracted from tabs and displayed permanently between CWV and tab navigation
v2.7.02026-02-28
- AñadidoLocalized URLs: all routes now prefixed with locale (
/en/*,/fr/*) - Añadido
useLocalePathcomposable for locale-aware navigation - AñadidoAutomatic locale detection from browser on first visit
- AñadidoSEO: hreflang, canonical, og:locale, and Schema.org inLanguage in SSR
- AñadidoLocale switcher updates URL path in real-time
- AñadidoNews system: CRUD backend with bilingual content (FR/EN), cover image upload, sticky/homepage banner flags
- AñadidoNews comments with moderation: users can post, edit own comments; admin approval workflow with pending/approved/rejected status
- AñadidoComment rate limiting: configurable max comments per time window via admin settings
- AñadidoAdmin news management: TipTap WYSIWYG editor, bilingual tabs, publish/draft, sticky and homepage banner controls
- AñadidoAdmin comments moderation panel: approve, reject, delete comments with filters
- AñadidoDashboard news section: latest 3 articles with unread badge and sticky indicator
- AñadidoNews detail page with full content rendering and comments section
- AñadidoHomepage news banner: dismissible gradient banner for featured articles
- AñadidoIP tracking: user login IPs stored with history for security auditing
- AñadidoUser blocking system: admin can block by account and/or IP addresses
- AñadidoAdmin user detail: security section with block/unblock UI, IP history table with per-IP status and unblock action
- AñadidoAdmin bypass: administrators exempt from all plan limits (projects, scans, associates, pages)
- AñadidoFavicon: SVG/PNG/ICO with VitaPulse branding (gradient V + pulse line)
- AñadidoNews publicly accessible: reading news and comments no longer requires authentication
- AñadidoComment posting/editing still requires authentication, with "Sign in to comment" prompt for visitors
- AñadidoCentralized event logging system:
logEvent()helper,logscollection, admin logs page with search/filter/delete - AñadidoEvent logging instrumented across all endpoints: auth, projects, scans, billing, associates, admin, contact, quick audit, PDF download (40+ events)
- AñadidoAdmin user detail: recent activity logs section with link to filtered logs page
- AñadidoForgot password flow: email verification code, reset password page
- AñadidoChange password: authenticated users can change password from account page
- AñadidoAccount page: profile editing (name) and password change under
/app/account - ModificadoPricing FAQ completely rewritten with 20 comprehensive questions covering all features, plans, and capabilities
- ModificadoBackend-generated URLs (Stripe checkout, emails, Google Chat webhooks, share links) now include locale prefix
- ModificadoAdmin user detail page shows IP history and blocking controls
- ModificadoSCSS design system: all hardcoded hex colors, border-radius, font-size, font-weight replaced with variables across 30+ files
- ModificadoNew SCSS mixins:
hover-row,hover-lift,hover-light-on-dark,link-on-dark,link-primaryfor consistent hover effects - ModificadoRemoved unused SCSS mixins (
status-good/warning/error,score-gauge) - ModificadoAdded
$border-radius-xs,$gradient-dark-diagonalSCSS variables - ModificadoFavicon and apple-touch-icon now use relative paths (fixes cross-origin issues in dev)
- ModificadoRemoved orphan
src/views/auth/directory (duplicate ofsrc/views/Auth/) - ModificadoRefactored: auth page SCSS extracted to global
.auth-pageclass in_components.scss - ModificadoRefactored:
getEventColor/getEventCategory/formatLogMetaextracted touseLogUtilscomposable - ModificadoRefactored: business downgrade logic extracted to
handleBusinessDowngrade()indbHelpers.js - ModificadoRefactored: inline URL truncation styles replaced with
.admin-url-truncateSCSS class - ModificadoLogger
logEvent()changed to fire-and-forget with.catch(() => {})(no more async/await) - SeguridadObjectId validation added to all news/comments API endpoints
- SeguridadObjectId.isValid() validation added to all API endpoints accepting ID parameters (17+ routes)
- SeguridadError logging (
console.error) added to all catch blocks across the entire API (15+ files) - SeguridadBlocked users/IPs rejected at login with appropriate error messages
- SeguridadMongoDB projection added to user query in lighthouse.js to exclude password hash
- SeguridadWebhook error responses standardized to JSON format
- SeguridadsetReference race condition fixed with atomic bulkWrite operation
- CorregidoHardcoded French progress messages in scan store replaced with i18n keys (
scan.progress.*) - CorregidoDefault locale inconsistency: backend now uses
DEFAULT_LOCALE('en') everywhere instead of mixed 'fr'/'en' - CorregidoHardcoded French in
useDateFormat.jsreplaced with i18n keys (dashboard.fewSeconds,dashboard.days) - CorregidoDefault locale for
formatDateShort/formatDateFullchanged from'fr-FR'to'en-US' - CorregidoScan status colors centralized in
SCAN_STATUS_COLORSconstant (removed duplication in 3 admin views) - CorregidoObjectId validation added to
findUserOrSharedProjecthelper (prevents crash on invalid IDs) - CorregidoCron notifications now log warnings on failure instead of silently swallowing errors
- CorregidoCron scheduled scans now validate
project.urlbefore launching scan - CorregidoTiptapEditor image upload now handles fetch errors and checks
res.ok - CorregidoUnused
shallowRefimport removed from NewsDetailView - CorregidoUnused
mdiEyeOffimport removed from AdminNewsEditView
v2.6.12026-02-27
- ModificadoCWV tooltips on scan detail page now show per-metric descriptions matching project overview page
- ModificadoRemoved non-functional expandable CWV cards on scan detail page
- ModificadoAdded spacing between Mobile/Desktop toggle buttons
- ModificadoRemoved share report button from scan detail page
v2.6.02026-02-27
- AñadidoPlan upgrade/downgrade with Stripe proration (Pro ↔ Business, monthly ↔ yearly)
- AñadidoUpgrade preview dialog showing prorated amount before confirmation
- AñadidoWebhook handler for
customer.subscription.updatedas backup sync - AñadidoCheckout guard preventing duplicate subscriptions
- AñadidoProject screenshot thumbnail on dashboard cards and project overview header
- AñadidoPlaceholder image for projects without scans (VitaPulse branded SVG)
- ModificadoUpgrade button in Billing page now opens inline preview dialog instead of redirecting to pricing
- ModificadoPricing page buttons adapt for existing subscribers (upgrade, downgrade, cycle change)
- ModificadoDowngrade from Business automatically revokes associates
- ModificadoAdmin downgrade from Business now properly revokes associates and cleans shared projects
v2.5.12026-02-27
- AñadidoAssociates can now view project settings in read-only mode
- AñadidoAssociates can manage their own email notification preferences (scan results and regression alerts) based on their plan
- AñadidoAssociate notification emails are sent after each scan completion
v2.5.02026-02-27
- ModificadoCase Studies page: fixed all section-to-page mappings to match actual PDF content (16 sections for 28 pages)
- ModificadoCase Studies page: corrected metrics values (mobile 82, desktop 78)
- ModificadoDocumentation page: complete rebuild with comprehensive VitaPulse user guide (10 sections: Quick Audit, Projects, Scans, Scores, CWV, Opportunities, Regressions, PDF Reports, Associates, Plans)
- ModificadoDocumentation page: added quick start cards, table of contents, and screenshot illustrations
- ModificadoLanding page: enhanced features section with 6 benefit cards and 4 illustrated feature showcases
- ModificadoChangelog page: complete rewrite with full version history (v1.0.0 to v2.4.0)
- ModificadoSecurity page: updated with VitaPulse-specific security practices and technical details
- ModificadoTerms of Service: comprehensive rewrite with 12 sections covering SaaS-specific terms
- ModificadoPrivacy Policy: GDPR-compliant rewrite with detailed data collection, storage, and rights information
- ModificadoCookie Policy: rewritten to reflect actual minimal cookie usage (single session cookie)
- EliminadoAPI documentation page and route (no public API)
- EliminadoBlog page link from footer (no blog content)
- EliminadoStatus page link from footer
v2.4.12026-02-26
- ModificadoProject settings page: split into tabs (Settings / Associates) for Business plan users
- ModificadoDashboard: search field and project filter now on the same line
- CorregidoAssociates tab not switching (missing activeTab ref)
- CorregidoInvite button not vertically centered next to email input
v2.4.02026-02-26
- AñadidoAssociates system for Business plan users: invite up to 5 associates by email to share project access
- AñadidoAssociates management section in project settings (invite, share, remove per project)
- AñadidoDashboard filter (All / My projects / Shared with me) with shared badge showing owner name
- AñadidoEmail invitation templates for associates (existing user + new user) in EN/FR
- AñadidoAutomatic project linking when invited associate registers a new account
- AñadidoAssociate access inheritance: associates inherit PDF download and report sharing capabilities from project owner's plan
- AñadidoScan ownership awareness: project owners can manage scans launched by associates
- AñadidoAutomatic associate revocation on plan downgrade (Business → Pro/Free)
v2.3.22026-02-26
- CorregidoGlobal button spacing: adjacent buttons in card actions are no longer visually stuck together
- CorregidoCWV history chart now auto-rebuilds project stats from existing scans when collection is empty
v2.3.12026-02-22
- CorregidoAdmin scores display not showing due to per-device nested data structure
- CorregidoAdmin CWV table empty due to same nested structure issue
- CorregidoScan detail page now shows scores and CWV per device with mobile/desktop toggle
v2.3.02026-02-22
- AñadidoAdmin user detail page with editable plan, type, name, company
- AñadidoUser projects list in admin user detail
- AñadidoClickable rows in admin users table
- AñadidoAdmin project detail page with editable name, URL, scan frequency
- AñadidoProject scans list in admin project detail with status, score, device
- AñadidoClickable project rows in admin projects list and user detail
- AñadidoLink to project owner from project detail page
- AñadidoAdmin scan detail page with scores, CWV, regressions display
- AñadidoEditable scan status and reference flag from admin
- AñadidoAdmin scan delete with confirmation dialog
- AñadidoClickable scan rows in admin scans list and project detail
- AñadidoLinks to owner and project from scan detail page
v2.2.12026-02-22
- CorregidoLanding page hero section alignment and height
v2.2.02026-02-22
- AñadidoUser
typefield (userdefault,adminmanual) for role-based access - AñadidoAdmin dashboard with user listing (email, plan, projects, scans, registration date)
- AñadidoAdmin projects page listing all projects with owner, scan count, latest score
- AñadidoAdmin scans page listing 200 most recent scans with project, owner, status, score, duration
- Añadido
requireAdminmiddleware for admin-only API endpoints - AñadidoAdmin menu in header (crown icon) visible only for admin users
- AñadidoAdmin route guard (
requiresAdmin) on frontend router - ModificadoCWV history chart now uses dedicated
projectStatscollection with incremental aggregation instead of paginated scan data - ModificadoStats are pushed to
projectStatson each scan completion (no cron needed) - ModificadoNew
GET /api/projects/:id/statsendpoint for lightweight chart data
v2.1.02026-02-21
- Añadido"Set as reference" action on scan details page with
isReferencebadge display - AñadidoNetwork requests table in Resources tab (URL, type, protocol, status, transfer/resource size, priority)
- AñadidoMain thread time column in third-party summary table
- AñadidoParse/Compile column in script bootup table
- AñadidoOverview stat cards in Resources tab (requests, transferred, third parties count, JS libraries count)
- AñadidoShow more/less toggle on script bootup, third-party, and network requests tables
- AñadidoCore Web Vitals history chart (Plotly) on project overview page, visible when at least 2 completed scans exist
- ModificadoMerged "Insights" tab into "Performance" tab (opportunities + diagnostics + insights)
- ModificadoMerged "Technical", "Console", and "Passed" tabs into a single "Advanced" tab
- ModificadoReplaced
v-btn-togglenavigation withv-tabsfor scan result sections - ModificadoRedesigned Resources tab with section headers, sorted resource bars, and detailed tables
- ModificadoThird-party section now displays data directly from
thirdPartySummarywith entity name and main thread time - ModificadoReplaced
networkSummary(aggregate) with detailednetworkRequeststable - ModificadoRegression detection now prioritizes scans marked as
isReferencebefore falling back to latest scan - ModificadoSynchronized 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
- AñadidoComprehensive 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)
- AñadidoCase studies page with real audit data from www.e-xode.net (23-page PDF, per-page screenshots, key metrics, takeaways)
- AñadidoComplete i18n localization system with
createT(locale)server-side translation resolver - AñadidoShared component library: 13 reusable components extracted (
AlertError,ConfirmDialog,DataTable,EmptyState,LoadingSpinner,PageHeader,ScoreCircle,ScanProgressCard,SearchInput,SectionCard,StatCard,StatusChip,UpgradeCta) - AñadidoShared utilities module (
shared/utils.js) withescapeHtml,formatBytes,formatMs,getScoreColor,getScoreLabel,getScoreBg,getCwvStatus,getCwvColor,formatCwvValue - AñadidoShared constants module (
shared/const.js) withDEVICES,CWV_METRICS,INSIGHTS_FAILING_THRESHOLD,SCAN_DATA_FIELDS - AñadidoShared database helpers (
shared/dbHelpers.js) for MongoDB operations - AñadidoShared API client (
shared/api.js) with centralized error handling - AñadidoRate limiting on all API endpoints with configurable windows
- AñadidoSession management with automatic cleanup on dev startup
- AñadidoVersion number displayed in application footer
- AñadidoPDF White Label mode for Business plan users
- AñadidoApp version exposed via Vite
definefor frontend access - ModificadoRewrote
pdfTemplate.js(~580 lines) with all scan data sections, matching app UX/design (brand gradient, score colors, impact badges, CWV thresholds) - ModificadoRewrote
downloadPdf.jswith comprehensivepreparePdfData()extracting all 35+ scan data fields per device - ModificadoRefactored all Pinia stores to use shared utilities and constants
- ModificadoRefactored all API endpoints to use shared database helpers and middleware
- ModificadoUpdated all Vue components to use shared component library
- ModificadoMigrated all hardcoded strings to i18n translation files (en.json, fr.json)
- ModificadoUpdated
entry-server.jswith i18n-aware SSR (getRouteMeta,generateMetaTags,getSchemaMarkup) - ModificadoUpdated
index.htmlwith<!--app-lang-->placeholder for dynamic lang attribute - ModificadoRewrote
CaseStudiesView.vuewith real audit content and PDF page screenshots - ModificadoImproved error handling across all API routes with safe JSON parsing
- CorregidoSecurity audit: input validation, authorization checks, rate limiting on all endpoints
- CorregidoData parity between scan storage and display fields
- CorregidoDocker and Playwright configuration for PDF generation
- CorregidoSession cleanup preventing stale session file accumulation
- CorregidoRate limiting configuration for different endpoint categories
- CorregidoSSR hydration for localized meta tags and schema markup
- CorregidoTranslation key consistency across all components
- SeguridadAdded
requireAuthmiddleware on all protected routes - SeguridadAdded input sanitization with
escapeHtmlutility - SeguridadEnforced ownership checks on scan/project access
- SeguridadConfigured Helmet CSP and CORS policies
- SeguridadAdded rate limiting per API category (auth, scans, general)
v1.3.02026-02-10
- AñadidoCase studies page showcasing VitaPulse audit capabilities
- AñadidoGitHub Actions workflow for CI testing
- ModificadoLayout improvements across all views
- ModificadoTranslation updates for all supported locales
- ModificadoMajor layout and code refactoring
v1.2.02026-02-07
- AñadidoCoupon management system for Stripe payments
- AñadidoQuick audit rate limiting (max audits per plan)
- AñadidoAutomated cron jobs for data pruning
- AñadidoEmail notifications with scoring reports
- AñadidoMulti-page scan support
- ModificadoPricing logic refactored with plan-based feature gating
- ModificadoHeader theme improvements
- ModificadoReport results display fixes
- CorregidoDocker environment variables for Stripe integration
- CorregidoTranslation consistency issues
v1.1.02026-02-06
- AñadidoPDF report export with Chromium rendering
- AñadidoSEO optimizations (meta tags, schema markup, sitemap)
- AñadidoScan animation and progress indicators
- AñadidoCSS design system with variables and mixins
- AñadidoDetailed audit results display (8 tabbed sections)
- AñadidoNew project creation workflow with guided steps
- ModificadoFactorized scan animation components
- ModificadoServer-side rendering fixes for Vue Router
- CorregidoTranslation loading and fallback behavior
- CorregidoServer rendering hydration issues
v1.0.02026-02-04
- AñadidoInitial release of VitaPulse platform
- AñadidoLighthouse 12 audit engine integration
- AñadidoCore Web Vitals monitoring (LCP, FCP, CLS, TBT, INP, TTFB, Speed Index, TTI)
- AñadidoMobile and desktop device analysis
- AñadidoPerformance, Accessibility, Best Practices and SEO scoring
- AñadidoStripe payment integration with Pro and Business plans
- AñadidoUser authentication with email verification
- AñadidoLegal pages (Terms, Privacy, Cookies)
- AñadidoCORS and security configuration
- AñadidoDocker containerization with docker-compose