Back to work
Building

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.

Timeline2026 → Demoday, July 2026
RoleFull-stack & ML integration
Team
ContextDemoday project
auxance.dev/work/jobmatch
JobMatchCode

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

  1. 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.

  2. 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.