Wie eine Job-Suchmaschine Millionen von Stellenangeboten ohne Zwischenhändler durchsucht
Die Jobsuche bei ausländischen oder großen IT-Unternehmen wird oft zur Routine mit unangenehmen Überraschungen. Man findet eine interessante Position auf einem Aggregator, klickt auf den Link, und die Stelle wurde vor einem Monat geschlossen. Oder man stößt auf endlose Kopien derselben Anzeige von Personalvermittlungen, die nicht einmal den endgültigen Arbeitgeber nennen.

Das Projekt freehire löst dieses Problem mit einem unkomplizierten technischen Ansatz: Es analysiert Daten direkt aus Bewerber-Tracking-Systemen (ATS) und umgeht Zwischenhändler. Die Datenbank enthält über 3,3 Millionen aktive Stellenangebote von fast 300.000 Unternehmen. Der gesamte Stack ist unter der MIT-Lizenz offen, einschließlich Datensammler, Weboberfläche, Suchmaschine und API.
Woher die Daten kommen
Die meisten Tech-Unternehmen veröffentlichen Stellenangebote über spezialisierte Dienste wie Greenhouse, Lever, Workday, Ashby oder iCIMS. Die Entwickler von freehire haben Adapter für 92 solcher Plattformen geschrieben und auch etwa hundert Drittanbieter-Jobbörsen sowie direkte Feeds von großen Unternehmen angebunden.
Der Ablauf funktioniert wie folgt:
- Ein Worker durchsucht Jobbörsen und liest neue Stellenangebote. Das Hinzufügen eines Unternehmens erfordert normalerweise nur eine Zeile in einer YAML-Datei, die den Namen und die ID im ATS angibt.
- Daten werden in ein einheitliches Format normalisiert. Wenn eine Stelle auf mehreren Plattformen veröffentlicht wird, führt das System Duplikate über einen stabilen Schlüssel zusammen.
- Filter für Gehälter, Standorte und Tech-Stack werden aus strengen Wörterbüchern aufgebaut. Hier gibt es keine unzuverlässigen Heuristiken – das System versucht nicht, Daten nach dem Zufallsprinzip zu erraten.
- Ein separater Worker lädt das tatsächliche Bewerbungsformular vom Ziel-ATS herunter und behält die ursprüngliche Feldstruktur bei.
Was steckt noch hinter dem Stellenkatalog
Die Suche ist nur das Schaufenster. Rund um die Stellendatenbank haben Entwickler einen vollwertigen Kandidaten-Arbeitsbereich aufgebaut.
Lebenslauf-Generator und Matching-Prüfung
Das Repository enthält einen Lebenslauf-Builder, der PDF-Dateien rendert, die für die automatisierte ATS-Analyse optimiert sind. Das System gleicht Stellenanforderungen mit Ihrer Erfahrung ab und berechnet eine deterministische Kompatibilitätsbewertung. Bei Verbindung mit einem Sprachmodell liefert es gezielte Lebenslauf-Anpassungen für bestimmte Bewerbungen, ohne Erfahrungen zu erfinden.
Bewerbungs-Tracker mit eingehender E-Mail
Nach dem Absenden einer Bewerbung wird das Tracking auf einem Kanban-Board mit Status-Updates fortgesetzt. Ein integrierter E-Mail-Gateway verbindet Rückmeldungen von Recruitern mit bestimmten Bewerbungskarten und hält die Korrespondenz organisiert, statt sie in einem allgemeinen Posteingang zu verlieren.
Assistent und Browser-Erweiterung
Eine Chrome-Sidebar-Erweiterung wurde entwickelt. Wenn Sie eine Stellenanzeige auf einer beliebigen Website öffnen, liest das Plugin den Seitentext, gleicht ihn mit Ihrem Profil ab und füllt das Bewerbungsformular für Sie aus. Für diejenigen, die lieber über LLM-Clients wie Claude Desktop arbeiten, stellen die Autoren einen separaten MCP-Server bereit.
Architektur und Tech-Stack
Die Codebasis ist in Go unter Verwendung des Fiber v2 Web-Frameworks geschrieben. Architektonisch ist das Backend klar getrennt: Der API-Server bearbeitet ausschließlich Client-Anfragen, während alle Hintergrundarbeiten in separate Einweg-Worker ausgelagert sind. Diese lassen sich bequem über Cron oder in Queues ausführen.
cmd/ Точки входа: HTTP-сервер и консольные воркеры
sources/ Файлы конфигурации источников вакансий (YAML)
migrations/ Схема PostgreSQL для sqlc и initdb
web/ Интерфейс на SvelteKit 2
internal/ Внутренние пакеты предметной области
sources/ Адаптеры под конкретные ATS (Workday, Lever, etc.)
pipeline/ Пайплайн сбора, валидации и дедупликации
cv/ cvedit/ Генерация структурированных резюме в PDF
inbox/ Обработка и связывание почты рекрутеров
Für Speicherung und schnelle Suche wird eine Kombination von Komponenten verwendet:
- PostgreSQL mit der pgvector-Erweiterung speichert Hauptentitäten und Vektor-Einbettungen für semantische Suche.
- sqlc generiert typsicheren Code für die Arbeit mit der Datenbank aus reinem SQL – es wird kein ORM verwendet.
- Meilisearch übernimmt Volltextsuche und sofortige facettierte Filterung.
- SvelteKit 2 (auf Svelte 5 Runes) und Tailwind 4 bilden das schnelle SSR-Frontend.
- Redis und MinIO übernehmen Caching, Ratenbegrenzung und Objektspeicherung für Dateien.
Schneller Einstieg und Arbeiten mit der API
Sie können eine lokale Kopie des Dienstes zusammen mit allen Abhängigkeiten über Docker starten:
make up
Der Befehl startet die Datenbank, Suchmaschine, API und Weboberfläche auf Port 8080. Sie können die Verfügbarkeit mit einer einfachen curl-Anfrage prüfen:
curl localhost:8080/health
curl localhost:8080/api/v1/jobs
Übrigens ist die öffentliche API des Projekts ohne Schlüssel oder Autorisierung verfügbar. Wenn Sie Zugang zu aktuellen Stellenangeboten für Ihren Bot oder Ihr Hobbyprojekt benötigen, rufen Sie einfach den Endpunkt https://freehire.me/api/v1/jobs auf. Alle Antworten werden in vorhersehbarem JSON-Format mit strukturierten Metadaten und Pagination zurückgegeben.
Um Datensammler auszuführen, werden Konsolenbefehle in cmd/ verwendet:
# Обход конкретного каталога ATS
go run ./cmd/ingest sources/greenhouse.yml
# Сброс очереди индексации в Meilisearch
go run ./cmd/search-drain
# Извлечение вакансий из Telegram-каналов
go run ./cmd/tg-extract
Für wen ist dieses Projekt gedacht
Das Repository ist in drei Fällen nützlich:
- Sie suchen einen Job bei internationalen Unternehmen und haben die Qualität von Aggregatoren satt. Die Web-Version bietet direkte Links zu Arbeitgeber-ATS-Systemen ohne aufdringliche Zwischenhändler.
- Sie möchten Ihren eigenen Aggregator, Telegram-Kanal mit Stellenangeboten oder Bot erstellen. Die offenen Adapter für 92 ATS-Systeme sparen Hunderte von Stunden beim Schreiben von Parsern.
- Sie interessieren sich für ein Beispiel eines ausgereiften Go-Projekts ohne überladene ORMs, mit strikter SQL-Typisierung, Aufteilung in unabhängige Worker und Integration mit einer modernen Suchmaschine.
Das Projekt wirkt ausgereift, und seine Offenheit gibt jedem Entwickler die Möglichkeit, einen Pull-Request mit einer neuen Firma in einer YAML-Zeile einzureichen. Sie können den Dienst live auf der Projektwebsite ausprobieren oder Container auf Ihrem eigenen Server bereitstellen.
Ähnliche Projekte