Änderungsprotokoll

Verfolgen Sie die Entwicklung von VitaPulse — neue Funktionen, Verbesserungen und Fehlerbehebungen.

Unveröffentlicht
v2.30.12026-06-07
  • Sicherheitnpm audit → 0 — non-breaking dependency updates (lockfile only, no package.json range
v2.30.02026-06-06
  • SicherheitNon-root container — the production image now runs as the built-in non-root node user (UID/GID 1000) instead of root. The runner stage chowns /app + /home/node (which also re-establishes node ownership of the Playwright/Chromium cache that npx playwright install wrote as root) and adds USER node; supervisord's pidfile moved /run/tmp to work unprivileged. Chromium already launches with --no-sandbox, and the audit/scan crons run via docker exec … node as the container user, so both keep working. Reduces the blast radius of any RCE. Operational note: the host bind-mounts /home/e-xode.vitapulse/{logs,public} must be owned 1000:1000 (applied by the deploy script) or sessions/uploads/audit-scratch cannot be written.
v2.29.02026-06-03
  • GeändertLiens de documentation cliquables dans les descriptions d'audit Lighthouse — les liens Markdown présents dans les descriptions d'audit Lighthouse (par ex. « [Learn more](…) ») sont désormais rendus en vrais liens <a> cliquables au lieu d'afficher la syntaxe Markdown brute. Appliqué de façon cohérente sur le rapport public, l'affichage du scan dans l'application et le PDF (modes brandé et white-label), via les helpers mdLinksToHtml/stripMd (src/shared/utils.js).
  • BehobenDébordement des onglets de facturation sur mobile — la barre d'onglets de la page Facturation débordait horizontalement sur les petits écrans. Ajout de show-arrows pour permettre le défilement des onglets, supprimant le débordement.
v2.28.02026-06-03
  • GeändertImage de couverture par défaut pour les actualités — chaque article sans coverImage (et tout article dont l'image de couverture échoue à charger) affiche désormais la couverture de marque news-default.png (1200×630) au lieu d'une icône générique, d'un emplacement vide ou d'une image cassée — en liste (/news), sur l'aperçu du tableau de bord et sur la page article. La même image alimente le og:image par défaut (public/og-image.png) pour le partage social des pages sans visuel propre.
v2.27.42026-06-03
  • BehobenLien de documentation cassé (Permissions-Policy / géolocalisation) — la référence « Permission UX - web.dev » de la vulnérabilité geolocation-on-start pointait vers https://web.dev/articles/permission-ux, désormais en 404 (article déplacé). Remplacée par https://web.dev/articles/permissions-best-practices (équivalent, 200) dans les 4 locales concernées (en, fr, es, de).
v2.27.32026-06-02
  • BehobenCapture 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.
  • BehobenManifest PWA — screenshots fantômes — le public/manifest.json référençait screenshot-desktop.png / screenshot-mobile.png (champ screenshots optionnel) qui n'existent pas, provoquant des 404 et un warning dans la console du navigateur. Tableau screenshots retiré (sans impact fonctionnel ; l'écran d'installation PWA n'affichera simplement pas d'aperçus).
v2.27.22026-06-02
  • BehobenCapture de secours quand le full-page Lighthouse échoue — sur les pages très hautes en environnement contraint en mémoire (typiquement la prod), le gatherer de capture pleine page de Lighthouse échouait silencieusement (fullPageScreenshot null), et le rapport retombait sur le minuscule screenshot viewport (« un petit bout de page »). Désormais, dans ce cas, une capture de secours via Playwright à hauteur bornée (haut 6000 px, downscalée) fournit un grand screenshot utile. Libellé honnête « Capture (haut de page) » quand la page a été tronquée, sinon « Capture pleine page ». La capture de secours est plus légère que la tentative de Lighthouse, donc fiable même en mémoire contrainte.
v2.27.12026-06-02
  • BehobenCapture pleine page et Baseline désormais réellement enregistrées — les champs annotations (capture pleine page + calques LCP/CLS) et baselineFeatures, introduits en 2.27.0, étaient calculés pendant le scan mais jamais persistés (oubliés dans le $set de sauvegarde, src/services/lighthouse/index.js) ni renvoyés par l'API publique de scan (absents de la projection PUBLIC_SCAN_PROJECTION, src/api/scans/get.js). La capture pleine page annotée et la section Baseline n'apparaissaient donc jamais. Corrigé : les nouveaux scans les enregistrent et les affichent (les anciens scans restent sans, faute de données).
  • GeändertAffichage 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).
  • GeändertCapture pleine page allégée avant stockage — downscale via sharp (largeur ~500 px, JPEG q50) appliqué sur le chemin de scan, réduisant la taille des documents de scan (~-23 %, ex. 2548 → 1963 Ko ; capture mobile 494 → 315 Ko). Les dimensions d'origine sont conservées en métadonnées pour que le positionnement des calques reste correct. Ajout de la dépendance runtime sharp.
v2.27.02026-06-02
  • HinzugefügtRapports PDF navigables et accessibles — les PDF de scan embarquent désormais un sommaire de signets (outline) et sont générés en PDF balisé (tagged/accessible). L'arborescence des signets suit la hiérarchie de titres du rapport : appareil (Mobile/Desktop) → section → sous-section, identique en modes brandé et white-label. Activé via page.pdf({ tagged, outline }) dans generatePdf() (src/api/scans/downloadPdf.js) ; le titre d'appareil passe en h1 dans pdfTemplate.js (changement de balise neutre visuellement, le style étant piloté par classe).
  • HinzugefügtCapture 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.
  • HinzugefügtCascade 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.
  • HinzugefügtSection « Baseline web features » — liste des fonctionnalités de la plateforme web utilisées par la page et leur statut de disponibilité Baseline (widely / newly / limited), issue du nouvel audit baseline de Lighthouse 13.3. Présente dans le rapport et le PDF.
  • GeändertPlaywright (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).
  • GeändertLighthouse (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).
  • GeändertOnglets 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.
  • GeändertFinition 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.
  • BehobenPage Contact (crash SSR) — le caractère @ du libellé d'email (you@company.com et variantes localisées) était interprété par vue-i18n comme une directive de message lié, provoquant une erreur de compilation et une page blanche. Échappé en {'@'} dans les 5 locales (plus les emails des pages légales).
  • BehobenChangelog (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.
  • BehobenNews (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
  • InhaltSite news article — pricing and Agency plan launch — Article published to the news MongoDB collection in all 5 locales (EN/FR/ES/DE/IT). Covers the four-tier pricing structure (Free/Pro/Business/Agency), corrected quotas, regression alerts on Business and Agency, and the Agency white-label PDF feature. coverImage is null — a human follow-up is needed to add a cover image via the admin panel.
v2.25.02026-05-31
  • HinzugefügtPage auteur (E-E-A-T) — nouvelle page publique /author/christophe-bragard (bio rédigée à la première personne, photo, expertise, lien LinkedIn), traduite dans les 5 langues, avec schéma JSON-LD ProfilePage/Person. L'auteur des articles de news est enrichi en Person (rôle, photo, sameAs LinkedIn) et la byline des articles renvoie désormais vers la page auteur. Entrée ajoutée au sitemap. Renforce les signaux d'auteur pour le SEO.
  • GeändertBadge hero — « Powered by Google Lighthouse » devient « Runs on Google Lighthouse » (et désormais correctement traduit en allemand et italien, auparavant restés en anglais)
  • GeändertRefonte du copy marketing anglais (src/translate/en.json) — réécriture ciblée de tous les espaces de noms visibles publiquement (landing, pricing, quickAudit, agencies, developers, coreWebVitals, caseStudies, about, author, security, docs, contact, footer, nav, errors 404) et de toutes les entrées meta.* SEO (title/description/keywords) pour les routes publiques et légales. Correction des nombres de plan obsolètes (« 5 scores » → 4, pages/projet alignées sur const.js), suppression de FID (remplacé par INP), conformité au guide éditorial (zéro flèche →, zéro buzzword de la liste noire). Source pour la propagation vers les 5 locales via l'agent translate.
  • GeändertRéé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.
  • GeändertPropagation du copy marketing en espagnol, allemand et italien (es/de/it.json) — re-localisation native et idiomatique des mêmes espaces de noms marketing et des entrées meta.* depuis la source anglaise. Correction de nombres erronés et de statistiques inventées dans les anciennes FAQ, alignement des libellés (4 scores, 6 Core Web Vitals, historiques 30/180/365/730 jours, 10 sièges). Conventions par langue respectées (ES tú, DE Sie + noms capitalisés, IT Lei). Parité de clés stricte sur les 5 locales (1 701 clés), zéro flèche.
  • GeändertVouvoiement 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.
  • GeändertFlag multi_device retiré des features des plans (src/shared/const.js) — l'analyse mobile + desktop est une capacité de base disponible sur tous les paliers (y compris Free) et n'était gardée par aucune logique applicative. Le flag, listé à tort comme avantage Pro+, est supprimé des features Pro/Business/Agency pour aligner le modèle tarifaire sur le comportement réel. Aucun changement fonctionnel (le flag n'était jamais évalué) ; la page tarifs reste inchangée (elle s'appuie sur les listes i18n).
  • GeändertRenforcement SEO et données structurées (src/entry-server.js) — émission de la balise meta keywords (auparavant résolue mais jamais rendue), meta author réel (Christophe Bragard) sur la page auteur et les articles, Person.worksFor (E-XODE) pour l'E-E-A-T, schéma Product enrichi de 4 Offer (prix réels par palier) sur la page tarifs, BreadcrumbList sur docs/vulnérabilités/articles. La route des rapports de scan partageables (/report/:scanId) passe en noindex, follow.
v2.24.02026-05-31
  • HinzugefügtPalier 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
  • GeändertRefonte 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
  • GeändertQuotas 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
  • GeändertWhite-label PDF et gestion d'équipe (associates) déplacés de Business vers Agency — Business conserve le PDF brandé et les alertes de régression ; le white-label et les associés (jusqu'à 10) sont désormais réservés à Agency. canManageAssociates et le nettoyage des associés au downgrade (handleBusinessDowngradehandleAssociatesDowngrade) basculent sur le palier Agency
  • GeändertAlertes de régression — désormais incluses dans Business ET Agency (auparavant Business uniquement)
  • GeändertRé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
  • GeändertPage 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
  • Behobenpackage.json — suppression de la virgule traînante après le script scan (causait un EJSONPARSE au npm ci)
v2.23.22026-03-22
  • GeändertSitemap dynamique — suppression du cron quotidien generateSitemap.js et du fichier statique public/sitemap.xml. Le sitemap est désormais servi dynamiquement via une route Express /sitemap.xml avec cache in-memory (TTL 1h)
v2.23.12026-03-17
  • BehobenEmails discussions — correction de l'URL de fallback dans les templates email de discussion : vitapulse.iovitapulse.e-xode.net (5 langues)
  • GeändertLighthouse 12 → 13 — mise à jour majeure du moteur d'audit. 27 audits individuels supprimés (consolidés dans les 17 insights). Diagnostics réduits de 33 à 13 IDs. Fallback CLS elements vers cls-culprits-insight. uses-http2 retiré des skipAudits. Scores a11y/SEO/BP ajustés (poids modifiés). Rétrocompatibilité totale avec les anciens scans
  • GeändertVite 7 → 8 — migration vers Rolldown (bundler Rust). Option api: 'modern-compiler' retirée des options SCSS (seul mode supporté). Builds ~2x plus rapides
  • GeändertVue Router 4 → 5 — mise à jour majeure sans breaking changes (merge de unplugin-vue-router dans le core)
  • Geändert@vitejs/plugin-vue 5 → 6 — alignement sur Vite 8
  • GeändertDé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
  • GeändertTipTap épinglé à 3.20.0 — overrides npm pour contourner le publish cassé de 3.20.3 (dist/ manquant)
  • GeändertPerformance Insights — extraction enrichieextractPerformanceInsights() capture désormais la structure complète des insights Lighthouse : headings, metricSavings, overallSavingsMs/Bytes, scoreDisplayMode, debugData, sortedBy, isEntityGrouped, subItems imbriqués, et items sans troncature abusive (50 max pour tables, 30 pour listes)
  • GeändertPerformance Insights — UI refondéeScanInsightsSection.vue remplacé par une interface riche avec recherche, filtre par métrique impactée (LCP/CLS/INP/TBT/FCP), tri par score ou par gains, chips metricSavings, badges overallSavings, et rendu adaptatif selon le type de données (table/list/checklist)
  • GeändertPerformance 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)
  • GeändertAuditDetailTable — subItems et nouveaux valueTypes — support des sous-éléments expandables (clic pour déplier), et des types source-location, code, numeric
  • GeändertLighthouse — capture runtimeError — vérification de lhr.runtimeError après chaque appel à lighthouse() pour détecter les erreurs fatales (page non chargée, crash GPU, timeout DNS) et éviter les scans silencieusement marqués "completed" avec des scores null
  • GeändertLighthouse — effort calculé depuis guidanceLevel — le champ effort des opportunités est maintenant calculé depuis audit.guidanceLevel (1→high, 2→medium, 3→low) au lieu d'être hardcodé à 'medium'
  • GeändertLighthouse — language default cohérent — le fallback de langue passe de 'fr' hardcodé à DEFAULT_LOCALE ('en') pour respecter la convention du projet
  • GeändertLighthouse — desktop timeouts configurablesmaxWaitForFcp (15s) et maxWaitForLoad (35s) desktop sont maintenant dans LIGHTHOUSE_CONFIG.timing au lieu d'être hardcodés
  • HinzugefügtInsightChecklist — nouveau composant pour afficher les insights de type checklist (document-latency, lcp-discovery) avec icônes de validation
  • HinzugefügtInsightListRenderer — nouveau composant pour afficher les insights de type list (cls-culprits, forced-reflow, breakdowns, network-tree) avec rendu récursif
  • HinzugefügtLighthouse — audit.explanation — extraction et affichage du champ explanation de Lighthouse dans les opportunités, diagnostics, issues (a11y/SEO/BP/security), insights et le PDF de résultats. Ce champ fournit un texte contextuel expliquant pourquoi l'audit a échoué pour la page spécifique testée
v2.22.12026-03-14
  • GeändertGitHub Actions — build workflow déclenché sur push/PR vers main (remplace npm run lint/test:run inexistants par npm run build), Docker build déclenché uniquement sur les tags de release (v*), CodeQL aligné sur la branche main
v2.22.02026-03-12
  • SicherheitGoogle reCAPTCHA v3 — intégration CAPTCHA invisible sur les 3 endpoints publics (signup, quick audit, contact). Vérification serveur du token avec score minimum 0.5. Désactivé en développement. Composable Vue useCaptcha partagé, helper serveur verifyCaptcha factorisé
v2.21.02026-03-12
  • HinzugefügtStatut 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
  • HinzugefügtSuppression 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
  • SicherheitValidation 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
  • SicherheitValidation serveur signin — ajout de la validation email côté serveur dans l'endpoint de connexion
  • SicherheitRate limit signup renforcé — réduction du rate limit signup de 10 à 5 requêtes par 15 minutes
  • SicherheitTraduction 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
  • HinzugefügtSuivi conversions Google Ads — événement GA4 purchase déclenché après un checkout réussi (Pro/Business) avec valeur de conversion, devise EUR et cycle de facturation. L'événement est automatiquement importé par Google Ads via ads_conversion_PURCHASE_1
  • HinzugefügtValidation 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
  • HinzugefügtValidation email — vérification du format email sur les pages de connexion et d'inscription. Utilise le regex partagé EMAIL_REGEX au lieu d'un regex inline moins strict
  • BehobenTextes 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
  • HinzugefügtLangue 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)
  • BehobenTraductions 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)
  • BehobenTraductions 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
  • BehobenAppel parasite quick-audit/convert — nettoyage du localStorage lorsque la conversion échoue, évitant un appel API inutile à chaque connexion
v2.18.12026-03-08
  • GeändertLimite 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)
  • BehobenLimite scans Business — correction de la limite de scans manuels du plan Business (était Infinity, maintenant 100). Seul l'admin est illimité
  • BehobenReset 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)
  • BehobenAffichage compteur scans — le dashboard Billing affiche maintenant les scans du mois en cours (scansThisMonth) au lieu du total à vie
  • BehobenAlignement 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
  • HinzugefügtLangue 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)
  • HinzugefügtNews multilingues dynamiques — refonte de l'éditeur de news admin : EN toujours obligatoire, ajout de langues supplémentaires via bouton (+), onglets dynamiques par langue. Champ languages stocké sur chaque news. Recherche admin étendue à toutes les langues. Chips de langues affichées dans la liste admin
  • GeändertRé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
  • GeändertPage 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
  • HinzugefügtLanding 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
  • GeändertLimites 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)
  • GeändertCheckoutView factorisé — les features hardcodées en anglais sont remplacées par les traductions i18n de la page pricing
v2.16.22026-03-07
  • HinzugefügtProjectBanner 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
  • SicherheitCodes de sécurité cryptographiques — remplacement de Math.random() par crypto.randomInt() pour la génération des codes 2FA
  • SicherheitComparaison timing-safe — les vérifications de codes de sécurité utilisent désormais crypto.timingSafeEqual pour prévenir les attaques par timing
  • SicherheitProtection open redirect — validation du paramètre redirect dans les pages d'authentification (signin, signup, verify-code)
  • SicherheitInvalidation des sessions — les autres sessions sont détruites lors d'un changement de mot de passe ou d'email
  • SicherheitFuite de stack trace — les erreurs 500 n'exposent plus la stack trace en production
  • SicherheitSecret de cookie — le secret de session est désormais obligatoire en production (plus de fallback en dur)
  • SicherheitCSP Helmet activé — Content Security Policy configuré en production (script-src, style-src, frame-src, etc.)
  • SicherheitSanitization v-html — les descriptions Stack Packs sont désormais sanitizées via DOMPurify
  • SicherheitWebhook Stripe — les messages d'erreur ne divulguent plus les détails Stripe internes
  • SicherheitSanitization HTML durcie — restriction de l'attribut style au tag span uniquement, regex de couleur stricte
  • SicherheitRate limiting étendu — ajout de limites sur change-password, change-email, verify-email-change
  • SicherheitPlages IPv6 privées complètes — ajout des plages fd00:, ::ffff: mapped pour bloquer les scans sur IPs privées
  • BehobenBug associates/invite.js — correction d'un crash ReferenceError quand la variable project était utilisée avant sa déclaration
v2.16.12026-03-07
  • BehobenSSR 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
  • HinzugefügtPage 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)
  • HinzugefügtMéta dynamiques pour les news — les pages de détail des articles ont désormais un titre, description et image OG uniques générés côté SSR. Schema JSON-LD NewsArticle avec auteur et dates
  • Hinzugefügtx-default dans le sitemap — le générateur de sitemap inclut désormais le hreflang x-default
  • GeändertOptimisation fonts — suppression du double chargement Google Fonts dans index.html (déjà chargé via style.css) et de la police IBM Plex Mono inutilisée
  • GeändertRemplacement 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
  • Behobenrobots.txt — correction du domaine du sitemap (pointait vers un domaine inexistant)
  • BehobenSchema Pricing — suppression du faux AggregateRating (données inventées)
  • EntferntuseMeta.js — composable jamais utilisé, supprimé (dead code)
  • Entferntsitemap.xml du dépôt Git — fichier régénéré quotidiennement par cron, ne doit pas être versionné
v2.15.02026-03-07
  • HinzugefügtSuppression 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
  • HinzugefügtNavigation 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
  • BehobenBadge 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
  • HinzugefügtRedirection 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)
  • HinzugefügtLiens 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
  • HinzugefügtBadge 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
  • HinzugefügtAnnulation 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
  • HinzugefügtBannière projet partagée — le titre, l'URL et le screenshot du projet sont affichés sur les pages Discussions et Paramètres via un composant ProjectBanner réutilisable
  • HinzugefügtLien résultats complets — lien "Consulter tous les résultats de l'audit" sous les scores dans la page projet
  • GeändertLogo 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
  • GeändertAvatar 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
  • GeändertMenu header — l'option "Administration" est déplacée juste avant "Déconnexion" (après le divider) au lieu d'être en première position
  • GeändertMongoDB connection — encodage encodeURIComponent() du nom d'utilisateur et mot de passe dans l'URI de connexion pour gérer les caractères spéciaux
  • GeändertTraduction française — remplacement de tous les termes "scan/scans" par "audit/audits" dans l'interface française
  • GeändertHarmonisation responsive — remplacement de tous les breakpoints hardcodés (768px, 960px, 600px) par des mixins SCSS centralisés (max-md, max-sm, max-lg) basés sur les variables du design system. Harmonisation des 4 pages projet (overview, settings, discussions, discussion detail) : même background ($gradient-light), même padding, même breakpoint (max-md), même variable $header-height. Remplacement de calc(100vh - 72px) par $header-height dans 6 pages app
v2.13.32026-03-06
  • BehobenEmail 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
  • GeändertFactorisation getProjectScanData() — la logique d'extraction des scores et headers de sécurité pour les emails d'invitation est centralisée dans dbHelpers.js (utilisée par invite.js et share.js)
v2.13.22026-03-06
  • GeändertMongoDB indexes initializationinitializeCollections(db) est désormais appelée au démarrage du serveur, garantissant la création des index sur toutes les collections (users, projects, scans, quickAudits)
  • GeändertOptimisation 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
  • GeändertAggregation $facet — les endpoints GET /api/projects/:id/scans et GET /api/admin/projects/:id combinent désormais data + count en une seule requête MongoDB au lieu de deux
  • GeändertAdmin scans pagination — l'endpoint GET /api/admin/scans est désormais paginé (50 résultats/page avec navigation) au lieu de charger 200 résultats d'un coup
  • GeändertIndex compound scans — ajout de l'index { projectId: 1, status: 1, createdAt: -1 } pour optimiser les requêtes filtrées par statut
  • BehobenMongoDB sort memory overflow — ajout de allowDiskUse() sur les requêtes de listing scans pour éviter le crash QueryExceededMemoryLimitNoDiskUseAllowed sur les collections volumineuses
v2.13.12026-03-06
  • GeändertSécurité : hashage des codes de vérification — remplacement de l'encodage Base64 (réversible) par SHA-256 pour le stockage des codes de sécurité 2FA (hashCode/verifyCode dans email.js)
  • GeändertSécurité : projection MongoDB sur users — exclusion systématique des champs sensibles (password, securityCode, securityCodeExpires, securityCodeAttempts) via findUserSafe() dans 18 fichiers API (billing, projects, associates, scans)
  • GeändertSécurité : sanitization formulaire de contact — les champs name, subject et message sont désormais trimés et sanitizés via sanitize-html avant envoi
  • GeändertExtraction IP centralisée — remplacement de 9 occurrences de req.headers['x-forwarded-for'] manuelles par getClientIp(req) dans les endpoints commentaires, discussions et admin
  • GeändertConsolidation escapeHtml — suppression des 2 implémentations dupliquées (entry-server.js, useMeta.js), import unique depuis shared/utils.js. Ajout de l'échappement des quotes simples ('&#039;)
  • GeändertHelpers backend factorisésparseObjectId(), parsePagination(), findUserSafe() dans dbHelpers.js ; pagination utilisée dans 4 endpoints (logs, discussions, news, scans)
  • GeändertRobustesse logginglogEvent() loggue désormais les erreurs d'écriture MongoDB au lieu de les ignorer silencieusement
  • GeändertRobustesse router — le catch vide dans router.beforeEach loggue désormais les erreurs de vérification auth
v2.13.02026-03-06
  • HinzugefügtProject 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.
  • HinzugefügtUnified discussion system — news comments and project discussions now share the same data architecture (discussions, discussionMessages, discussionReads collections) and reusable CommentThread component
  • HinzugefügtDiscussion email notifications — configurable alerts for new discussions and new messages, with separate toggles in project settings (available for all plans)
  • HinzugefügtAdmin discussions page — manage all discussions (news and projects) from admin panel with filtering by type and deletion capabilities
  • HinzugefügtRich 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
  • HinzugefügtServer-side HTML sanitization — all user-generated HTML content (discussions and news comments) is sanitized server-side via sanitize-html to prevent XSS attacks. Only safe tags, attributes, and YouTube iframes are allowed
  • HinzugefügtClient-side HTML sanitization — DOMPurify applied to all v-html rendering (discussion messages, news article content, news comments)
  • HinzugefügtSource 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
  • HinzugefügtPage 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
  • GeändertNews comments — migrated from newsComments/newsReads to unified discussions/discussionMessages/discussionReads collections (breaking: existing news comments are lost, fresh start)
  • GeändertTiptapEditor — moved from components/admin/ to components/common/ for reuse across discussions and news. Added showRawMode prop (raw HTML mode now admin-only)
  • GeändertDiscussion & 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
  • BehobenNews comment log events — posting or editing a news comment now logs news-comment-create and news-comment-edit events (was missing)
v2.12.12026-03-03
  • BehobenAssociate sharing bug — re-inviting an accepted associate on a new project incorrectly returned an "already associate" error instead of sharing the project
  • BehobenAssociate 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
  • BehobenProject settings centering — page was not centered due to missing container-narrow class
  • HinzugefügtAssociate empty states — each section (project associates, pending invitations, other associates) now shows an explicit message when empty
  • HinzugefügtSignup 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
  • HinzugefügtUser 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
  • HinzugefügtNews author display — news articles show "Published by {name}" with author avatar below the title. Author is automatically tracked when creating news
  • GeändertEmail templates — added VitaPulse logo (icon-192.png) in email header above the brand name for better visual identity
  • GeändertAssociate invite emails — include the inviter's avatar and name in a styled card
  • BehobenSecurity headers detection — response headers were extracted from redirect responses (301/302) instead of the final response (200), causing security headers like strict-transport-security to be incorrectly reported as missing. Now uses lhr.finalDisplayedUrl for URL matching and filters only 2xx responses
v2.11.02026-03-01
  • HinzugefügtGoogle Analytics 4 integration — GA4 tracking with SSR-compatible injection, SPA page view tracking on route changes, and custom events for key user actions (sign_up, login, quick_audit, project_create, scan_start, pdf_download, begin_checkout, contact form, share report). Configurable via GA_MEASUREMENT_ID environment variable
  • HinzugefügtSitemap generator cron — automated public/sitemap.xml generation with all static pages (11 routes × 3 locales with hreflang alternates) and dynamic news pages from database. Run via npm run sitemap or scheduled cron
  • HinzugefügtPublic news list page — new paginated /news page accessible without authentication, SEO-indexable with cover images, excerpts and pagination. News routes moved from /app/news/ to /news/ for better search engine visibility
  • HinzugefügtDynamic news back link — back button on news detail page dynamically adapts based on navigation history (returns to news list, dashboard or previous page)
  • HinzugefügtTipTap HTML raw mode — toggle button in the editor toolbar to switch between WYSIWYG and raw HTML editing, allowing direct HTML paste
  • HinzugefügtBlog link in footer — added Blog link in the Resources column of the footer
  • GeändertOptimized 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.)
  • GeändertVue Router navigation guard — migrated from deprecated next() callback to return-based API
  • BehobenTipTap duplicate extensions warning — disabled link and underline in StarterKit config since they are added separately with custom configuration
  • BehobenNews validation error messages — admin news creation/update now returns specific missing field names instead of generic error.validation
  • BehobenNewsDetailView comments crash — restored missing comments ref declaration
v2.10.02026-03-01
  • HinzugefügtEmail 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)
  • HinzugefügtEnriched 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
  • HinzugefügtSecurity alerts email helper — new renderSecurityAlerts() shared helper in emailLayout.js for displaying missing security headers with severity badges
  • HinzugefügtResponsive container widths — optimized Vuetify container max-widths for all breakpoints (92% at md, 1080px at lg, 1400px at xl, 1800px at xxl) with .container-narrow opt-out for form/centered pages
  • Hinzugefügt.form-narrow utility class — constrains form widths to 640px max, applied to ProjectSettingsView and ProjectNewView
  • GeändertUnified 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.
  • GeändertUpgraded Vuetify from 3.x to 4.0.0 — full Material Design 3 migration
  • GeändertMigrated all typography classes from MD2 to MD3 (text-h1→text-display-large, text-body-2→text-body-medium, text-caption→text-body-small, etc.)
  • GeändertMigrated VRow grid props (align → CSS class, densedensity="compact")
  • GeändertUpdated SCSS breakpoints to MD3 values (md: 840px, lg: 1145px, xl: 1545px, xxl: 2138px)
  • GeändertAdded xxl breakpoint mixin to SCSS design system
  • GeändertAdded CSS reset for headings/paragraphs to replace Vuetify 4's removed global reset
  • GeändertUpdated vue from 3.5.27 to 3.5.29
  • GeändertUpdated playwright from 1.58.1 to 1.58.2
  • GeändertUpdated cors from 2.8.5 to 2.8.6
  • GeändertUpdated vue-router from 4.6.4 to 5.0.3
  • GeändertUpdated mongodb from 6.21.0 to 7.1.0
  • GeändertUpdated nodemailer from 6.10.1 to 8.0.1
  • GeändertUpdated stripe from 14.25.0 to 20.4.0
  • GeändertUpdated @stripe/stripe-js from 3.5.0 to 8.8.0
  • BehobenEmail link colors — fixed link colors being overridden by email clients (Gmail, Outlook) using <span> wrapper technique
  • BehobenPending associates visibility — associates with pending status now appear in the project settings list instead of being hidden until they accept
  • BehobenNode watch paths — added src/translate/emails/ to --watch-path list for email template hot-reload in development
v2.9.02026-02-28
  • HinzugefügtSecurity vulnerabilities documentation page (/docs/vulnerabilities) with detailed guides for HTTP security headers, TLS/SSL, Lighthouse security audits, and software version exposure (26 vulnerabilities total)
  • HinzugefügtSeparate translation files for vulnerabilities (src/translate/vulnerabilities/en.json, fr.json)
  • HinzugefügtVulnerability detail view with route /docs/vulnerabilities/:id and breadcrumb navigation
  • HinzugefügtVulnerabilities listed in Docs page section #10 with severity chips and direct links
  • Hinzugefügt4 vulnerability categories: HTTP Security Headers (10), TLS/SSL Certificate (5), Lighthouse Security Audits (7), Software Version Exposure (4)
  • HinzugefügtSpanish language support (es.json, vulnerability translations, email templates, flag icon)
  • HinzugefügtCentralized locale configuration (SUPPORTED_LOCALES, LOCALE_CODES, getIntlLocale(), getOgLocale() in shared/const.js) — adding a new language only requires updating the single source of truth
  • HinzugefügtChangelog page now auto-generated from CHANGELOG.md — single source of truth, no duplication in translation files
  • GeändertRedesigned header action elements (language switcher, account, sign in) with consistent pill-style buttons using shared SCSS mixin
  • GeändertLanguage switcher now displays country flag emoji (🇬🇧/🇫🇷) with locale code, clearly interactive at rest
  • GeändertCTA buttons (Dashboard, Start Free) use rounded pill style for visual consistency
  • GeändertMobile drawer language buttons also show flag emojis
v2.8.32026-02-28
  • BehobenPDF section order now matches app tab order: Security → Quality → Performance → Resources → Advanced (Global → Framework → Critical Chains → Scripts Treemap → Audit Timing → Passed)
  • BehobenMoved runWarnings from after CWV to Advanced/Global section in PDF
  • BehobenMoved console to first position in Advanced section in PDF
  • BehobenAdded missing translation key scan.details.showAll (EN/FR)
v2.8.22026-02-28
  • GeändertMoved Server Response Time block from Advanced > Global to Performance tab (displayed before Opportunities/Diagnostics)
  • GeändertPDF report updated to match new Server Response Time placement
v2.8.12026-02-28
  • HinzugefügtAdvanced tab split into 6 sub-tabs: Global, Framework, Critical Chains, Scripts Treemap, Audit Timing, Passed
  • HinzugefügtNew components: ScanStackPacksSection, ScanCriticalChainsSection, ScanScriptTreemapSection, ScanAuditTimingSection
  • GeändertAdvanced > Global sub-tab: Console section displayed first, then Server Response Time, then remaining technical data
  • GeändertFixed console section scrollbar overflow (removed unnecessary max-height constraint)
  • BehobenConsole section displaying unwanted horizontal/vertical scrollbars
v2.8.02026-02-28
  • HinzugefügtHTTP response headers extraction from Lighthouse artifacts (NetworkRecords) during scans
  • HinzugefügtStandalone Security tab in scan results with four sub-tabs: "TLS Certificate", "Response Headers", "Software Versions" and "Lighthouse Audits"
  • HinzugefügtSecurity headers analysis: 10 critical headers checked (HSTS, CSP, X-Frame-Options, etc.) with present/missing status and risk severity levels (high/medium/low)
  • HinzugefügtFull response headers table in Security > Headers sub-tab
  • HinzugefügtTLS certificate analysis: protocol version, cipher suite, signature algorithm, issuer, expiration with warnings for weak/expired certificates
  • HinzugefügtSoftware versions detection from HTTP headers (Server, X-Powered-By), HTML content (CMS, meta generator, frameworks) and TLS protocol
  • HinzugefügtPDF report: security section now includes TLS certificate, response headers, software versions and Lighthouse security audits
  • HinzugefügtGlobal CSS gap utilities (.gap-1 to .gap-16) in design system — fixes all gap-* classes that were non-functional with Vuetify
  • HinzugefügtLighthouse scores sorted worst-to-best on scan details page and project overview page
  • HinzugefügtCore Web Vitals sorted worst-to-best on scan details page and project overview page
  • HinzugefügtQuick stats clickable: navigate to corresponding tab and sub-tab with smooth scroll
  • HinzugefügtPassed audits click scrolls directly to Passed section anchor within Advanced tab
  • GeändertScan result tabs reordered: Security → Quality → Performance → Resources → Advanced
  • GeändertSecurity tab is now the default selected tab on scan results
  • GeändertSecurity issues moved from Quality tab sub-tab to standalone Security tab
  • GeändertScan results overview layout reorganized: environment chips before quick-stats, screenshot in 3rd column
  • GeändertLoading timeline moved from overview to Resources tab (after stat-cards, before resources by type)
  • GeändertQuality tab reduced from 4 sub-tabs to 3 (accessibility, SEO, best practices)
v2.7.12026-02-28
  • GeändertRefactored project creation wizard: removed step 4 (scan progress), now redirects to project overview after creation where ScanProgressCard handles scan progress display
  • GeändertProject creation wizard reduced from 4 steps to 3 steps (Info → Pages → Alerts → Launch)
  • BehobenDashboard news section not displaying: NewsSection was reading data.news instead of data.items from API response
  • BehobenScan results: overview section extracted from tabs and displayed permanently between CWV and tab navigation
v2.7.02026-02-28
  • HinzugefügtLocalized URLs: all routes now prefixed with locale (/en/*, /fr/*)
  • HinzugefügtuseLocalePath composable for locale-aware navigation
  • HinzugefügtAutomatic locale detection from browser on first visit
  • HinzugefügtSEO: hreflang, canonical, og:locale, and Schema.org inLanguage in SSR
  • HinzugefügtLocale switcher updates URL path in real-time
  • HinzugefügtNews system: CRUD backend with bilingual content (FR/EN), cover image upload, sticky/homepage banner flags
  • HinzugefügtNews comments with moderation: users can post, edit own comments; admin approval workflow with pending/approved/rejected status
  • HinzugefügtComment rate limiting: configurable max comments per time window via admin settings
  • HinzugefügtAdmin news management: TipTap WYSIWYG editor, bilingual tabs, publish/draft, sticky and homepage banner controls
  • HinzugefügtAdmin comments moderation panel: approve, reject, delete comments with filters
  • HinzugefügtDashboard news section: latest 3 articles with unread badge and sticky indicator
  • HinzugefügtNews detail page with full content rendering and comments section
  • HinzugefügtHomepage news banner: dismissible gradient banner for featured articles
  • HinzugefügtIP tracking: user login IPs stored with history for security auditing
  • HinzugefügtUser blocking system: admin can block by account and/or IP addresses
  • HinzugefügtAdmin user detail: security section with block/unblock UI, IP history table with per-IP status and unblock action
  • HinzugefügtAdmin bypass: administrators exempt from all plan limits (projects, scans, associates, pages)
  • HinzugefügtFavicon: SVG/PNG/ICO with VitaPulse branding (gradient V + pulse line)
  • HinzugefügtNews publicly accessible: reading news and comments no longer requires authentication
  • HinzugefügtComment posting/editing still requires authentication, with "Sign in to comment" prompt for visitors
  • HinzugefügtCentralized event logging system: logEvent() helper, logs collection, admin logs page with search/filter/delete
  • HinzugefügtEvent logging instrumented across all endpoints: auth, projects, scans, billing, associates, admin, contact, quick audit, PDF download (40+ events)
  • HinzugefügtAdmin user detail: recent activity logs section with link to filtered logs page
  • HinzugefügtForgot password flow: email verification code, reset password page
  • HinzugefügtChange password: authenticated users can change password from account page
  • HinzugefügtAccount page: profile editing (name) and password change under /app/account
  • GeändertPricing FAQ completely rewritten with 20 comprehensive questions covering all features, plans, and capabilities
  • GeändertBackend-generated URLs (Stripe checkout, emails, Google Chat webhooks, share links) now include locale prefix
  • GeändertAdmin user detail page shows IP history and blocking controls
  • GeändertSCSS design system: all hardcoded hex colors, border-radius, font-size, font-weight replaced with variables across 30+ files
  • GeändertNew SCSS mixins: hover-row, hover-lift, hover-light-on-dark, link-on-dark, link-primary for consistent hover effects
  • GeändertRemoved unused SCSS mixins (status-good/warning/error, score-gauge)
  • GeändertAdded $border-radius-xs, $gradient-dark-diagonal SCSS variables
  • GeändertFavicon and apple-touch-icon now use relative paths (fixes cross-origin issues in dev)
  • GeändertRemoved orphan src/views/auth/ directory (duplicate of src/views/Auth/)
  • GeändertRefactored: auth page SCSS extracted to global .auth-page class in _components.scss
  • GeändertRefactored: getEventColor/getEventCategory/formatLogMeta extracted to useLogUtils composable
  • GeändertRefactored: business downgrade logic extracted to handleBusinessDowngrade() in dbHelpers.js
  • GeändertRefactored: inline URL truncation styles replaced with .admin-url-truncate SCSS class
  • GeändertLogger logEvent() changed to fire-and-forget with .catch(() => {}) (no more async/await)
  • SicherheitObjectId validation added to all news/comments API endpoints
  • SicherheitObjectId.isValid() validation added to all API endpoints accepting ID parameters (17+ routes)
  • SicherheitError logging (console.error) added to all catch blocks across the entire API (15+ files)
  • SicherheitBlocked users/IPs rejected at login with appropriate error messages
  • SicherheitMongoDB projection added to user query in lighthouse.js to exclude password hash
  • SicherheitWebhook error responses standardized to JSON format
  • SicherheitsetReference race condition fixed with atomic bulkWrite operation
  • BehobenHardcoded French progress messages in scan store replaced with i18n keys (scan.progress.*)
  • BehobenDefault locale inconsistency: backend now uses DEFAULT_LOCALE ('en') everywhere instead of mixed 'fr'/'en'
  • BehobenHardcoded French in useDateFormat.js replaced with i18n keys (dashboard.fewSeconds, dashboard.days)
  • BehobenDefault locale for formatDateShort/formatDateFull changed from 'fr-FR' to 'en-US'
  • BehobenScan status colors centralized in SCAN_STATUS_COLORS constant (removed duplication in 3 admin views)
  • BehobenObjectId validation added to findUserOrSharedProject helper (prevents crash on invalid IDs)
  • BehobenCron notifications now log warnings on failure instead of silently swallowing errors
  • BehobenCron scheduled scans now validate project.url before launching scan
  • BehobenTiptapEditor image upload now handles fetch errors and checks res.ok
  • BehobenUnused shallowRef import removed from NewsDetailView
  • BehobenUnused mdiEyeOff import removed from AdminNewsEditView
v2.6.12026-02-27
  • GeändertCWV tooltips on scan detail page now show per-metric descriptions matching project overview page
  • GeändertRemoved non-functional expandable CWV cards on scan detail page
  • GeändertAdded spacing between Mobile/Desktop toggle buttons
  • GeändertRemoved share report button from scan detail page
v2.6.02026-02-27
  • HinzugefügtPlan upgrade/downgrade with Stripe proration (Pro ↔ Business, monthly ↔ yearly)
  • HinzugefügtUpgrade preview dialog showing prorated amount before confirmation
  • HinzugefügtWebhook handler for customer.subscription.updated as backup sync
  • HinzugefügtCheckout guard preventing duplicate subscriptions
  • HinzugefügtProject screenshot thumbnail on dashboard cards and project overview header
  • HinzugefügtPlaceholder image for projects without scans (VitaPulse branded SVG)
  • GeändertUpgrade button in Billing page now opens inline preview dialog instead of redirecting to pricing
  • GeändertPricing page buttons adapt for existing subscribers (upgrade, downgrade, cycle change)
  • GeändertDowngrade from Business automatically revokes associates
  • GeändertAdmin downgrade from Business now properly revokes associates and cleans shared projects
v2.5.12026-02-27
  • HinzugefügtAssociates can now view project settings in read-only mode
  • HinzugefügtAssociates can manage their own email notification preferences (scan results and regression alerts) based on their plan
  • HinzugefügtAssociate notification emails are sent after each scan completion
v2.5.02026-02-27
  • GeändertCase Studies page: fixed all section-to-page mappings to match actual PDF content (16 sections for 28 pages)
  • GeändertCase Studies page: corrected metrics values (mobile 82, desktop 78)
  • GeändertDocumentation page: complete rebuild with comprehensive VitaPulse user guide (10 sections: Quick Audit, Projects, Scans, Scores, CWV, Opportunities, Regressions, PDF Reports, Associates, Plans)
  • GeändertDocumentation page: added quick start cards, table of contents, and screenshot illustrations
  • GeändertLanding page: enhanced features section with 6 benefit cards and 4 illustrated feature showcases
  • GeändertChangelog page: complete rewrite with full version history (v1.0.0 to v2.4.0)
  • GeändertSecurity page: updated with VitaPulse-specific security practices and technical details
  • GeändertTerms of Service: comprehensive rewrite with 12 sections covering SaaS-specific terms
  • GeändertPrivacy Policy: GDPR-compliant rewrite with detailed data collection, storage, and rights information
  • GeändertCookie Policy: rewritten to reflect actual minimal cookie usage (single session cookie)
  • EntferntAPI documentation page and route (no public API)
  • EntferntBlog page link from footer (no blog content)
  • EntferntStatus page link from footer
v2.4.12026-02-26
  • GeändertProject settings page: split into tabs (Settings / Associates) for Business plan users
  • GeändertDashboard: search field and project filter now on the same line
  • BehobenAssociates tab not switching (missing activeTab ref)
  • BehobenInvite button not vertically centered next to email input
v2.4.02026-02-26
  • HinzugefügtAssociates system for Business plan users: invite up to 5 associates by email to share project access
  • HinzugefügtAssociates management section in project settings (invite, share, remove per project)
  • HinzugefügtDashboard filter (All / My projects / Shared with me) with shared badge showing owner name
  • HinzugefügtEmail invitation templates for associates (existing user + new user) in EN/FR
  • HinzugefügtAutomatic project linking when invited associate registers a new account
  • HinzugefügtAssociate access inheritance: associates inherit PDF download and report sharing capabilities from project owner's plan
  • HinzugefügtScan ownership awareness: project owners can manage scans launched by associates
  • HinzugefügtAutomatic associate revocation on plan downgrade (Business → Pro/Free)
v2.3.22026-02-26
  • BehobenGlobal button spacing: adjacent buttons in card actions are no longer visually stuck together
  • BehobenCWV history chart now auto-rebuilds project stats from existing scans when collection is empty
v2.3.12026-02-22
  • BehobenAdmin scores display not showing due to per-device nested data structure
  • BehobenAdmin CWV table empty due to same nested structure issue
  • BehobenScan detail page now shows scores and CWV per device with mobile/desktop toggle
v2.3.02026-02-22
  • HinzugefügtAdmin user detail page with editable plan, type, name, company
  • HinzugefügtUser projects list in admin user detail
  • HinzugefügtClickable rows in admin users table
  • HinzugefügtAdmin project detail page with editable name, URL, scan frequency
  • HinzugefügtProject scans list in admin project detail with status, score, device
  • HinzugefügtClickable project rows in admin projects list and user detail
  • HinzugefügtLink to project owner from project detail page
  • HinzugefügtAdmin scan detail page with scores, CWV, regressions display
  • HinzugefügtEditable scan status and reference flag from admin
  • HinzugefügtAdmin scan delete with confirmation dialog
  • HinzugefügtClickable scan rows in admin scans list and project detail
  • HinzugefügtLinks to owner and project from scan detail page
v2.2.12026-02-22
  • BehobenLanding page hero section alignment and height
v2.2.02026-02-22
  • HinzugefügtUser type field (user default, admin manual) for role-based access
  • HinzugefügtAdmin dashboard with user listing (email, plan, projects, scans, registration date)
  • HinzugefügtAdmin projects page listing all projects with owner, scan count, latest score
  • HinzugefügtAdmin scans page listing 200 most recent scans with project, owner, status, score, duration
  • HinzugefügtrequireAdmin middleware for admin-only API endpoints
  • HinzugefügtAdmin menu in header (crown icon) visible only for admin users
  • HinzugefügtAdmin route guard (requiresAdmin) on frontend router
  • GeändertCWV history chart now uses dedicated projectStats collection with incremental aggregation instead of paginated scan data
  • GeändertStats are pushed to projectStats on each scan completion (no cron needed)
  • GeändertNew GET /api/projects/:id/stats endpoint for lightweight chart data
v2.1.02026-02-21
  • Hinzugefügt"Set as reference" action on scan details page with isReference badge display
  • HinzugefügtNetwork requests table in Resources tab (URL, type, protocol, status, transfer/resource size, priority)
  • HinzugefügtMain thread time column in third-party summary table
  • HinzugefügtParse/Compile column in script bootup table
  • HinzugefügtOverview stat cards in Resources tab (requests, transferred, third parties count, JS libraries count)
  • HinzugefügtShow more/less toggle on script bootup, third-party, and network requests tables
  • HinzugefügtCore Web Vitals history chart (Plotly) on project overview page, visible when at least 2 completed scans exist
  • GeändertMerged "Insights" tab into "Performance" tab (opportunities + diagnostics + insights)
  • GeändertMerged "Technical", "Console", and "Passed" tabs into a single "Advanced" tab
  • GeändertReplaced v-btn-toggle navigation with v-tabs for scan result sections
  • GeändertRedesigned Resources tab with section headers, sorted resource bars, and detailed tables
  • GeändertThird-party section now displays data directly from thirdPartySummary with entity name and main thread time
  • GeändertReplaced networkSummary (aggregate) with detailed networkRequests table
  • GeändertRegression detection now prioritizes scans marked as isReference before falling back to latest scan
  • GeändertSynchronized 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
  • HinzugefügtComprehensive 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)
  • HinzugefügtCase studies page with real audit data from www.e-xode.net (23-page PDF, per-page screenshots, key metrics, takeaways)
  • HinzugefügtComplete i18n localization system with createT(locale) server-side translation resolver
  • HinzugefügtShared component library: 13 reusable components extracted (AlertError, ConfirmDialog, DataTable, EmptyState, LoadingSpinner, PageHeader, ScoreCircle, ScanProgressCard, SearchInput, SectionCard, StatCard, StatusChip, UpgradeCta)
  • HinzugefügtShared utilities module (shared/utils.js) with escapeHtml, formatBytes, formatMs, getScoreColor, getScoreLabel, getScoreBg, getCwvStatus, getCwvColor, formatCwvValue
  • HinzugefügtShared constants module (shared/const.js) with DEVICES, CWV_METRICS, INSIGHTS_FAILING_THRESHOLD, SCAN_DATA_FIELDS
  • HinzugefügtShared database helpers (shared/dbHelpers.js) for MongoDB operations
  • HinzugefügtShared API client (shared/api.js) with centralized error handling
  • HinzugefügtRate limiting on all API endpoints with configurable windows
  • HinzugefügtSession management with automatic cleanup on dev startup
  • HinzugefügtVersion number displayed in application footer
  • HinzugefügtPDF White Label mode for Business plan users
  • HinzugefügtApp version exposed via Vite define for frontend access
  • GeändertRewrote pdfTemplate.js (~580 lines) with all scan data sections, matching app UX/design (brand gradient, score colors, impact badges, CWV thresholds)
  • GeändertRewrote downloadPdf.js with comprehensive preparePdfData() extracting all 35+ scan data fields per device
  • GeändertRefactored all Pinia stores to use shared utilities and constants
  • GeändertRefactored all API endpoints to use shared database helpers and middleware
  • GeändertUpdated all Vue components to use shared component library
  • GeändertMigrated all hardcoded strings to i18n translation files (en.json, fr.json)
  • GeändertUpdated entry-server.js with i18n-aware SSR (getRouteMeta, generateMetaTags, getSchemaMarkup)
  • GeändertUpdated index.html with <!--app-lang--> placeholder for dynamic lang attribute
  • GeändertRewrote CaseStudiesView.vue with real audit content and PDF page screenshots
  • GeändertImproved error handling across all API routes with safe JSON parsing
  • BehobenSecurity audit: input validation, authorization checks, rate limiting on all endpoints
  • BehobenData parity between scan storage and display fields
  • BehobenDocker and Playwright configuration for PDF generation
  • BehobenSession cleanup preventing stale session file accumulation
  • BehobenRate limiting configuration for different endpoint categories
  • BehobenSSR hydration for localized meta tags and schema markup
  • BehobenTranslation key consistency across all components
  • SicherheitAdded requireAuth middleware on all protected routes
  • SicherheitAdded input sanitization with escapeHtml utility
  • SicherheitEnforced ownership checks on scan/project access
  • SicherheitConfigured Helmet CSP and CORS policies
  • SicherheitAdded rate limiting per API category (auth, scans, general)
v1.3.02026-02-10
  • HinzugefügtCase studies page showcasing VitaPulse audit capabilities
  • HinzugefügtGitHub Actions workflow for CI testing
  • GeändertLayout improvements across all views
  • GeändertTranslation updates for all supported locales
  • GeändertMajor layout and code refactoring
v1.2.02026-02-07
  • HinzugefügtCoupon management system for Stripe payments
  • HinzugefügtQuick audit rate limiting (max audits per plan)
  • HinzugefügtAutomated cron jobs for data pruning
  • HinzugefügtEmail notifications with scoring reports
  • HinzugefügtMulti-page scan support
  • GeändertPricing logic refactored with plan-based feature gating
  • GeändertHeader theme improvements
  • GeändertReport results display fixes
  • BehobenDocker environment variables for Stripe integration
  • BehobenTranslation consistency issues
v1.1.02026-02-06
  • HinzugefügtPDF report export with Chromium rendering
  • HinzugefügtSEO optimizations (meta tags, schema markup, sitemap)
  • HinzugefügtScan animation and progress indicators
  • HinzugefügtCSS design system with variables and mixins
  • HinzugefügtDetailed audit results display (8 tabbed sections)
  • HinzugefügtNew project creation workflow with guided steps
  • GeändertFactorized scan animation components
  • GeändertServer-side rendering fixes for Vue Router
  • BehobenTranslation loading and fallback behavior
  • BehobenServer rendering hydration issues
v1.0.02026-02-04
  • HinzugefügtInitial release of VitaPulse platform
  • HinzugefügtLighthouse 12 audit engine integration
  • HinzugefügtCore Web Vitals monitoring (LCP, FCP, CLS, TBT, INP, TTFB, Speed Index, TTI)
  • HinzugefügtMobile and desktop device analysis
  • HinzugefügtPerformance, Accessibility, Best Practices and SEO scoring
  • HinzugefügtStripe payment integration with Pro and Business plans
  • HinzugefügtUser authentication with email verification
  • HinzugefügtLegal pages (Terms, Privacy, Cookies)
  • HinzugefügtCORS and security configuration
  • HinzugefügtDocker containerization with docker-compose