РАЗРАБОТКА

resume2human нашел почту кандидата в его же коммитах

21 коммит и 746 тестов за неделю: resume2human добавил поиск личных контактов через git и показал, где ломается скоринг вакансий.

✍️ Редакция iTech News | 10.09.2026 | ⏱ 4 мин | Источник: Habr / Карьера
🛠

За шесть дней после первой публикации resume2human получил 21 коммит в девяти PR, а число тестов выросло с 345 до 746. Проект, который подбирает вакансии по резюме и ищет живых людей за ними, теперь умеет доставать контакты не только из профилей, но и из публичных git-коммитов. Для русскоязычных разработчиков это редкий кейс, где поиск работы, open source и приватность внезапно оказываются в одной комнате.

По данным Habr / Карьера, автор проекта за неделю изменил половину собственных обещаний из предыдущего материала. Изначально resume2human позиционировался как Windows-приложение без ИИ, API-ключей и автоматической рассылки: пользователь загружает резюме, инструмент обходит 24 источника вакансий, включая ATS-доски 111 компаний, региональные сайты, LinkedIn, Telegram, Threads и веб-поиск, затем считает совпадение с вакансией и показывает 1-3 релевантных контакта. Письмо кандидат пишет сам.

Главное изменение недели — новая ступень поиска личных контактов. Раньше программа могла показать имя, роль и профиль человека, который, вероятно, связан с вакансией, но не всегда давала канал связи. Платные базы вроде Apollo, Lusha, ContactOut или RocketReach решают именно эту задачу, но требуют регистрации, подписки и часто карты. Автор пошел другим путем: сначала проверять открытые источники, где сам инженер уже оставил адрес.

Самым продуктивным источником оказался git. В каждом коммите есть поле author.email. Даже если пользователь давно скрыл почту в профиле GitHub или перешел на noreply-адрес, старые публичные коммиты могли остаться в репозиториях. Новый модуль проверяет профиль GitHub, публичные push-события, верхние репозитории, GitLab-профиль, сайт или организацию, Telegram через пользовательскую сессию, затем обычный веб-поиск с открытием страниц. hunter.io оставлен последним и работает только при наличии ключа.

Важная инженерная деталь: порядок источников здесь не про красоту архитектуры, а про экономику пользователя. Если обязательным первым шагом становится платный провайдер, бесплатный инструмент для кандидата превращается в инструкцию по покупке доступа к базе контактов. Поэтому платная ступень в resume2human не формирует результат, а только закрывает дыры, если пользователь сам подключил ключ.

Автор отдельно описывает, почему поиск контактов нельзя строить по принципу «нашлось что-то похожее — покажем». Ошибка выглядит как успех: письмо уходит однофамильцу, кандидат не получает обратной связи, а получатель видит странное резюме от незнакомца. Поэтому у контактов появились признаки происхождения и достоверности: например, адрес из GitHub-коммита считается подтвержденным, если совпало имя автора коммита; адрес из поисковой выдачи может получить более слабую метку, если локальная часть почты выводится из имени. Синтетические адреса программа не показывает.

Второй пласт истории менее эффектный, но ближе к реальной разработке: за неделю нашлись баги, из-за которых инструмент честно делал не то, что от него ждали. Один из них связан со скорингом: покрытие пустого множества математически оказалось равным единице, и в конкретной логике это раздавало лишние 50 очков. Для продукта, который ранжирует вакансии по резюме, такая мелочь быстро становится не мелочью: кандидат тратит время на нерелевантные позиции, а доверие к объяснимому скорингу проседает.

Еще одно обещание тоже не выдержало встречи с практикой. В первой версии автор говорил, что приложение не будет вести статусы откликов и заменять CRM. После нескольких собственных прогонов выяснилось, что поисковик, который заканчивается файлом, плохо помогает в реальном процессе: непонятно, куда уже писал, где нужен follow-up, какие вакансии ушли в отказ, а какие зависли. В проекте появилась воронка, статусы, напоминания и аналитические разрезы. Не идеологический разворот, скорее типичный момент, когда pet-проект сталкивается с пользовательским сценарием и перестает быть демкой.

Самая спорная часть — этика и приватность. Формально инструмент читает публичные данные: профили, коммиты, страницы компаний, открытые Telegram-хэндлы. Он не перебирает SMTP и не продает базу, а хранит найденное локально в SQLite рядом с приложением. Но для индустрии это все равно неприятное зеркало. Разработчики годами публиковали личные адреса в commit history, не воспринимая git как контактную базу. Теперь такие следы становятся частью карьерного софта.

Для бизнеса вывод тоже практичный. Если компания хочет получать осмысленные отклики, ей придется лучше показывать людей за вакансиями: hiring manager, рекрутер, команда, понятный канал связи. Иначе кандидаты будут находить обходные маршруты через GitHub, GitLab и старые страницы «команда». А для разработчиков это повод проверить свои публичные коммиты: карьерный шанс и приватность иногда лежат в одном и том же поле author.email.

Поделиться: Telegram X LinkedIn