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

Вакансий много, откликаться долго. К каждой надо писать сопроводительное письмо, чтобы выделиться среди сотен( кого я обманываю - тысяч) других откликов.
Главная боль
Не умею писать сопроводительные письма. Надо как-то себя презентовать, показать заинтересованность. Если отправлять всем один шаблон — компании это даже читать не будут.( хотя есть подозрение что они вобще не читают ни чего)
Что делать?
Ожидание: Сделать полный автоотклик на все 1500+ вакансий с уникальными письмами для каждой.
Реальность: В публичном API HeadHunter нет функции автоотклика. В приватном API тоже не нашел такой возможности (плюс нужна регистрация приложения).
Решение!: Если нельзя автоматизировать отклики — автоматизирую хотя бы генерацию писем!

Архитектура решения
Решение получилось очень простое и понятное каждому, сейчас покажу.
Сделал систему из двух частей:
🔧 Chrome Extension
Расширение Встраивается в страницы HH.ru
Забирает куки авторизации для доступа к моему резюме
Извлекает ID вакансии из URL страницы
Добавляет кнопки "Сохранить резюме" и "Сгенерить письмо"
Показывает готовый текст в попапе
⚙️ NestJS Backend
REST API для работы с резюме и вакансиями
Интеграция с OpenAI GPT для парсинга и генерации
Запросы к приватному API HH.ru (через куки)
Запросы к публичному API HH.ru (для вакансий)
Локальное хранение данных в файлах
🤖 AI-движок
Парсит HTML резюме → извлекает структурированные данные
Получает данные вакансии через публичное API HH.ru
Сопоставляет навыки из резюме с требованиями вакансии
Генерирует персональное сопроводительное письмо на основе данных вакансии и резюме
Стек: TypeScript, NestJS, Chrome Extension
Как это работает?

Этап 1: Сохраняем резюме
Переходим на страницу своего резюме на HH.ru
Открываем расширение и жмем "Сохранить резюме"
Расширение забирает куки с авторизацией
Отправляет запрос на HH.ru с ключами авторизации
Получает HTML нашего резюме в ответе
Отправлят HTML в OpenAI для очистки и структурирования
AI возвращает чистые данные резюме в удобном JSON формате
Пример кода для сохранения резюме
sendButton.addEventListener('click', async () => {
sendButton.disabled = true;
sendButton.textContent = "Сохранение...";
statusDiv.textContent = "Сохранение резюме на бэкенд...";
try {
// Отправляем сообщение
const response = await chrome.runtime.sendMessage({action: 'saveResume'});
if (response.success) {
statusDiv.textContent = "✅ Резюме успешно сохранено и проанализировано!";
statusDiv.className = "status success";
} else {
throw new Error(response.error || 'Неизвестная ошибка');
}
} catch (error) {
console.error("Resume save failed:", error);
statusDiv.textContent = `❌ Ошибка: ${error.message}`;
statusDiv.className = "status error";
}
});Этап 2: Генерируем письмо для вакансии
Переходим на страницу вакансии которая интересует
Жмем "Сгенерировать письмо" в расширении
Расширение забирает ID вакансии из URL
Запрашивает данные через бесплатное API HH.ru
Отправляет резюме + вакансию в OpenAI
AI генерирует персональное письмо на основе промпта
Показываем письмо в попапе для копирования
Пример промта для создания сопроводительного письма
export const USER_PROMPTS = {
COVER_LETTER: (resumeData: any, vacancyData: any) => `
Напиши короткое сопроводительное письмо на основе резюме и вакансии.
РЕЗЮМЕ:
${JSON.stringify(resumeData, null, 2)}
ВАКАНСИЯ:
${JSON.stringify(vacancyData, null, 2)}
Правила:
- Начинай с "Здравствуйте! Заинтересовала ваша вакансия"
- Максимум 2 абзаца
- Пиши как живой человек - естественно и без формальностей
- Упомяни конкретные технологии и проекты из резюме
- Покажи, что читал вакансию - упомяни название позиции, но НЕ название компании
- Свяжи свой опыт с требованиями вакансии
- Используй живые фразы: "хочется", "интересно", "готов"
- Избегай: "выразить интерес", "отличная возможность", "профессиональный рост"
- НЕ упоминай названия компаний/проектов - пиши про технологии и задачи
- Пиши от первого лица
- Закончи естественно, без "С уважением"
- НЕ придумывай лишние детали
Пример стиля:
"Здравствуйте! Заинтересовала ваша вакансия Node.js-разработчика — у меня есть реальные проекты на Node.js и TypeScript. Строил микросервисный бэкенд на NestJS с PostgreSQL, делал gRPC-интеграции и AI-классификацию, писал Telegram-бота с оплатами и API Gateway. Хочется применять эти технологии в новых проектах."
Ответ: только текст письма.
`
};
// Системный промпт
export const SYSTEM_PROMPTS = {
COVER_LETTER: 'Ты пишешь короткие сопроводительные письма. Пиши как живой человек - естественно, но профессионально. Избегай шаблонов и формальностей. Фокусируйся на конкретных технологиях и опыте.'
};
Проблемы и решения
Проблема №1: Слишком формальные сопроводительные
Решение: Оптимизация промпта:
Живые фразы: «хочется», «интересно», «готов»
Избегать: «выразить интерес», «отличная возможность»
Пример желаемого стиля прямо в промпте
Проблема №2: Доступ к OpenAI в России
Решения:
Российские решения — YandexGPT или GigaChat от Сбера
Локальная LLM — лучший вариант! Бесплатно и без ограничений
Рекомендую: Модель T-Pro 2.0 от Тинькофф (квантизированная версия). Спокойно запустил на старушке RTX 4070 Ti — работает отлично!
Итоги
Из джуниора, который боялся писать письма, превратился в джуниора с AI-помощником, который боится писать письма, но не боится кликать на кнопочку сгенерировать.
Юзайте посаны кому надо все фри, как картофель: