đŸ—“ïž Cas d’utilisation CV-builder

Note

đŸ“ș Diagrammes SVG de ce document

Vue interactive : index.html

🔎 DĂ©tail 2TUP par cas d’utilisation : chaque fiche UC ci-dessous pointe vers sa page details/ucNN.adoc (diagramme de sĂ©quence du scĂ©nario nominal + liens vers tous les diagrammes 2TUP : activitĂ©, Ă©tats, communication, classes, composants, architectures, dĂ©ploiement).

Fidélité au code : ces 19 UC correspondent aux fonctionnalités réellement implémentées dans clarajob-front-api (Spring WebFlux) et clarajob-front-gui (Vue 3). Les participants cités (classes, endpoints) existent dans le code source.

Phase 0 : Étude PrĂ©alable

Acteurs identifiés :

  • Candidat (Job Seeker) : crĂ©e, Ă©dite, exporte et partage ses CV — authentifiĂ© via Keycloak (JWT)

  • Visiteur : consulte un CV partagĂ© via un lien public (/cv/{token}) — sans authentification

  • Admin : configure le plafond de versions par CV (/cv-documents/admin/config, rĂŽle ADMIN)

  • SystĂšme : sauvegarde automatique (deep watch dĂ©bouncĂ© 2 s cĂŽtĂ© client)

  • IA gĂ©nĂ©rative (externe) : Gemini ou Groq selon clarajob.ai.provider — gĂ©nĂ©ration, structuration d’imports, chat Clara, reformulation

Limites du systĂšme :

  • Scope : CV-builder de ClaraJob — SPA sur la route unique /cv-builder (16 Ă©crans internes via ?screen=), API REST /api/v1

  • Interface : Web uniquement ; l’export PDF s’exĂ©cute dans le navigateur (window.print())

  • DonnĂ©es : documents CV dans MongoDB (collections cvDocuments, cvDocumentVersions, cvVariants, appConfig) ; le contenu du CV est un blob data schemaless. PostgreSQL ne stocke aucune table CV (uniquement le rĂ©fĂ©rentiel utilisateur et les CV-fichiers uploadĂ©s resumes). Les fichiers uploadĂ©s (PDF importĂ©s) vont dans MinIO (S3)

  • Hors pĂ©rimĂštre (maquettes « coming soon » sans backend) : collaboration, prĂ©paration d’entretien, extras premium, analytics de partage


Phase 1 : Identification des Cas d’Utilisation

📊 Diagramme de Cas d’Utilisation Complet

Diagramme UML - Cas d’Utilisation CV-Builder

Légende du diagramme :

  • Les personnages reprĂ©sentent les acteurs (Candidat, Visiteur, Admin, SystĂšme)

  • Les ellipses reprĂ©sentent les 19 cas d’utilisation, colorĂ©es par domaine fonctionnel

  • Les traits pleins sont les associations acteur ↔ cas d’utilisation

  • Les flĂšches pointillĂ©es sont les dĂ©pendances «include» / «extend»

🔄 User Journey - Flux Complet

User Journey - Flux de crĂ©ation d’un CV

Phases réelles du parcours :

  1. DÉMARRAGE — Ă©cran d’accueil (?screen=init) : wizard Clara, import PDF, import profil, ou reprise d’un CV rĂ©cent

  2. ÉDITION — workspace : 8 sections typĂ©es + sections personnalisĂ©es, aperçu live (300 ms), autosave (2 s)

  3. DESIGN — galerie de templates (57 layouts × 20 palettes), couleur, police, espacement

  4. OPTIMISATION — score & conseils, chat Clara, reformulation IA, adaptation à une offre

  5. SORTIE — aperçu paginĂ© A4, export PDF (impression navigateur), partage par lien, versions

🔗 DĂ©pendances entre Use Cases

Diagramme de Dépendances - include/extends/require

Types de relations :

  • Include (→) : le use case A exĂ©cute B de maniĂšre systĂ©matique

  • Extends (⇱) : le use case C ajoute une variante optionnelle Ă  D

  • Require (→) : le use case E requiert que F ait Ă©tĂ© exĂ©cutĂ© avant


Phase 1 : Description DĂ©taillĂ©e des Cas d’Utilisation

📄 Gestion des CV

Diagramme - Gestion des CV (UC01-UC05)
UC1 : Créer un CV depuis zéro

Acteur

Candidat (+ IA générative)

Préconditions

Utilisateur authentifié (Keycloak)

Flux Principal

1. Le candidat lance le wizard Clara (ScratchWizardModal, 3 Ă©tapes) 2. Il choisit un secteur (9), un niveau d’expĂ©rience (4) et un ton (4), avec texte libre optionnel 3. Le systĂšme appelle POST /api/v1/ai/generate-cv (CvGenerationService → GeminiClient, JSON mode, 8192 tokens) 4. Le CV complet gĂ©nĂ©rĂ© alimente cvData dans le store 5. createNewCv() persiste le document (POST /api/v1/cv-documents) 6. Le candidat est redirigĂ© vers l’Ă©diteur (?screen=workspace&cv={id})

Flux Alternatif

A1 : partir d’un CV vierge sans passer par le wizard

Flux Exception

E1 : rĂ©ponse IA non parsable → 502, le wizard reste ouvert E2 : quota/erreur IA → 429, message d’attente

Postconditions

Document cvDocuments créé (layout minimal, couleur #FF4D2E par défaut), éditable

UC2 : Importer un CV PDF

Acteur

Candidat (+ IA générative)

Préconditions

Utilisateur authentifiĂ© ; fichier PDF ≀ 60 Mo

Flux Principal

1. Le candidat dĂ©pose un PDF (Ă©cran d’accueil ou chat Clara) 2. ContrĂŽle local validatePdfSize() (type application/pdf, ≀ 60 Mo) 3. Upload vers MinIO sous resumes/{userId}/
 4. POST /api/v1/cv-documents/import-pdf avec l'`objectKey` 5. CvImportService : tĂ©lĂ©chargement MinIO → extraction texte (PDFBox, boundedElastic) 6. Structuration IA (generateJson + STRUCTURATION_PROMPT, 120 000 tokens max) 7. Normalisation (normalizeImportedData : ids, dĂ©fauts) et crĂ©ation du document « CV importĂ© »

Flux Exception

E1 : fileKey hors de resumes/{userId}/ → « Not authorized » E2 : JSON tronquĂ© → rĂ©paration attemptFixTruncatedJson

Postconditions

CV prĂ©-rempli ouvert dans l’Ă©diteur

UC3 : Importer depuis le profil ClaraJob

Acteur

Candidat

Préconditions

Utilisateur authentifié, profil renseigné

Flux Principal

1. Le candidat clique « Importer depuis mon profil » 2. POST /api/v1/cv-documents/import-profile 3. CvImportService charge User + UserSkill et construit : identité, résumé (bio), compétences 4. Si un CV-fichier est attaché au profil (resumeUrl) : import PDF (UC02) puis fusion mergeCvData (les données du profil priment) 5. Création du document « CV depuis profil »

Flux Exception

E1 : Ă©chec de l’import du PDF attachĂ© → repli non bloquant sur les seules donnĂ©es du profil

Postconditions

CV créé ; expĂ©riences/formations vides si aucun PDF n’a pu ĂȘtre fusionnĂ©

UC4 : Consulter mes CV

Acteur

Candidat

Préconditions

Utilisateur authentifié

Flux Principal

1. Le candidat ouvre « Mes CV » (?screen=list) 2. GET /api/v1/cv-documents/me retourne les documents de l’utilisateur 3. L’Ă©cran affiche titre, dates, pourcentage de complĂ©tude (calcul client) 4. Recherche et filtres cĂŽtĂ© client ; clic → ouverture dans l’Ă©diteur

Flux Alternatif

A1 : filtre par statut d’affichage ou CV rĂ©cents

Flux Exception

E1 : aucun CV → renvoi vers l’Ă©cran d’accueil (UC01–UC03)

Postconditions

Le CV sélectionné est chargé dans le store (loadExistingCv)

UC5 : Supprimer un CV

Acteur

Candidat

Préconditions

CV existant appartenant au candidat

Flux Principal

1. Le candidat clique « Supprimer » et confirme 2. DELETE /api/v1/cv-documents/{id} 3. CvDocumentService.delete vĂ©rifie l’appartenance (userId) puis supprime le document 4. Le CV disparaĂźt de la liste

Flux Exception

E1 : CV d’un autre utilisateur → DomainException « Not authorized »

Postconditions

Suppression définitive (pas de corbeille, pas de soft delete)


🎹 Édition du contenu

Diagramme - Édition du contenu (UC06-UC07)
UC6 : Modifier le contenu du CV

Acteur

Candidat

Préconditions

CV ouvert dans le workspace

Flux Principal

1. Le candidat Ă©dite une des 8 sections typĂ©es (identitĂ©, accroche, expĂ©riences, formations, compĂ©tences, langues, projets, certifications) via son formulaire dĂ©diĂ© 2. Les champs riches utilisent l’Ă©diteur TipTap (RichTextEditor) 3. Chaque saisie mute cvData dans le store ; l’aperçu live se rafraĂźchit en 300 ms 4. Include UC19 : l’autosave dĂ©bouncĂ© (2 s) persiste le document (PUT /api/v1/cv-documents/{id})

Flux Alternatif

A1 : ajouter/supprimer une section personnalisée (customSections dans data) A2 : compétences avec 4 dimensions notées (niveau, plaisir, ancienneté, potentiel) et 8 catégories

Flux Exception

E1 : CV sans id (jamais persistĂ©) → crĂ©ation au premier autosave

Postconditions

Contenu Ă  jour dans MongoDB (blob data du document)

UC7 : Réorganiser et masquer les sections

Acteur

Candidat

Préconditions

CV ouvert dans le workspace

Flux Principal

1. Le candidat glisse-dĂ©pose les sections (SectionOrderControl, sortablejs) 2. La section identitĂ© est verrouillĂ©e en position 0 3. Interrupteurs de visibilitĂ© par section (SectionVisibilityControl → hiddenSections) 4. sectionOrder/hiddenSections sont enregistrĂ©s dans data via l’autosave (UC19)

Postconditions

Ordre et visibilité appliqués à tous les rendus (aperçu, export, partage)


🎯 Templates & Design

Diagramme - Templates & Design (UC08-UC09)
UC8 : Choisir un template

Acteur

Candidat

Préconditions

CV en cours d’Ă©dition

Flux Principal

1. Le candidat ouvre la galerie (?screen=templates) 2. generateTemplates() produit 57 layouts × 20 palettes = 1140 combinaisons (100 % cĂŽtĂ© client) 3. Filtres : style (mod/min/cre/cls/tec/ele), layout, compatibilitĂ© ATS, couleur, recherche, tri 4. Aperçu plein Ă©cran (TemplatePreviewModal) avec rendu live du contenu rĂ©el 5. selectTemplate() applique le layout et Ă©crase la couleur d’accent avec celle de la palette

Flux Alternatif

A1 : saisie d’une couleur hex libre

Flux Exception

E1 : layout inconnu au rendu → repli CvLayoutClassic

Postconditions

templateLayout mĂ©morisĂ© (chaĂźne libre) — persistĂ© au prochain enregistrement du contenu

UC9 : Personnaliser le design

Acteur

Candidat

Préconditions

CV en cours d’Ă©dition

Flux Principal

1. Couleur d’accent : presets, saisie hex validĂ©e, contrĂŽle de contraste (ColorCustomizer) 2. Police : 6 familles (dm-sans, syne, playfair, jetbrains, lora, outfit) 3. Taille de police (3 niveaux) et interlignage (compact/standard/airy) — StyleControls 4. Badge « Powered by ClaraJob » activable/dĂ©sactivable 5. Rendu immĂ©diat dans l’aperçu

Postconditions

fontFamily/fontSize/spacing dans data (autosave) ; accentColor et showBadge persistés au niveau du document


đŸ‘ïž Aperçu, Export & Partage

Diagramme - Aperçu
UC10 : Prévisualiser le CV

Acteur

Candidat

Préconditions

CV en édition

Flux Principal

1. Le candidat ouvre l’aperçu (?screen=preview ou panneau latĂ©ral de l’Ă©diteur) 2. CvPagedPreview dĂ©coupe le rendu au format A4 (595×842) via computePagesCount() 3. Zoom et bascule desktop/mobile 4. L’overlay plein Ă©cran de l’Ă©diteur affiche une page A4 (794×1123 px)

Flux Exception

E1 : pagination approximative (mesure de hauteur) → le rendu de rĂ©fĂ©rence est l’impression (UC11)

Postconditions

Le candidat voit le rendu final paginé

UC11 : Exporter en PDF

Acteur

Candidat

Préconditions

CV ouvert

Flux Principal

1. Le candidat clique « Exporter » (EditorPreviewPanel) 2. useCvVectorExport.exportVectorPdf() : nextTick + requestAnimationFrame puis window.print() 3. Le navigateur rend CvPrintDocument (tĂ©lĂ©portĂ© dans #cv-print-root, @media print, @page A4 marges 12 mm, break-inside: avoid) 4. Le candidat choisit « Enregistrer au format PDF » dans la boĂźte d’impression 5. ÉvĂ©nement analytics Plausible cv_exported

Flux Exception

E1 : le candidat annule la boĂźte d’impression → aucun effet

Postconditions

PDF vectoriel enregistrĂ© par l’utilisateur ; aucun PDF stockĂ© cĂŽtĂ© serveur (l’endpoint POST /api/v1/cvs/{cv_id}/export rĂ©pond 501 Not Implemented)

UC12 : Partager le CV

Acteur

Candidat

Préconditions

CV persisté

Flux Principal

1. Le candidat active le partage (SharePanel, ?screen=share) 2. PUT /api/v1/cv-documents/{id}/share → CvShareService.updateShare(enabled, slug) 3. Le token UUID existe dĂšs la crĂ©ation du document ; le slug personnalisĂ© est optionnel (regex ^[a-z0-9][a-z0-9-]{1,58}[a-z0-9]$, unicitĂ© vĂ©rifiĂ©e) 4. Retour CvShareResponse avec tokenUrl et slugUrl ; URL copiable

Flux Alternatif

A1 : désactiver le partage à tout moment ; A2 : partage LinkedIn (URL seule)

Flux Exception

E1 : slug dĂ©jĂ  pris → 409 Conflict

Postconditions

CV accessible publiquement ; pas d’expiration, de mot de passe, de QR code ni de compteur de vues (les KPI affichĂ©s par l’Ă©cran Partage sont illustratifs)

UC13 : Consulter un CV partagé

Acteur

Visiteur (non authentifié)

Préconditions

Partage activé sur le CV

Flux Principal

1. Le visiteur ouvre /cv/{tokenOuSlug} (CvPublicView) 2. GET /api/v1/cv-documents/shared/{token} (public, X-Robots-Tag: noindex) 3. Repli automatique sur GET /api/v1/cv-documents/shared/s/{slug} si introuvable 4. CvPublicResponse (data + design) est rendu en lecture seule avec le layout du document

Flux Exception

E1 : partage dĂ©sactivĂ© ou token inconnu → page introuvable

Postconditions

CV consulté sans compte ; aucune trace cÎté serveur (pas de compteur)


✅ Versions & Variantes

Diagramme - Versions et Variantes (UC14-UC15)
UC14 : Gérer les versions

Acteur

Candidat (Admin pour la configuration du plafond)

Préconditions

CV persisté

Flux Principal

1. Écran Versions (?screen=versions, onglet « history ») 2. CrĂ©er : POST /api/v1/cv-documents/{id}/versions — snapshot immuable (data + layout + couleur), label par dĂ©faut « Version du yyyy-MM-dd » 3. Rotation FIFO : au-delĂ  du plafond (10 par dĂ©faut), la plus ancienne est supprimĂ©e 4. Restaurer : POST 
/versions/{versionId}/restore réécrit le contenu du document 5. Supprimer : DELETE 
/versions/{versionId}

Flux Alternatif

A1 (Admin) : modifier le plafond via GET/PUT /api/v1/cv-documents/admin/config (collection appConfig, clé cv-builder.max-versions-per-cv)

Postconditions

Historique borné, restauration possible à tout moment

UC15 : Adapter le CV Ă  une offre

Acteur

Candidat

Préconditions

CV avec contenu ; description d’offre disponible

Flux Principal

1. Écran Adapter (?screen=adapt) : le candidat colle la description de l’offre 2. Le CV est sĂ©rialisĂ© en texte (serializeCvToText) 3. POST /api/v1/cv/match → CvMatcherService : matching purement algorithmique (normalisation NFD, stop-words FR/EN, score = mots trouvĂ©s / total) — aucun appel IA 4. Affichage du score et des mots-clĂ©s manquants 5. « CrĂ©er une variante » : POST /api/v1/cv-documents/{id}/variants (cvVariants : nom, rĂ©fĂ©rence de l’offre, deltas, matchScore)

Flux Alternatif

A1 : consulter/supprimer les variantes (écran Versions, onglet « variants »)

Postconditions

Variante rattachée au CV maßtre, comparable (diff) et listée


đŸ€– Assistance IA & Automatismes

Diagramme - Assistance IA et automatismes (UC16-UC19)
UC16 : Discuter avec Clara

Acteur

Candidat (+ IA générative)

Préconditions

CV ouvert ; écran Coach (?screen=ai-coach)

Flux Principal

1. Le candidat envoie un message (cooldown 5 s entre requĂȘtes) 2. POST /api/v1/ai/chat avec message, cvData et les 10 derniers messages 3. CvChatService (persona « Clara ») rĂ©pond en JSON : message + actions structurĂ©es (8 types : update_identity, update_section, set_experiences, set_education, set_skills, set_languages, add/remove_skill, set_full_cv) 4. Les actions modifiantes sont proposĂ©es en boutons ✅/❌ — jamais appliquĂ©es sans validation 5. À l’application : validation Zod (validateChatAction), snapshot d’annulation (mĂ©moire, 20 max), mutation de cvData, puis autoSave()

Flux Alternatif

A1 : quick actions d’import (PDF, profil) depuis le chat ; A2 : undo

Flux Exception

E1 : erreur IA/429 → « L’IA est momentanĂ©ment indisponible »

Postconditions

Conversations persistĂ©es en localStorage (50 max × 200 messages) — pas cĂŽtĂ© serveur

UC17 : Reformuler ou générer par IA

Acteur

Candidat (+ IA générative)

Préconditions

Champ riche en édition (accroche, expérience, projet)

Flux Principal

1. Boutons « Reformuler » / « GĂ©nĂ©rer » dans RichTextEditor (TipTap) 2. Reformuler : POST /api/v1/ai/reformulate (contexte experience/summary/project, ton du wizard) 3. GĂ©nĂ©rer : POST /api/v1/ai/generate-section (contexte enrichi : titre, top compĂ©tences) 4. Garde anti-refus (AiRefusalDetector → 422) 5. SuccĂšs → le contenu de l’Ă©diteur est remplacĂ©

Flux Exception

E1 : Ă©chec ou 429 → toast d’erreur, le contenu existant n’est jamais Ă©crasĂ© E2 : cooldown local 5 s entre appels

Postconditions

Texte amĂ©liorĂ© dans la section ; persistance par l’autosave (UC19)

UC18 : Consulter le score et les conseils

Acteur

Candidat

Préconditions

CV avec contenu

Flux Principal

1. Écran Score (?screen=ats) ou panneau latĂ©ral de l’Ă©diteur 2. useCvScoring (100 % client, computed) : 8 sections notĂ©es /10 → total en % 3. Score ATS par bonus fixes (nom 15, titre 10, email 10, rĂ©sumĂ© 15, expĂ©rience 20, formation 10, compĂ©tences 15, langue 5) 4. DĂ©tection de 12 clichĂ©s (« dynamique », « motivĂ© », « rigoureux » ) dans l’accroche et les expĂ©riences 5. Conseils contextuels (LinkedIn manquant, absence de chiffres, etc.)

Flux Exception

E1 : les listes de mots-clĂ©s ATS affichĂ©es sont illustratives (donnĂ©es fixes) — seuls les scores et clichĂ©s sont rĂ©ellement calculĂ©s

Postconditions

Jauge et recommandations affichĂ©es — aucun appel rĂ©seau, aucune validation bloquante

UC19 : Sauvegarde automatique

Acteur

SystĂšme

Préconditions

CV ouvert dans le workspace

Flux Principal

1. watchDebounced (2 s, deep) surveille cvData dans CvWorkspaceView 2. À la stabilisation d’une Ă©dition : store.autoSave() 3. CV dĂ©jĂ  persistĂ© → PUT /api/v1/cv-documents/{id} (upsert complet du document) 4. CV jamais persistĂ© → createNewCv() (POST /api/v1/cv-documents) 5. lastSavedAt mis Ă  jour, indicateur « EnregistrĂ© »

Flux Alternatif

A1 : les actions IA validées dans le chat déclenchent autoSave() immédiatement

Flux Exception

E1 : le watch ne couvre que cvData — un changement de template ou de couleur seul n’est persistĂ© qu’avec la prochaine Ă©dition de contenu

Postconditions

Document MongoDB à jour ; pas de timer périodique, pas de cache hors-ligne


Phase 2 : Analyse et Vérification (Sync Gate 1)

VĂ©rification d’implĂ©mentabilitĂ© — constatĂ©e dans le code :

✅ Chaque use case correspond Ă  du code livrĂ©

  • UC01–UC03 : ScratchWizardModal/CvInitScreen2 → AiController/CvDocumentController → CvGenerationService/CvImportService

  • UC04–UC07, UC19 : store cvBuilder + autosave → CvDocumentService → MongoDB cvDocuments

  • UC08–UC11 : galerie, design et export 100 % cĂŽtĂ© client (aucun endpoint template/export actif)

  • UC12–UC13 : CvShareService + endpoints publics shared/{token} et shared/s/{slug}

  • UC14–UC15 : CvVersionService (FIFO 10) et CvMatcherService/CvVariantService

  • UC16–UC18 : CvChatService/AiService (Gemini ou Groq) et useCvScoring (client)

✅ Architecture rĂ©elle

  • Frontend : SPA Vue 3, une route builder + 16 Ă©crans par query param, un seul store Pinia

  • Backend : WebFlux spec-first OpenAPI, DDD par bounded context, MongoDB bloquant isolĂ© sur boundedElastic

  • Storage : MongoDB (cvDocuments, cvDocumentVersions, cvVariants, appConfig) ; MinIO pour les fichiers uploadĂ©s ; aucune table CV en PostgreSQL

  • Export : window.print() vectoriel — aucun PDF stockĂ© cĂŽtĂ© serveur

✅ Limites connues (assumĂ©es dans le code)

  • Quota de 5 CV appliquĂ© cĂŽtĂ© interface uniquement

  • Quota de tokens IA dĂ©fini (clarajob.ai.usage-quota) mais non appliquĂ© par les endpoints

  • Contrat OpenAPI /api/v1/cvs partiellement implĂ©mentĂ© (crĂ©ation/Ă©dition/export → 501)


Matrice Acteurs × Use Cases

Use Case Candidat Visiteur Admin SystĂšme IA externe

UC1 : Créer depuis zéro

✅

❌

❌

❌

✅

UC2 : Importer un PDF

✅

❌

❌

❌

✅

UC3 : Importer du profil

✅

❌

❌

❌

(✅ si PDF)

UC4 : Consulter mes CV

✅

❌

❌

❌

❌

UC5 : Supprimer

✅

❌

❌

❌

❌

UC6 : Modifier le contenu

✅

❌

❌

❌

❌

UC7 : Réorganiser/masquer

✅

❌

❌

❌

❌

UC8 : Choisir un template

✅

❌

❌

❌

❌

UC9 : Personnaliser le design

✅

❌

❌

❌

❌

UC10 : Prévisualiser

✅

❌

❌

❌

❌

UC11 : Exporter en PDF

✅

❌

❌

❌

❌

UC12 : Partager

✅

❌

❌

❌

❌

UC13 : Consulter un CV partagé

❌

✅

❌

❌

❌

UC14 : Gérer les versions

✅

❌

✅ (plafond)

❌

❌

UC15 : Adapter Ă  une offre

✅

❌

❌

❌

❌

UC16 : Chat Clara

✅

❌

❌

❌

✅

UC17 : Reformuler/générer

✅

❌

❌

❌

✅

UC18 : Score & conseils

✅

❌

❌

❌

❌

UC19 : Sauvegarde auto

❌

❌

❌

✅

❌


Priorisation (Phase 3)

Priorité Use Cases Effort Valeur

P0 - CƓur livrĂ©

UC01–UC06, UC10–UC11, UC19

M

Haute CrĂ©er (wizard/imports), Ă©diter, prĂ©visualiser, exporter — le parcours complet fonctionne

P1 - Différenciateurs livrés

UC08–UC09, UC12–UC17

M

Haute Templates/design, partage public, versions, variantes, IA (chat, reformulation)

P2 - Confort livré

UC07, UC18

S

Moyenne Réorganisation des sections, score & conseils

Backlog (non implémenté)

Collaboration, interview prep, extras premium, analytics de partage

L

— Maquettes « coming soon » prĂ©sentes dans l’interface, sans backend