Documentation complète

CV Maker

Application de création et d'export de CVs professionnels — 6 templates, éditeur live, IA intégrée (Ollama), export PDF Puppeteer.

http://<serveur>:8083
6
Templates
7
Sections CV
Ollama
IA locale
PDF
Export Puppeteer
JWT
Auth sécurisée
🏠
Vue d'ensemble
Stack technique et fonctionnalités principales

CV Maker est une application web Next.js 14 permettant de créer, éditer et exporter des CVs professionnels. L'éditeur est temps-réel avec prévisualisation instantanée. L'IA locale (Ollama / phi3:mini) assiste la rédaction sans envoyer de données à l'extérieur.

🎨
6 Templates intégrés
Classic, Moderne, Minimaliste, Élégant, Créatif, Tech — chacun avec son identité visuelle. Plus des thèmes personnalisés via l'Atelier.
✏️
Éditeur live
Panneau gauche formulaire / panneau droit prévisualisation temps-réel. Glisser-déposer pour réordonner les sections.
🤖
IA Ollama
Reformulation, raccourcissement, enrichissement, génération de résumé, analyse de CV — tout en local avec phi3:mini.
📄
Export PDF
Rendu PDF haute fidélité via Puppeteer (headless Chromium) depuis la route /print/[id]. Mise en page A4 pixel-perfect.
🔧
Atelier de thèmes
Créer des templates personnalisés basés sur Élégant, Créatif ou Tech. Couleurs, police, préréglages — sauvegardés par utilisateur.
👑
Administration
Dashboard admin avec stats, gestion utilisateurs, liste CVs, journal d'audit, export PDF de n'importe quel CV.
🎨
Templates
6 templates intégrés + thèmes personnalisés via l'Atelier

Chaque template est un composant React avec son propre rendu. Le choix du template est modifiable à tout moment depuis l'éditeur.

📰 Classique

Mise en page traditionnelle, sobre et universelle. Idéal pour tous secteurs.

serif · gris foncé
⚡ Moderne

Design épuré bleu. Accent sur la lisibilité et les titres de section.

sans-serif · bleu
○ Minimaliste

Typographie aérée, espaces généreux. Maximum de clarté.

sans-serif · neutre
✨ Élégant

2 colonnes avec barre latérale sombre. Accents dorés.

serif · or · 2 col
🎨 Créatif

En-tête coloré, tags de compétences, style dynamique.

sans-serif · violet
💻 Tech

Inspiration terminal développeur, fond sombre, accents verts.

monospace · vert
🔧
L'Atelier de thèmes (/workshop) permet de créer des variantes personnalisées basées sur les templates Élégant, Créatif ou Tech, avec choix libre des couleurs primaire/accent et de la police. Ces thèmes sont sauvegardés en base et disponibles dans l'éditeur.
📋
Sections du CV
7 sections éditables avec glisser-déposer

Chaque section peut être remplie indépendamment. Les entrées (expériences, formations, compétences…) sont réordonnables par glisser-déposer via react-sortablejs.

👤Infos personnelles
💼Expériences
🎓Formation
Compétences
🌍Langues
💻Logiciels
🎯Loisirs

Infos personnelles — champs disponibles

ChampTypeDescription
firstName / lastNameTextePrénom et nom affichés en en-tête
jobTitleTexteTitre du poste recherché ou actuel
email / phone / address / cityTexteCoordonnées de contact
linkedin / websiteURLLiens professionnels optionnels
summaryTextareaAccroche / résumé du profil
photoUrlImagePhoto de profil (upload + recadrage)

Niveaux de compétences / langues

TypeFormatValeurs
Compétence / LogicielNumérique 1-5Débutant → Expert (barre de progression)
LangueEnum texteNotions · Débutant · Intermédiaire · Avancé · Courant · Bilingue · Langue maternelle
🔐
Authentification
JWT · bcrypt · middleware Next.js
Inscription
Connexion
Middleware

Inscription — /register

  • Champs : nom, email, mot de passe (hashé bcrypt)
  • Validation Zod côté serveur
  • Après inscription → redirigé vers /dashboard
  • Le premier compte créé peut être promu admin via seed-admin.js ou directement en BDD

Connexion — /login

  • Email + mot de passe → vérification bcrypt
  • JWT signé (secret dans JWT_SECRET) stocké en cookie httpOnly
  • Durée du token : configurable (défaut 7 jours)
  • Déconnexion : POST /api/auth/logout → suppression du cookie

Middleware Next.js — src/middleware.ts

  • Intercepte toutes les requêtes vers les routes protégées
  • Vérifie la présence et la validité du JWT dans le cookie
  • Redirige vers /login si non authentifié
  • Routes publiques : /login, /register, /api/auth/*
  • Routes admin : vérification du flag isAdmin dans le JWT
📂
Dashboard
/dashboard — liste et gestion de ses CVs

Page principale après connexion. Affiche tous les CVs de l'utilisateur avec leurs métadonnées.

Créer un CV
Bouton "Nouveau CV" → crée un enregistrement vide avec POST /api/cv et redirige vers l'éditeur.
📝
Modifier
Cliquer sur un CV → ouvre l'éditeur /editor/[id]. Les modifications sont sauvegardées manuellement.
📄
Exporter
Bouton de téléchargement → GET /api/export/[id] → génère et télécharge le PDF.
🗑️
Supprimer
Confirmation requise. Suppression via DELETE /api/cv/[id] (cascade sur les données du CV).
✏️
Éditeur de CV
/editor/[id] — interface split-screen en temps réel

L'éditeur est une interface split-screen : le formulaire à gauche, la prévisualisation à droite. Chaque modification se reflète instantanément dans la prévisualisation.

1

Navigation entre sections

Onglets latéraux pour basculer entre Infos perso, Expériences, Formation, Compétences, Langues, Logiciels, Loisirs.

2

Saisie des données

Formulaires validés par React Hook Form + Zod. Les entrées multiples (expériences, compétences…) s'ajoutent dynamiquement.

3

Choix du template

Sélecteur de template en haut de l'éditeur. Basculement instantané entre les 6 templates intégrés et les thèmes personnalisés.

4

Photo de profil

Upload via POST /api/upload-photo (max 5 Mo, JPEG/PNG). Outil de recadrage intégré (react-image-crop). Stockée dans /public/uploads.

5

Sauvegarde

Bouton "Enregistrer" → PUT /api/cv/[id]. Les données sont stockées en JSON dans la colonne data de la table CV.

🖱️
Les entrées multiples (expériences, formations, compétences…) sont réordonnables par glisser-déposer via react-sortablejs. L'ordre est persisté à la sauvegarde.
🤖
IA intégrée — Ollama
phi3:mini · 100% local · aucune donnée envoyée en dehors du serveur

L'IA fonctionne entièrement en local via Ollama (modèle phi3:mini). Elle assiste la rédaction des textes du CV depuis l'éditeur, ainsi que l'analyse de CVs externes au format PDF.

Actions disponibles dans l'éditeur

✏️
Reformuler
Rend le texte plus professionnel et percutant
Rendre dynamique
Introduit des verbes d'action (développé, piloté, conçu…)
✂️
Raccourcir
Condense en 2 phrases max en conservant l'essentiel
📝
Enrichir
Développe avec plus de détails professionnels
Générer un résumé
Crée une accroche 2-3 phrases à partir du profil complet
📊
Analyser le CV
Score /10, points forts, axes d'amélioration, conseil clé
🤖
Toutes les requêtes IA passent par POST /api/ai. L'endpoint attend { action, text, context } et renvoie { result }. Le modèle est configurable via la variable d'env OLLAMA_MODEL (défaut : phi3:mini).
Au premier démarrage, le conteneur ollama-init télécharge le modèle automatiquement. Si l'IA renvoie une erreur 503, c'est que le modèle est encore en cours de téléchargement — réessayer après quelques minutes.
📄
Export PDF
Puppeteer · Chromium headless · format A4 pixel-perfect

L'export PDF utilise Puppeteer (Chromium headless) pour rendre la page /print/[id] et l'exporter en PDF A4 haute fidélité. Ce qui s'affiche dans la prévisualisation est exactement ce qui sera dans le PDF.

Flux d'export

1

Requête GET /api/export/[id]

L'utilisateur clique "Télécharger PDF" → requête authentifiée envoyée au serveur.

2

Puppeteer lance le navigateur

Chromium headless démarre en interne et navigue vers http://localhost:3000/print/[id].

3

Rendu de la page /print/[id]

La page de print utilise un layout épuré (sans navigation) et affiche le CV dans son template avec toutes les données.

4

Génération du PDF A4

Puppeteer exporte en PDF format A4, marges zéro. Le buffer est renvoyé avec Content-Type: application/pdf.

👑
L'admin peut exporter le PDF de n'importe quel CV via GET /api/admin/export/[id], même s'il ne lui appartient pas.
🔧
Atelier de thèmes
/workshop — créer et sauvegarder des templates personnalisés

L'atelier permet de créer des variantes visuelles des templates Élégant, Créatif et Tech, avec un aperçu en temps réel.

🏗️
Base du template
Choisir parmi Élégant (serif doré, 2 colonnes), Créatif (barre colorée, tags) ou Tech (style développeur).
🎨
Couleurs
Couleur primaire (fond header/colonne) et couleur accent (titres, highlights). 8 préréglages + color picker libre.
🔤
Police
7 polices disponibles : Inter, Georgia, Arial, Verdana, Times New Roman, Courier New, Trebuchet MS.
💾
Sauvegarde
Nommer et sauvegarder le thème → stocké dans CustomTemplate. Disponible dans le sélecteur de template de l'éditeur.

Préréglages couleurs

NomCouleur primaireCouleur accent
Or#1a1a2e#b8860b
Violet#7c3aed#f59e0b
Vert#0f172a#22c55e
Rouge#7f1d1d#f97316
Bleu#1e3a8a#38bdf8
Rose#4a044e#f472b6
Teal#134e4a#2dd4bf
Ardoise#0f172a#94a3b8
🔍
Analyse de CV PDF
/analyze — importer et analyser un CV existant

Permet d'uploader un CV PDF existant (pas forcément créé avec CV Maker) pour obtenir une analyse IA instantanée.

  • Upload d'un fichier PDF (max 10 Mo)
  • Extraction du texte via pdf-parse (nécessite un PDF avec texte sélectionnable, pas scanné)
  • Analyse IA : score /10, 3 points forts, 3 axes d'amélioration, conseil clé
  • L'action est journalisée (nom du fichier, nombre de pages, taille, caractères extraits)
⚠️
Les PDFs scannés (images) ne sont pas supportés. Le fichier doit contenir du texte sélectionnable. Le texte est tronqué à 3 500 caractères pour rester dans la fenêtre de contexte du modèle.
👑
Espace Admin
/admin — accès complet · réservé aux comptes isAdmin = true

Accessible uniquement aux utilisateurs avec isAdmin = true. 4 onglets disponibles.

Vue d'ensemble
Utilisateurs
CVs
Journaux

Onglet Vue d'ensemble

  • Nombre total d'utilisateurs inscrits
  • Nombre total de CVs créés
  • CVs créés ce mois-ci
  • Répartition des CVs par template (Classique, Moderne, Minimaliste…)

Onglet Utilisateurs

  • Liste de tous les comptes : nom, email, date d'inscription, nombre de CVs, statut admin
  • Recherche en temps réel par nom ou email
  • Affichage du badge admin pour les comptes privilégiés

Onglet CVs

  • Liste de tous les CVs de tous les utilisateurs
  • Recherche par titre, nom utilisateur ou email
  • Template utilisé, dates de création et modification
  • Bouton export PDF pour chaque CV via GET /api/admin/export/[id]

Onglet Journaux

  • Journal de toutes les actions enregistrées sur la plateforme
  • Filtre par type d'action
  • Chaque entrée : date/heure, utilisateur, action, IP, métadonnées JSON
LOGIN LOGOUT REGISTER CV_CREATED CV_UPDATED CV_DELETED CV_EXPORTED PDF_ANALYZED TEMPLATE_CREATED TEMPLATE_DELETED ADMIN_EXPORT
🛡️
Sécurité
JWT · bcrypt · middleware · isolation des données
🔑
JWT httpOnly
Le token JWT est stocké dans un cookie httpOnly — inaccessible au JavaScript client. Signé avec JWT_SECRET (à changer en production).
🔒
bcryptjs
Les mots de passe sont hashés avec bcrypt (salt rounds 10) avant stockage. Jamais stockés en clair.
🛡️
Middleware Next.js
Toutes les routes protégées sont interceptées. Vérification JWT systématique. Vérification isAdmin pour /admin et /api/admin/*.
🔐
Isolation des données
Chaque requête API filtre par userId. Un utilisateur ne peut jamais lire, modifier ou supprimer le CV d'un autre. Seul l'admin y a accès.
🌐
IP réelle
L'IP journalisée est lue dans l'ordre : CF-Connecting-IPX-Forwarded-ForremoteAddress. Supporte Cloudflare.
📋
Journal d'audit
Toutes les actions sensibles (auth, CRUD CV, export, analyse IA) sont journalisées en base avec IP, utilisateur et métadonnées.
⚠️
En production, modifier impérativement JWT_SECRET et ADMIN_PASSWORD dans le .env. Les valeurs par défaut du docker-compose.yml sont des placeholders non sécurisés.
🗄️
Base de données
4 tables — PostgreSQL 16 · Prisma ORM

User

ColonneTypeNote
idUUID PKIdentifiant unique (uuid v4)
emailSTRING UNIQUEEmail de connexion
passwordSTRINGHash bcrypt
nameSTRINGNom affiché
isAdminBOOLEANtrue = accès admin. Défaut false
createdAt / updatedAtDATETIMEAuto-géré par Prisma

CV

ColonneTypeNote
idUUID PK
userIdUUID FKRéférence User.id — cascade on delete
titleSTRINGNom du CV. Défaut "Mon CV"
templateSTRINGID du template (ex: "classic", "custom-uuid"). Défaut "classic"
dataJSONObjet CVData complet (toutes les sections)
createdAt / updatedAtDATETIME

CustomTemplate

ColonneTypeNote
idUUID PK
userIdUUID FKRéférence User.id — cascade on delete
nameSTRINGNom du thème personnalisé
baseSTRINGTemplate de base (elegant, creative, tech)
primaryColorSTRINGCouleur primaire hex. Défaut #1a1a2e
accentColorSTRINGCouleur accent hex. Défaut #b8860b
fontFamilySTRINGPolice CSS. Défaut "Georgia, serif"
createdAt / updatedAtDATETIME

Log

ColonneTypeNote
idUUID PK
userIdUUID NULL FKNULL si action avant connexion
actionSTRINGEx: LOGIN, CV_CREATED, PDF_ANALYZED…
ipSTRING NULLIP réelle du client
metaJSON NULLDonnées contextuelles (ex: nom du fichier, ID du CV…)
createdAtDATETIMEHorodatage UTC auto
🔄
Les migrations Prisma sont dans /prisma/migrations/ et appliquées automatiquement au démarrage du conteneur via prisma migrate deploy dans entrypoint.sh.
🐳
Installation Docker
4 conteneurs · port 8083 · CasaOS

L'application tourne dans 4 conteneurs Docker orchestrés par Docker Compose avec démarrage automatique.

Conteneurs

ConteneurImageRôle
cv-maker-appDockerfile (Next.js 14)Application web — port 8083:3000
cv-maker-dbpostgres:16-alpineBase de données PostgreSQL
cv-maker-ollamaollama/ollama:latestServeur IA local (LLM)
cv-maker-ollama-initollama/ollama:latestTélécharge le modèle IA au 1er démarrage puis s'arrête

Volumes Docker

VolumeContenu
pgdataDonnées PostgreSQL persistantes
uploadsPhotos de profil uploadées (/app/public/uploads)
ollama_dataModèles Ollama téléchargés (évite re-téléchargement)

Variables d'environnement clés

VariableDéfautDescription
JWT_SECRETà définirSecret de signature JWT — obligatoire en production
ADMIN_EMAIL[email protected]Email du compte admin créé au premier démarrage
ADMIN_PASSWORDadmin1234Mot de passe admin initial — à changer immédiatement
OLLAMA_MODELphi3:miniModèle LLM à utiliser (ex: llama3, mistral)
DATABASE_URLPostgreSQL interneURL de connexion Prisma

Démarrage initial

1

Copier le .env

Copier .env.example.env et renseigner JWT_SECRET, ADMIN_EMAIL, ADMIN_PASSWORD.

2

Lancer les conteneurs

docker compose up -d depuis /DATA/AppData/cv-maker/. PostgreSQL et Ollama passent par un healthcheck avant le démarrage de l'app.

3

Migrations automatiques

L'entrypoint.sh exécute prisma migrate deploy puis node seed-admin.js (crée le compte admin s'il n'existe pas).

4

Téléchargement du modèle IA

Le conteneur ollama-init télécharge phi3:mini (≈ 2 Go) une seule fois dans le volume ollama_data.

5

Accéder à l'application

Ouvrir http://<serveur>:8083 et se connecter avec les identifiants admin du .env.

Le seed-admin.js est idempotent : il ne crée le compte admin que s'il n'existe pas déjà. Il peut être relancé sans risque.
🔗
API & URLs
Pages Next.js et endpoints API REST — cliquer pour copier

Pages

PageURLAccès
Landing/Public
Connexion/loginPublic
Inscription/registerPublic
Dashboard/dashboardConnecté
Éditeur/editor/[id]Connecté (propriétaire)
Impression / PDF/print/[id]Connecté (propriétaire)
Analyse PDF/analyzeConnecté
Atelier de thèmes/workshopConnecté
Administration/adminAdmin uniquement

API — Authentification

MéthodeEndpointDescription
POST/api/auth/loginConnexion → cookie JWT
POST/api/auth/logoutDéconnexion → supprime le cookie
GET/api/auth/meRenvoie les infos de l'utilisateur connecté
POST/api/auth/registerInscription d'un nouveau compte

API — CVs

MéthodeEndpointDescription
GET/api/cvListe les CVs de l'utilisateur connecté
POST/api/cvCrée un nouveau CV vide
GET/api/cv/[id]Récupère un CV par ID
PUT/api/cv/[id]Met à jour les données d'un CV
DELETE/api/cv/[id]Supprime un CV

API — Export PDF

MéthodeEndpointDescription
GET/api/export/[id]Exporte le CV en PDF (propriétaire uniquement)
GET/api/admin/export/[id]Export PDF admin (tout CV) — admin uniquement

API — Templates personnalisés

MéthodeEndpointDescription
GET/api/templatesListe les thèmes personnalisés de l'utilisateur
POST/api/templatesCrée un nouveau thème personnalisé
GET/api/templates/[id]Récupère un thème par ID
DELETE/api/templates/[id]Supprime un thème personnalisé

API — IA & Médias

MéthodeEndpointDescription
POST/api/aiActions IA : rephrase, dynamic, shorten, expand, generate_summary, analyze
POST/api/analyze-pdfAnalyse d'un CV PDF uploadé via multipart/form-data
POST/api/upload-photoUpload photo de profil (JPEG/PNG, max 5 Mo)