No publicado
Security
- T1 — HMAC invite tokens pour les témoignages — Le lien d'invitation témoignage n'apparaît plus dans le HTML public. Le
TESTIMONIAL_SUBMIT_TOKENn'est jamais exposé dans une URL. Le système utilise désormais un jeton HMAC dérivé (HMAC-SHA256(secret, "testimonial-invite:" + exp)) avec date d'expiration. Un endpoint admin (POST /api/admin/testimonial-invite, auth BearerADMIN_PASSWORD) génère les liens privés à durée limitée (défaut 7 j, max 30 j). La page/testimonial-submitvalide le token HMAC côté serveur avectimingSafeEqual. - Audit sécurité/perf/i18n (juillet 2026) — Menu mobile rendu non focusable au clavier quand fermé (
inert, corrige une violation WCAG 4.1.2 détectée par Lighthouse CI).dependabot.ymletCODEOWNERSpointaient vers un sous-dossier/portfolio/inexistant depuis une restructuration antérieure du repo : les mises à jour npm automatiques et la review obligatoire sur les fichiers sensibles (proxy.ts,app/api/,app/admin/,lib/ratelimit.ts…) ne s'appliquaient plus, corrigé. Alerte Dependabot GHSA-h67p-54hq-rp68 (js-yaml, DoS) corrigée via un override scopé àgray-matter(^3.15.0, reste dans la branche 3.x qui conserve l'APIsafeLoadrequise par gray-matter) plutôt qu'un saut vers la 4.x qui avait cassé le build lors d'une tentative précédente. Force-push désactivé surmain.tailwindcss/@tailwindcss/*ajoutés à la liste d'ignore Dependabot pour les majors (la v4 change le plugin PostCSS et casse le build).
Added
- T3 — JSON-LD
ProfessionalServicesur/work-with-me— Données structurées Schema.org pour le référencement freelance. InclutserviceType,areaServed(pays + « Worldwide »),availableLanguage,workLocation: VirtualLocation. SanspriceRangenioffers.price(décision D2). - T4 — Workflow GitHub Actions
drift-check.yml— Vérification quotidienne (06:00 UTC) + déclenchement manuel : (1) compare le SHA HEAD de main avec le déploiement de production Vercel, (2) contrôle la fraîcheur des données de monitoring (champlastStoredCheckAtde/api/health, seuil 48 h). Émet::error::si dérive détectée,::warning::si monitoring stale. Gracieusement inactif siVERCEL_TOKENouNEXT_PUBLIC_SITE_URLne sont pas configurés. - Page contact dédiée avec métadonnées SEO propres. Onglet « All » sur la page Projects (les deux tracks Salesforce/IT Ops). Menu déroulant Projects dans la nav desktop avec projets à la une. Lien GitHub dans le footer et la nav mobile. Images Open Graph spécifiques par page (
/contact,/work-with-me). JSON-LDBreadcrumbListsur toutes les pages de premier niveau. Squelette de locale espagnole préparé (messages/es.json+messages/es.README.md) — non activé publiquement, traduction réelle à faire avant mise en ligne.
Changed
- T2 — Garde de fraîcheur sur la page Statut — Bannière d'avertissement amber si les données de monitoring dépassent 48 h (
/status). Timeout Formspree réduit de 4 s à 2 s danslib/health.tspour ne pas retarder le cron./api/healthexpose un nouveau champlastStoredCheckAt(timestamp du dernier run du cron stocké en Supabase/Redis) — consommé par T4. - Disponibilité mise à jour : « Disponible dès maintenant » remplace la mention « août 2026 » (meta descriptions, page Work with me, objectifs 2026), FR et EN. Schéma JSON-LD des pages projet :
SoftwareApplicationremplacé parCreativeWork(plus juste sémantiquement pour des études de cas). Modales Calendly et Disponibilité chargées en lazy import sur la page d'accueil (améliore le score Lighthouse Performance mobile). Enrichissement itératif du schema.orgPerson(adresse, description) et des meta descriptions (mots-clés géographiques et de rôle). Diplômes de certification convertis en WebP (réduction de poids de 91 à 94 %).
Fixed
- Redirection corrigée pour un slug de projet erroné (iDEM Connect). Redirections
/mentions-legales→/legal,/contact,/rss.xml. Liens et images de badges de certification corrigés. CTA avec repli propre quand Calendly est indisponible ; placeholders de témoignages retirés. Mentions « Provence-Alpes-Côte d'Azur » harmonisées (remplacent « PACA ») et modes de travail (100 % remote/hybride/sur site + mobilité) alignés sur toutes les pages et les 4 CV. Locale explicite (fr-FR/en-US) dansAnimatedCounter. Titre de projet bilingue dans le script de seed pour éviter qu'un futur reseed n'écrase les traductions FR déjà en base. Seuil de couverture Jest rendu honnête (mesuré sur l'ensemble du code viacoverageProvider: "v8", pas seulement les fichiers déjà testés).
Planned
- LinkedIn recommendations / testimonials (pending responses from colleagues)