Comment un moteur de recherche d'emploi fonctionne sur des millions d'offres sans intermédiaires
La recherche d'emploi dans des entreprises étrangères ou de grandes entreprises informatiques se transforme souvent en une routine pleine de surprises désagréables. Vous trouvez un poste intéressant sur un agrégateur, vous cliquez sur le lien, et l'offre a été fermée il y a un mois. Ou vous tombez sur d'innombrables copies de la même offre provenant de cabinets de recrutement qui ne mentionnent même pas l'employeur final.

Le projet freehire résout ce problème avec une approche technique simple : il analyse les données directement depuis les systèmes de gestion des candidatures (ATS), en contournant les intermédiaires. La base de données contient plus de 3,3 millions d'offres actives provenant de près de 300 000 entreprises. L'ensemble de la pile est open source sous licence MIT, y compris les collecteurs de données, l'interface web, le moteur de recherche et l'API.
D'où viennent les données
La plupart des entreprises technologiques publient leurs offres via des services spécialisés comme Greenhouse, Lever, Workday, Ashby ou iCIMS. Les créateurs de freehire ont écrit des adaptateurs pour 92 de ces plateformes, et ont également connecté environ une centaines de sites d'offres d'emploi tiers et des flux directs de grandes entreprises.
Le pipeline fonctionne comme suit :
- Un worker parcourt les sites d'offres d'emploi et lit les nouvelles offres. Ajouter une entreprise ne prend généralement qu'une ligne dans un fichier YAML, en spécifiant le nom et l'ID dans l'ATS.
- Les données sont normalisées dans un format unifié. Si une offre est publiée sur plusieurs plateformes, le système fusionne les doublons par une clé stable.
- Les filtres pour les niveaux, les salaires, les localisations et la pile technologique sont construits à partir de dictionnaires stricts. Il n'y a pas d'heuristiques peu fiables ici — le système ne tente pas de deviner des données au hasard.
- Un worker séparé télécharge le formulaire de candidature réel depuis l'ATS cible, en préservant la structure originale des champs.
Qu'y a-t-il à l'intérieur besides the vacancy catalog
La recherche n'est que la vitrine. Autour de la base de données d'offres, les développeurs ont construit un espace de travail complet pour les candidats.
Générateur de CV et vérification de correspondance
Le dépôt inclut un constructeur de CV qui génère des fichiers PDF optimisés pour l'analyse automatique par les ATS. Le système compare les exigences du poste avec votre expérience et calcule un score de compatibilité déterministe. Lorsqu'il est connecté à un modèle de langage, il fournit des ajustements de CV ciblés pour des candidatures spécifiques sans inventer d'expérience.
Suivi des candidatures avec réception de courrier
Après avoir soumis une candidature, le suivi se poursuit sur un tableau Kanban avec des mises à jour de statut. Une passerelle email intégrée connecte les réponses des recruteurs aux cartes de candidature spécifiques, gardant la correspondance organisée plutôt que perdue dans une boîte de réception générale.
Assistant et extension de navigateur
Une extension de barre latérale Chrome a été développée. Lorsque vous ouvrez une page d'offre sur n'importe quel site, le plugin lit le texte de la page, le croise avec votre profil et remplit le formulaire de candidature pour vous. Pour ceux qui préfèrent travailler via des clients LLM comme Claude Desktop, les auteurs fournissent un serveur MCP séparé.
Architecture et pile technologique
Le code est écrit en Go en utilisant le framework web Fiber v2. Architecturalement, le backend est clairement séparé : le serveur API gère exclusivement les requêtes des clients, tandis que tout le travail en arrière-plan est déplacé vers des workers séparés à usage unique. Ceux-ci sont pratiques à exécuter via cron ou à l'intérieur de files d'attente.
cmd/ Точки входа: HTTP-сервер и консольные воркеры
sources/ Файлы конфигурации источников вакансий (YAML)
migrations/ Схема PostgreSQL для sqlc и initdb
web/ Интерфейс на SvelteKit 2
internal/ Внутренние пакеты предметной области
sources/ Адаптеры под конкретные ATS (Workday, Lever, etc.)
pipeline/ Пайплайн сбора, валидации и дедупликации
cv/ cvedit/ Генерация структурированных резюме в PDF
inbox/ Обработка и связывание почты рекрутеров
Pour le stockage et la recherche rapide, une combinaison de composants est utilisée :
- PostgreSQL avec l'extension pgvector stocke les entités principales et les embeddings vectoriels pour la recherche sémantique.
- sqlc génère du code type-safe pour travailler avec la base de données à partir de requêtes SQL simples — aucun ORM n'est utilisé.
- Meilisearch gère la recherche en texte intégral et le filtrage à facettes instantané.
- SvelteKit 2 (sur Svelte 5 runes) et Tailwind 4 forment le frontend SSR rapide.
- Redis et MinIO couvrent la mise en cache, la limitation de débit des requêtes et le stockage d'objets pour les fichiers.
Démarrage rapide et travail avec l'API
Vous pouvez lancer une copie locale du service avec toutes les dépendances via Docker :
make up
La commande démarrera la base de données, le moteur de recherche, l'API et l'interface web sur le port 8080. Vous pouvez vérifier la disponibilité avec une simple requête curl :
curl localhost:8080/health
curl localhost:8080/api/v1/jobs
En passant, l'API publique du projet est disponible sans clés ni autorisation. Si vous avez besoin d'accéder à des offres fraîches pour votre bot ou projet personnel, il suffit d'appeler le point de terminaison https://freehire.me/api/v1/jobs. Toutes les réponses sont retournées au format JSON prévisible avec des métadonnées structurées et la pagination.
Pour exécuter les collecteurs de données, des commandes console dans cmd/ sont utilisées :
# Обход конкретного каталога ATS
go run ./cmd/ingest sources/greenhouse.yml
# Сброс очереди индексации в Meilisearch
go run ./cmd/search-drain
# Извлечение вакансий из Telegram-каналов
go run ./cmd/tg-extract
Pour qui est ce projet
Le dépôt sera utile dans trois cas :
- Vous cherchez un emploi dans des entreprises internationales et vous êtes fatigué des agrégateurs de faible qualité. La version web donne des liens directs vers les systèmes ATS des employeurs sans intermédiaires intrusifs.
- Vous voulez créer votre propre agrégateur, chaîne Telegram avec des offres ou bot. Les adaptateurs ouverts vers 92 systèmes ATS économisent des centaines d'heures de rédaction de parseurs.
- Vous êtes intéressé par un exemple de projet Go mature sans ORM surchargé, avec du typage SQL strict, une séparation en workers indépendants et une intégration avec un moteur de recherche moderne.
Le projet semble mature, et son ouverture donne à tout développeur la possibilité de soumettre une pull request avec une nouvelle entreprise en une seule ligne YAML. Vous pouvez essayer le service en direct sur le site web du projet ou en déployant des conteneurs sur votre propre serveur.
Projets similaires