Jak działa wyszukiwarka ofert pracy wśród milionów wakatów bez pośredników
Szukanie pracy w zagranicznych lub dużych firmach IT często zamienia się w rutynę z niemiłymi niespodziankami. Znajdujesz interesujące stanowisko na agregatorze, klikasz link, a wakat został zamknięty miesiąc temu. Albo trafiasz na niekończące się kopie tej samej oferty od agencji rekrutacyjnych, które nawet nie podają nazwy końcowego pracodawcy.

Projekt freehire rozwiązuje ten problem prostym podejściem technicznym: parsuje dane bezpośrednio z systemów śledzenia kandydatów (ATS), omijając pośredników. Baza danych zawiera ponad 3,3 miliona aktywnych wakatów od prawie 300 000 firm. Cały stos technologiczny jest otwarty na licencji MIT, w tym kolektory danych, interfejs webowy, wyszukiwarka i API.
Skąd pochodzą dane
Większość firm technologicznych publikuje oferty pracy za pośrednictwem specjalistycznych platform takich jak Greenhouse, Lever, Workday, Ashby czy iCIMS. Twórcy freehire napisali adaptery dla 92 takich platform, a także połączyli około stu zewnętrznych tablic ogłoszeń i bezpośrednie kanały z dużych korporacji.
Potok danych działa w następujący sposób:
- Worker przeszukuje tablice ogłoszeń i pobiera nowe oferty. Dodanie firmy zwykle wymaga jednej linii w pliku YAML, określającej nazwę i identyfikator w systemie ATS.
- Dane są normalizowane do jednolitego formatu. Jeśli jedna oferta jest publikowana na wielu platformach, system scala duplikaty za pomocą stabilnego klucza.
- Filtry dotyczące poziomów stanowisk, wynagrodzenia, lokalizacji i stosu technologicznego są budowane ze ścisłych słowników. Nie ma tutaj zawodnych heurystyk — system nie próbuje zgadywać danych na chybił trafił.
- Odrębny worker pobiera rzeczywisty formularz aplikacyjny z docelowego systemu ATS, zachowując oryginalną strukturę pól.
Co jeszcze kryje się w środku oprócz katalogu wakatów
Wyszukiwarka to tylko witryna sklepowa. Wokół bazy wakatów deweloperzy zbudowali pełnowartościowe środowisko pracy dla kandydata.
Generator CV i sprawdzanie dopasowania
Repozytorium zawiera kreator CV, który generuje pliki PDF zoptymalizowane pod kątem automatycznego parsowania przez systemy ATS. System porównuje wymagania stanowiska z Twoim doświadczeniem i oblicza deterministyczny wynik kompatybilności. Po połączeniu z modelem językowym dostarcza ukierunkowane sugestie dotyczące CV pod kątem konkretnych aplikacji bez fabrykowania doświadczenia.
Śledzenie odpowiedzi z pocztą przychodzącą
Po wysłaniu aplikacji śledzenie jest kontynuowane na tablicy Kanban z aktualizacjami statusu. Zintegrowana bramka e-mail łączy odpowiedzi rekrutera z konkretnymi kartami aplikacji, utrzymując korespondencję w porządku zamiast gubić ją w ogólnej skrzynce odbiorczej.
Asystent i rozszerzenie przeglądarki
Opracowano rozszerzenie paska bocznego dla Chrome. Gdy otwierasz stronę z ofertą pracy na dowolnej stronie, wtyczka odczytuje tekst strony, porównuje go z Twoim profilem i wypełnia formularz aplikacyjny za Ciebie. Dla osób preferujących pracę przez klientów LLM, takich jak Claude Desktop, autorzy udostępniają osobny serwer MCP.
Architektura i stos technologiczny
Kod źródłowy jest napisany w Go z użyciem frameworka webowego Fiber v2. Architektonicznie backend jest wyraźnie rozdzielony: serwer API obsługuje wyłącznie żądania klientów, podczas gdy cała praca w tle została przeniesiona do oddzielnych jednorazowych workerów. Wygodnie uruchamia się je przez cron lub wewnątrz kolejek.
cmd/ Точки входа: HTTP-сервер и консольные воркеры
sources/ Файлы конфигурации источников вакансий (YAML)
migrations/ Схема PostgreSQL для sqlc и initdb
web/ Интерфейс на SvelteKit 2
internal/ Внутренние пакеты предметной области
sources/ Адаптеры под конкретные ATS (Workday, Lever, etc.)
pipeline/ Пайплайн сбора, валидации и дедупликации
cv/ cvedit/ Генерация структурированных резюме в PDF
inbox/ Обработка и связывание почты рекрутеров
" alt="freehire architecture">
Do przechowywania i szybkiego wyszukiwania wykorzystywana jest kombinacja komponentów:
- PostgreSQL z rozszerzeniem pgvector przechowuje główne encje i osadzenia wektorowe na potrzeby wyszukiwania semantycznego.
- sqlc generuje kod z typami bezpiecznymi do pracy z bazą danych z zwykłych zapytań SQL — żaden ORM nie jest używany.
- Meilisearch obsługuje wyszukiwanie pełnotekstowe i natychmiastowe filtrowanie fasetowe.
- SvelteKit 2 (na Svelte 5 runes) i Tailwind 4 tworzą szybki frontend z SSR.
- Redis i MinIO odpowiadają za cache, ograniczanie liczby żądań i przechowywanie obiektów dla plików.
Szybki start i praca z API
Możesz uruchomić lokalną kopię usługi wraz ze wszystkimi zależnościami przez Docker:
make up
" alt="docker compose up">
Polecenie uruchomi bazę danych, wyszukiwarkę, API i interfejs webowy na porcie 80. Dostępność można sprawdzić prostym żądaniem curl:
curl localhost:8080/health
curl localhost:8080/api/v1/jobs
" alt="curl request">
Przy okazji, publiczne API projektu jest dostępne bez kluczy ani autoryzacji. Jeśli potrzebujesz dostępu do świeżych wakatów dla swojego bota lub projektu hobbystycznego, po prostu wywołaj endpoint https://freehire.me/api/v1/jobs. Wszystkie odpowiedzi są zwracane w przewidywalnym formacie JSON ze strukturalnymi metadanymi i paginacją.
Aby uruchomić kolektory danych, używane są polecenia konsolowe w cmd/:
# Обход конкретного каталога ATS
go run ./cmd/ingest sources/greenhouse.yml
# Сброс очереди индексации в Meilisearch
go run ./cmd/search-drain
# Извлечение вакансий из Telegram-каналов
go run ./cmd/tg-extract
" alt="console commands">
Dla kogo jest ten projekt
Repozytorium będzie przydatne w trzech przypadkach:
- Szukasz pracy w międzynarodowych firmach i masz dość niskiej jakości agregatorów. Wersja webowa daje bezpośrednie linki do systemów ATS pracodawców bez natrętnych pośredników.
- Chcesz zbudować własny agregator, kanał Telegram z ofertami pracy lub bota. Otwarte adaptery do 92 systemów ATS oszczędzają setki godzin na pisanie parserów.
- Interesuje Cię przykład dojrzałego projektu w Go bez przeciążonych ORM, ze ścisłym typowaniem SQL, podziałem na niezależne workery i integracją z nowoczesną wyszukiwarką.
Projekt wygląda dojrzale, a jego otwartość daje każdemu deweloperowi możliwość przesłania pull requesta z nową firmą w jednej linii YAML. Możesz wypróbować usługę na żywo na stronie projektu lub wdrażając kontenery na własnym serwerze.
Powiązane projekty