Как устроен поисковик по миллионам вакансий без посредников

18 авг 2026
395
78
4 недели

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

freehire preview

Проект freehire решает эту проблему прямолинейным техническим способом: он парсит данные напрямую из систем отслеживания кандидатов (ATS), минуя посредников. В базе собрано свыше 3,3 миллиона активных вакансий от почти 300 тысяч компаний. Весь стек открыт под лицензией MIT, включая сборщики данных, веб-интерфейс, поисковый движок и API.

Откуда берутся данные

Большинство технологических компаний публикуют вакансии через специализированные сервисы вроде Greenhouse, Lever, Workday, Ashby или iCIMS. Создатели freehire написали адаптеры к 92 таким платформам, а также подключили около сотни сторонних бордов и прямые фиды крупных корпораций.

Схема работы конвейера выглядит следующим образом:

Реклама
  1. Воркер обходит борды и считывает свежие вакансии. Добавить компанию обычно можно одной строчкой в YAML-файле, указав название и идентификатор в ATS.
  2. Данные нормализуются в единый формат. Если одна вакансия опубликована на нескольких площадках, система склеивает дубликаты по стабильному ключу.
  3. Фильтры по грейдам, зарплатам, локациям и стеку строятся по строгим словарям. Здесь нет ненадежных эвристик, система не пытается угадывать данные наугад.
  4. Отдельный воркер скачивает саму форму отклика из целевой 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

Для кого этот проект

Репозиторий будет полезен в трех случаях:

  1. Вы ищете работу в международных компаниях и устали от мусорных агрегаторов. Веб-версия дает прямые ссылки на ATS работодателей без навязчивых посредников.
  2. Вы хотите собрать собственный агрегатор, Telegram-канал с вакансиями или бота. Открытые адаптеры к 92 ATS экономят сотни часов на написании парсеров.
  3. Вам интересен пример взрослого Go-проекта без перегруженных ORM, со строгой типизацией SQL, разделением на независимые воркеры и интеграцией с современным поисковым движком.

Проект выглядит зрелым, а его открытость дает возможность любому разработчику отправить пулл-реквест с новой компанией в одну строчку YAML. Попробовать сервис вживую можно на сайте проекта или развернув контейнеры на своем сервере.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.