SB
projects
WIP · 2026 Personal

ApplyDesk

Personal job-search back-office to handle everything end-to-end — scrapers, LLM parsing, application tracking, email generation, interview prep.

The problem

Why I built this

When job-hunting alongside a full-time role, you juggle 5+ job boards, versioned CVs, cover letters to tailor, interviews to prep, and an application log that gets lost in a spreadsheet. ApplyDesk centralizes all of that in one app where every step is tooled.

Highlights

What is technically interesting

01

CV parsing via Gemini structured output

I feed the raw text extracted via pypdf and get back a fully validated Pydantic model (experiences, education, skills by category, languages, publications). Detection holds up even on column-layout CVs.

02

Bilingual FR / EN

Each CV has a language, and so do applications. A "translate → EN" button calls Gemini to generate an idiomatic English version (action verbs: shipped, led, owned), with bullet-by-bullet manual editing.

03

moderncv LaTeX generation

CV exported as editable LaTeX source directly inside the app + one-click compilation on Overleaf (form POST with textarea, because input strips newlines — a small detail that cost me an hour).

04

Job-offer scrapers

France Travail + Adzuna via API, HelloWork / Welcome to the Jungle via HTML scraping. Smart dedup (title + company + location) merges duplicates across sources.

05

Application tracking + auto-followup

Kanban board (sent → response → interview → offer), with a "needs followup" banner when an application exceeds the configured day threshold.

06

LLM-generated cover email + SMTP send

The LLM writes a tailored offer × profile email, I can edit, then the app sends via Gmail SMTP with the CV attached (in the chosen language).

Stack

Under the hood

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

Current status

Used daily since April 2026. Private repo for now — I'll open-source it after my job search, once cleaned of personal data.