Как устроен поисковик по миллионам вакансий без посредников
Поиск работы в зарубежных или крупных IT-компаниях часто превращается в рутину с неприятными сюрпризами. Находишь интересную позицию на агрегаторе, переходишь по ссылке, а вакансия закрыта месяц назад. Или натыкаешься на бесконечные копии одного объявления от рекрутинговых агентств, которые даже не называют конечного работодателя.

Проект freehire решает эту проблему прямолинейным техническим способом: он парсит данные напрямую из систем отслеживания кандидатов (ATS), минуя посредников. В базе собрано свыше 3,3 миллиона активных вакансий от почти 300 тысяч компаний. Весь стек открыт под лицензией MIT, включая сборщики данных, веб-интерфейс, поисковый движок и API.
Откуда берутся данные
Большинство технологических компаний публикуют вакансии через специализированные сервисы вроде Greenhouse, Lever, Workday, Ashby или iCIMS. Создатели freehire написали адаптеры к 92 таким платформам, а также подключили около сотни сторонних бордов и прямые фиды крупных корпораций.
Схема работы конвейера выглядит следующим образом:
- Воркер обходит борды и считывает свежие вакансии. Добавить компанию обычно можно одной строчкой в YAML-файле, указав название и идентификатор в ATS.
- Данные нормализуются в единый формат. Если одна вакансия опубликована на нескольких площадках, система склеивает дубликаты по стабильному ключу.
- Фильтры по грейдам, зарплатам, локациям и стеку строятся по строгим словарям. Здесь нет ненадежных эвристик, система не пытается угадывать данные наугад.
- Отдельный воркер скачивает саму форму отклика из целевой ATS, сохраняя оригинальную структуру полей.
Что внутри кроме каталога вакансий
Поиск — это лишь витрина. Вокруг базы вакансий разработчики собрали полноценное рабочее место кандидата.
Генератор резюме и проверка соответствия
В репозитории есть конструктор резюме, который рендерит PDF-файлы, оптимизированные для автоматического чтения роботами ATS. Система умеет сопоставлять требования вакансии с вашим опытом и рассчитывать детерминированный скоринг совместимости. Если подключить языковую модель, она предложит точечные правки резюме под конкретный отклик, не выдумывая несуществующий опыт.
Трекер откликов с входящей почтой
После отправки заявки работа с ней продолжается на канбан-доске со статусами. Встроенный почтовый шлюз связывает входящие ответы рекрутеров с конкретной карточкой отклика, так что история переписки не теряется в общем ящике.
Ассистент и расширение для браузера
Для Chrome разработано боковое расширение. Когда вы открываете страницу вакансии на любом сайте, плагин считывает текст страницы, сверяет его с вашим профилем и заполняет форму отклика за вас. Для тех, кто предпочитает работать через LLM-клиенты вроде Claude Desktop, авторы вынесли отдельный MCP-сервер.
Архитектура и стек технологий
Кодовая база написана на Go с использованием веб-фреймворка Fiber v2. Архитектурно бэкенд четко разделен: API-сервер занимается исключительно обработкой клиентских запросов, а вся фоновая работа вынесена в отдельные одноразовые воркеры. Их удобно запускать по cron или внутри очередей.
cmd/ Точки входа: HTTP-сервер и консольные воркеры
sources/ Файлы конфигурации источников вакансий (YAML)
migrations/ Схема PostgreSQL для sqlc и initdb
web/ Интерфейс на SvelteKit 2
internal/ Внутренние пакеты предметной области
sources/ Адаптеры под конкретные ATS (Workday, Lever, etc.)
pipeline/ Пайплайн сбора, валидации и дедупликации
cv/ cvedit/ Генерация структурированных резюме в PDF
inbox/ Обработка и связывание почты рекрутеров
Для хранения и быстрого поиска задействована связка компонентов:
- PostgreSQL с расширением pgvector хранит основные сущности и векторные эмбеддинги для семантического поиска.
- sqlc генерирует типобезопасный код для работы с базой из чистых SQL-запросов, ORM не используется.
- Meilisearch отвечает за полнотекстовый поиск и мгновенную фасетную фильтрацию.
- SvelteKit 2 (на рунах Svelte 5) и Tailwind 4 формируют быстрый SSR-фронтенд.
- Redis и MinIO закрывают задачи кэширования, лимитов запросов и объектного хранилища файлов.
Быстрый запуск и работа с API
Поднять локальную копию сервиса вместе со всеми зависимостями можно через Docker:
make up
Команда запустит базу данных, поисковый движок, API и веб-интерфейс на порту 8080. Проверить доступность можно простым curl-запросом:
curl localhost:8080/health
curl localhost:8080/api/v1/jobs
Кстати, публичный API проекта доступен без ключей и авторизации. Если вам нужен доступ к свежим вакансиям для своего бота или пет-проекта, достаточно дернуть эндпоинт https://freehire.me/api/v1/jobs. Все ответы возвращаются в предсказуемом JSON-формате со структурированными метаданными и пагинацией.
Для запуска сборщиков данных используются консольные команды в cmd/:
# Обход конкретного каталога ATS
go run ./cmd/ingest sources/greenhouse.yml
# Сброс очереди индексации в Meilisearch
go run ./cmd/search-drain
# Извлечение вакансий из Telegram-каналов
go run ./cmd/tg-extract
Для кого этот проект
Репозиторий будет полезен в трех случаях:
- Вы ищете работу в международных компаниях и устали от мусорных агрегаторов. Веб-версия дает прямые ссылки на ATS работодателей без навязчивых посредников.
- Вы хотите собрать собственный агрегатор, Telegram-канал с вакансиями или бота. Открытые адаптеры к 92 ATS экономят сотни часов на написании парсеров.
- Вам интересен пример взрослого Go-проекта без перегруженных ORM, со строгой типизацией SQL, разделением на независимые воркеры и интеграцией с современным поисковым движком.
Проект выглядит зрелым, а его открытость дает возможность любому разработчику отправить пулл-реквест с новой компанией в одну строчку YAML. Попробовать сервис вживую можно на сайте проекта или развернув контейнеры на своем сервере.
