SB
projets
WIP · 2026 Personnel

ApplyDesk

Back-office personnel pour gérer ma recherche d'emploi de A à Z — scrapers, parsing LLM, suivi de candidatures, génération d'emails, préparation d'entretiens.

Le problème

Pourquoi j'ai construit ça

Quand on cherche un poste en parallèle d'un CDI, on jongle entre 5+ job boards, des CVs versionnés, des lettres de motivation à adapter, des entretiens à préparer et un suivi qui se perd dans une feuille Excel. ApplyDesk centralise tout ça dans une app où chaque étape est outillée.

Highlights

Ce qui est intéressant techniquement

01

Parsing CV via Gemini structured output

J'envoie le texte brut extrait via pypdf et je récupère un Pydantic model fully validé (experiences, formation, skills par catégorie, langues, publications). La détection est fiable même sur des CVs en colonnes.

02

Multi-langue FR / EN

Chaque CV a une langue, les candidatures aussi. Un bouton « translate → EN » appelle Gemini pour générer une version anglaise idiomatique (action verbs : shipped, led, owned), avec édition manuelle possible bullet par bullet.

03

Génération LaTeX moderncv

Export du CV en source LaTeX éditable directement dans l'app + compilation sur Overleaf en un clic (form POST avec textarea, parce qu'input strip les newlines — petit détail qui m'a coûté une heure).

04

Scrapers d'offres

France Travail + Adzuna via API, HelloWork / Welcome to the Jungle en HTML scraping. Dédup intelligente (titre + entreprise + lieu) pour fusionner les doublons inter-sources.

05

Suivi candidatures + relances auto

Tableau Kanban (envoyée → réponse → entretien → offre), banner « needs followup » quand une candidature dépasse le seuil de jours configuré.

06

Email de candidature généré + envoi SMTP

Le LLM rédige un email tailored offer × profil, je peux éditer, puis l'app envoie via Gmail SMTP avec le CV en pièce jointe (dans la langue choisie).

Stack

Sous le capot

Backend
Python 3.11 FastAPI SQLAlchemy 2.0 async Pydantic 2 Alembic Gemini 2.5
Frontend
React 18 TypeScript Vite TanStack Query Zustand sonner
Data
PostgreSQL (Neon) JSON columns Full-text search
Ops
Docker pytest vitest ruff eslint

Statut actuel

Utilisé quotidiennement depuis avril 2026. Repo privé pour l'instant — je l'ouvrirai après ma recherche, une fois nettoyé des données perso.