Dashboard utilisateur — carte profil unifiée et grille épurée
La page /account/home a été retravaillée. Le profil (avatar, prénom, badge "Compte Pro/Gratuit") et l'activité du compte (statut Recruteur, statut Candidat) tiennent maintenant dans une seule carte unifiée plutôt que deux blocs séparés mal alignés. Les statuts s'affichent en tuiles horizontales compactes avec icône à gauche, compteur en gras et libellé court — vous voyez d'un coup d'œil "1 annonce active", "Profil candidat actif", etc. La grille des raccourcis (favoris, messagerie, recherches sauvegardées…) reste inchangée mais les cartes spéciales "Comment ça marche ?" et "Offre Pro" passent désormais en fin de grille au lieu d'apparaître en tête sur mobile.
ImpactCôté visuel : alignement général sur les tokens du design system (border douce soft-border, halos décoratifs en tokens chart-* du theme plutôt qu'en couleurs hardcodées), suppression des décorations incohérentes entre clair/sombre. Côté navigation : les actions principales du compte sont mises en avant, et l'invitation à passer Pro reste visible mais ne court-circuite plus le flow. Le bouton Admin a été retiré (n'était pas relié à une page) et l'icône de l'offre Pro est passée de la couronne à l'étoile (Sparkles), convention plus moderne pour un upgrade payant.
Refonte du menu mobile
Le panneau qui s'ouvre depuis le bouton burger en mobile a été entièrement repensé. Plus de liste plate à bordures : les actions sont regroupées en sections distinctes (navigation principale puis "Mon espace" pour les utilisateurs connectés), avec des icônes en pastille colorée et un séparateur sober entre les blocs.
ImpactQuand vous êtes connecté, votre avatar et votre prénom ouvrent désormais "Mon espace" en tête de section, suivis de vos raccourcis personnels (favoris, messages, recherches sauvegardées, abonnement). Les badges de messages non lus sont plus lisibles. La déconnexion reste discrète au repos et ne se colore en rouge qu'au moment où vous la survolez. Côté visiteur non connecté, "Se connecter" et "Créer un compte" prennent naturellement la place de "Mon espace" dans la même position pour une lecture symétrique.
Icônes brand officielles partout, et X remplace Twitter
Généralisation de la bibliothèque d'icônes brand introduite il y a quelques jours : les composants partagés (grille d'icônes des cards, formulaire de coordonnées, modale de contact, bandeau de partage) utilisent désormais les vrais logos officiels au lieu des icônes génériques. Twitter a été retiré de l'interface au profit de X (logo et libellé).
ImpactSur les cards d'offres et de candidats, les pastilles de réseaux sociaux et de coordonnées affichent les couleurs officielles des marques, avec un état désactivé (opacité réduite) quand l'information n'est pas renseignée. Le formulaire de saisie des coordonnées d'une page entreprise affiche les mêmes logos. Quelques boutons de partage qui utilisent un fond coloré (par exemple le bouton "Partager sur Facebook") restent lisibles grâce à une variante monochrome du logo.
Environnement Docker de développement allégé et plus rapide à reconstruire
Refonte des Dockerfiles et de l'orchestration des trois services backend en local (api, background-job-runner, websocket). Chaque image n'installe désormais que les dépendances réellement consommées par son service grâce au filtrage pnpm par chaîne de packages, au lieu d'embarquer tout le monorepo. Le téléchargement des paquets est mis en cache BuildKit entre les rebuilds, et la découverte des manifests package.json passe en glob automatique (COPY --parents) — plus besoin d'éditer trois Dockerfiles à chaque ajout d'un nouveau package partagé. Les commandes docker:dev:build, :rebuild, et leurs équivalents int-test / e2e-test ont été harmonisées sur un même pattern propre (stop → rm -fv → up) qui ne laisse plus traîner de volumes orphelins.
ImpactAucun changement visible côté utilisateur. Côté équipe, les images Docker de dev passent de ~3 Go à 1,3-1,8 Go chacune selon le service, le rebuild d'une image avec dépendances inchangées tombe de plusieurs minutes à quelques secondes (cache pnpm chaud), et l'onboarding d'un nouveau dev sur le repo demande maintenant nettement moins de disque et d'attente. Au passage, ~96 Go de volumes Docker orphelins ont été nettoyés sur les machines locales — héritage d'un filtre de prune qui ne matchait jamais les volumes anonymes générés par compose, désormais corrigé en amont.
Module Médias — couverture de tests complète sur le cycle de vie des fichiers
Ajout de la suite de tests automatisés pour le module Media dont les fondations avaient été posées la veille. Sept commandes critiques sont maintenant testées à deux niveaux : unitaire (la logique métier en isolation, rapide) et intégration (avec une vraie base de données Postgres et un faux S3 via MinIO, plus lent mais représentatif). Sont couverts : la demande d'upload, l'extraction des métadonnées d'image et de PDF, la génération de vignettes, le marquage des orphelins, la suppression des fichiers expirés et l'abandon des uploads inachevés. Trois jeux de fixtures partagés (base de données, MinIO, données métier) factorisent la mise en place de chaque scénario. Une stack Docker dédiée aux tests end-to-end a aussi été créée, séparée de celle des tests d'intégration, pour pouvoir faire tourner les deux en parallèle sans collision de ports.
ImpactLe module Media est maintenant prêt à être branché aux vrais flux du site (avatars, photos d'offres, documents) avec un filet de sécurité solide : toute régression sur la suppression des fichiers orphelins ou la génération des vignettes sera détectée avant le déploiement. C'est l'étape qui débloque l'enchaînement des features dépendantes du stockage centralisé.
Mise à jour de Node.js vers la version 24
Bascule de l'ensemble du backend (les trois services applicatifs et les packages partagés du monorepo) ainsi que des deux frontends sur Node.js 24, la dernière version LTS. Les images Docker de développement et de production tirent désormais node:24-alpine, le pipeline d'intégration continue a été aligné, et un fichier .nvmrc a été ajouté pour que chaque dev passe automatiquement sur la bonne version au moment où il rentre dans le repo. Les types @types/node et la cible TypeScript ont été mis à jour en conséquence.
ImpactAucun changement visible côté utilisateur. Côté technique, on récupère plusieurs années d'optimisations du moteur V8 (gain de performances mesurable sur les opérations cryptographiques et les streams), un fetch natif stabilisé, et les correctifs de sécurité les plus récents. Surtout, ça remet la chaîne d'outils au niveau des versions supportées sur le long terme, ce qui simplifiera les prochaines mises à jour de dépendances.