JobMatch
A CV ↔ job-offer matching platform: a local LLM reads the résumé, then every aggregated offer gets an explainable 0–100 compatibility score.
Code ↗Context
The user drops a CV as a PDF; a locally-run LLM — an Ollama model purpose-built for the task — extracts the profile: trade, city, skills, experience. Nothing leaves the machine: no third-party AI service ever sees the document.
Offers are aggregated from France Travail, Greenhouse, Lever and Ashby, re-synced every six hours. Each one is scored against the profile across five weighted dimensions — skills (35), trade (30), experience (15), location (10), contract (10) — so a candidate sees why an offer ranks where it does.
FastAPI serves a React 19 SPA (Vite, Tailwind v4, Motion), SQLite by default with Postgres in production. Fully bilingual FR/EN, aiming for WCAG 2.2 AA. Demoday is July 2026.
Architecture
- Backend
FastAPI
API under /api with a static SPA fallback; APScheduler re-syncs offers every 6 hours.
- Frontend
React 19 · Vite · Tailwind v4
Bilingual FR/EN with typed i18n, light/dark theme, WCAG 2.2 AA target.
- CV extraction
Ollama — custom jobmatch-cv model
Runs entirely locally; the résumé never reaches a third-party service.
- Scoring
Five weighted dimensions
Skills 35 · trade 30 · experience 15 · location 10 · contract 10 — every score is explainable.
Process
- 01
A local LLM, not an API
A résumé is among the most personal documents a person owns. Extraction runs on a self-hosted Ollama model so the PDF never leaves the infrastructure — privacy as an architecture decision, not a policy page.
- 02
Weighted criteria over a black box
The score is a transparent five-dimension formula rather than an opaque model output. A candidate can see exactly which dimension costs them points on a given offer — and what to change.