Limier: trier les missions freelance par pertinence, pas par mots-clés
Résumé
Limier agrège les missions freelance de cinq plateformes (API et flux officiels, sans scraping), les filtre par du code avant tout appel de modèle, puis les classe par pertinence en confrontant le contenu complet de chaque offre au CV et aux critères exprimés en langage naturel. Chaque verdict est expliqué, et chaque évolution du système est validée par un jeu d'évaluation dédié. En production sur limier.io, conçu, développé et opéré par Myelink.
01Le problème
La recherche de missions freelance se fait aujourd'hui plateforme par plateforme, avec des filtres par intitulé de poste. Or l'intitulé dit peu de choses: deux offres "Data Scientist" peuvent recouvrir des réalités opposées, et la mission idéale se cache parfois sous un titre inattendu. Résultat: des heures de veille, et des opportunités pertinentes qui passent sous le radar.
02L'approche
Rien n'est pré-indexé: chaque recherche interroge les plateformes en direct. Cinq connecteurs officiels (Free-Work, France Travail, Jean-Michel.io, Codeur.com, Jobicy) consomment des API et des flux structurés, sans aucun scraping HTML. Les filtres objectifs, fraîcheur des offres et contrats freelance, sont appliqués par du code avant tout appel de modèle: on ne paie pas un LLM pour écarter une offre périmée.
Le reste est confié au modèle: le contenu complet de chaque offre est confronté au CV et à une note de critères en langage naturel (TJM, localisation, télétravail, y compris des règles conditionnelles), et le classement rendu est expliqué offre par offre.
03L'architecture
Une recherche traverse un pipeline en flux: extraction du texte du CV, plan de recherche (mots-clés générés par LLM), interrogation parallèle des cinq connecteurs, filtres code, jugement de pertinence par lots parallèles, re-classement global, et livraison des cartes au navigateur en Server-Sent Events, au fur et à mesure que les lots sont jugés.
04Le classement
Le jugement se fait en deux passes, à température 0 et en sorties structurées (JSON Schema). Les offres sont d'abord jugées par lots de 12 en parallèle: verdict à trois états (retenue, presque, hors profil) et justification, rédigée avant le verdict - l'ordre des champs du schéma force le modèle à argumenter avant de trancher. Les scores de lots indépendants n'étant pas comparables, une seconde passe re-classe globalement les 60 meilleures offres et ne rend qu'un ordre, pas des notes: les LLM ordonnent bien mieux qu'ils ne calibrent des scores absolus.
Les critères conditionnels ("TJM 600 si 2 jours sur site, 700 si 3") sont traités par énumération des interprétations compatibles avec ce que l'offre affirme réellement. Une information absente vaut bénéfice du doute, jamais invention. Et les champs factuels des cartes (titre, TJM, lieu, lien) viennent des sources, jamais du modèle; le texte des offres est traité comme des données, les instructions qui s'y trouveraient sont ignorées.
05L'évaluation
Le classement est évalué contre un jeu de référence de 56 cas annotés, incluant des cas adversariaux: injections de prompt dans le texte des offres, informations manquantes, titres pièges. Aucune modification de prompt ou de modèle ne part en production sans être validée par ces scores. Ce travail a fait passer la précision de classement de 0,83 à 0,95.
06Données et confidentialité
La politique de zéro rétention du CV est vérifiable dans le code: le document est lu en mémoire, jamais écrit sur disque, consommé à l'ouverture du flux de résultats puis détruit; une recherche jamais consultée est purgée après 15 minutes. Les traces d'observabilité masquent le texte du CV. Il transite uniquement, le temps de l'analyse, par le fournisseur d'inférence, ce que la politique de confidentialité indique explicitement. Côté navigation: pas d'analytics, pas de bannière cookies, un seul cookie de session.
07La stack
| Couche | Choix |
|---|---|
| Web | FastAPI, HTMX, Server-Sent Events, rendu serveur |
| Agent | LangChain / LangGraph, sorties structurées JSON Schema |
| Inférence | modèles open-weights via OpenRouter, température 0 |
| Données | PostgreSQL, migrations Alembic |
| Paiements | Stripe, packs de crédits |
| Observabilité | Langfuse, traces avec masquage du CV |
| Qualité | 201 tests, tests navigateur Playwright, CI lint + tests, jeu d'évaluation de 56 cas |
| Déploiement | Docker sur VPS auto-hébergé (Coolify / Traefik), déploiement continu |
08État
Limier est en production et évolue en continu. Un principe de facturation résume l'état d'esprit du produit: un crédit n'est débité que si la recherche aboutit à au moins une mission pertinente.
@software{limier,
author = {Vinceslas, Medhy},
title = {Limier: missions freelance triees par pertinence},
url = {https://limier.io},
note = {En production, Myelink EURL}
}