Месяцы отправки резюме в тишину.
Поэтому я построил фильтр, который был мне нужен.
740 вакансий оценено. 68 откликов. 12 собеседований. 1 оффер.
Я был его первым пользователем. Я получил работу. Потом открыл код.
Вставьте вакансию. На вашей машине он скажет, открыта ли она ещё и подходит ли вам.
Он адаптирует ваше резюме и готовит черновики ответов. Вы нажимаете «Отправить».
Мой собственный поиск, на полпути, с интерфейсом на испанском.
Компании используют ИИ для фильтрации кандидатов. Я дал кандидатам ИИ, чтобы выбирать компании.
Через полгода я ушёл с этой работы.
Теперь мы строим career-ops, чтобы вы могли получить свою.
Люди, пришедшие после меня, записали, как их наняли.
Каждая карточка — публичный issue, который можно открыть. Получили свою работу? Оставьте свою карточку →
⭐ Если career-ops вам помог, звезда поможет следующему человеку его найти.
## Ваша очередь
Вставьте одну вакансию, на которую собирались откликнуться сегодня вечером. Если в ответ придёт не откликаться, вы только что вернули себе вечер. Если придёт план, вы знаете, что делать дальше.
```bash
npx @santifer/career-ops init
```
## Вам не обязательно искать в одиночку
Тишина после нажатия «отправить» не про вас. Достаточно людей увидели то же самое, чтобы записать практику в шесть строк:
> Откликаться лучше, но на меньшее. Сигнал важнее объёма. Доказательства важнее ключевых слов. Решает человек. Сначала локально. Достоинство по обе стороны стола.
Найм сам себя не починит. Люди, которые через него проходят, могут, и они уже в комнате: сверяют заметки и чинят друг другу настройки.
[Именно здесь пишется исправление](CONTRIBUTING.md). Комната, а не клуб. **Давайте строить вместе.**
## Спонсоры
career-ops бесплатен для кандидатов, навсегда. Эти компании спонсируют проект:
SerpApi · Build a portfolio project with live search data. SerpApi gives developers structured JSON/Markdown from Google Search, Maps, Shopping, and other engines through a simple API call.
> Спонсорство покупает чётко обозначенную видимость, но никогда влияние: никакая сумма денег не меняет дорожную карту и ничего не размещает в продукте. Спонсоры никогда не появляются в оценках, рейтингах или рекомендациях.
## Что career-ops делает для вас
Вставьте вакансию. Он скажет, стоит ли она этого вечера.
- **Ещё открыта?** Он проверяет, что объявление всё ещё активно, прежде чем вы напишете хоть слово.
- **Не ваше?** Он оценивает роль против вашего настоящего резюме и советует пропустить слабое совпадение. Вы можете его переубедить.
- **Стоит того?** Он готовит черновики резюме, сопроводительного письма и ответов. Вы их читаете. Вы их отправляете.
- **С кем говорить?** Он находит человека и готовит черновик сообщения. Он никогда его не отправляет.
- **Куда всё это уходит?** Каждый отклик остаётся на вашей машине. Нам ничего не загружается.
- **Что мне выучить?** После серии отказов он называет пробел.
Первые запуски шероховатые. Он вас ещё не знает. Поговорите с ним: ваше резюме, чего вы хотите, от чего отказываетесь. Считайте это первой неделей рекрутера.
При первом запуске он спрашивает всё это в чате. Ничего не нужно настраивать вручную.
## Чего career-ops не делает
- **Отправлять отклик автоматически.** Он готовит черновик ответа для каждого поля; вы проверяете и нажимаете «Отправить». Скрипт никогда не делает POST (`prepare-application.mjs`).
- **Не отправляет письма.** Только черновики. Во всём коде нет ни одного почтового транспорта.
- **Не звонит домой.** Без телеметрии, без нашего бэкенда. Ваше резюме идёт с вашей машины к выбранному вами AI-провайдеру и больше никуда. Единственный публичный реестр: этот репозиторий, `HIRED.md` и его issues.
- **Не толкает откликаться ниже 4.0/5.** Скажет этого не делать. Вы можете проигнорировать, и он об этом скажет.
Он переформулирует ваше резюме; выдумывать не имеет права никогда. Проверка в коде останавливает PDF, если в нём есть цифры или факты, которых нет ни в вашем резюме, ни в `article-digest.md`, но оценить каждую переформулировку она пока не может. Читайте каждое резюме перед отправкой. Подробности в [FAQ](#faq).
## Возможности
| Функция | Описание |
| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- |
| **Оценка A-H** | Резюме роли, соответствие резюме (с весом каждого требования для этой вакансии и пометкой, взят ли вес из формулировки описания, его структуры или из оценки, с подписью для каждого требования; оценка никогда не может быть верхнего уровня), стратегия уровня, исследование компенсации, персонализация, подготовка к собеседованию (STAR+R), плюс проверка легитимности вакансии в блоке G (открыта ли она ещё, не повторная ли это публикация: наблюдения, а не вердикты) и сигнал разрешения на работу, помечающий описание с явным отказом в спонсорстве визы как жёсткий блокер |
| **Human-in-the-Loop** | ИИ оценивает и рекомендует, вы решаете и действуете. Система никогда не отправляет отклик: последнее слово всегда за вами |
| **Генерация ATS PDF** | Резюме, читаемые ATS и адаптированные под каждое описание вакансии на основе вашего собственного опыта, в дизайне Space Grotesk + DM Sans |
| **Генератор сопроводительных писем** | Сопроводительные письма на основе исследования с зеркалированием ключевых слов, четырьмя интерактивными вопросами об угле подачи (почему/проблемы/подход/тон), утверждением черновика в чате и A4 PDF через тот же конвейер HTML + Playwright, что и для резюме. Готовит черновик при каждой оценке; завершить и сгенерировать по запросу через `/career-ops cover` |
| **За пределами резюме** | Исследование компании ([`deep`](modes/deep.md)) раскрывает ИИ-стратегию, недавние шаги, инженерную культуру и угол, под которым стоит подать ваш профиль. Поиск контактов ([`contacto`](modes/contacto.md)) определяет hiring-менеджера, рекрутера или коллегу из команды, к кому стоит обратиться, и готовит сообщение для LinkedIn до 300 символов под каждый тип контакта. Черновики формальных писем-откликов ([`email`](modes/email.md)) превращают оценённый отчёт или вставленное описание в тему, текст и чеклист вложений, ничего не отправляя, не подавая и не кликая. Отклик ставит вас в очередь, исследование даёт вам разговор. |
| **Анализ паттернов** | Паттерны отказов и доля прохождения по каналам ATS (`analyze-patterns.mjs`), статистика воронки за весь поиск (`stats.mjs`), выявление перепубликаций, которые могут указывать на вакансию-призрак (`detect-reposts.mjs`) |
Всё остальное, что он делает
| Функция | Описание |
| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- |
| **Авто-конвейер** | Вставьте URL и получите полную оценку + PDF + запись в трекере |
| **Банк историй для собеседований** | Накапливает истории STAR+Reflection между оценками: 5-10 главных историй, которые можно адаптировать под заданные вам поведенческие вопросы |
| **Скрипты переговоров** | Фреймворки переговоров о зарплате, ответ на географическую скидку, рычаг конкурирующих офферов |
| **Черновики писем-откликов** | Формальные письма рекрутеру, по рекомендации или холодные отклики из отчёта или вставленного описания, с темой, чеклистом вложений, обоснованными пунктами соответствия и блоком контактов из профиля. Только черновики: career-ops никогда не отправляет, не подаёт и не кликает ничего. |
| **Сканер порталов** | 100+ предварительно настроенных компаний (Anthropic, OpenAI, ElevenLabs, Retool, n8n...) + собственные поисковые веб-запросы по Ashby, Greenhouse, Lever, Wellfound |
| **Поиск профинансированных компаний** | Команда `company:funded` (сначала просмотр) показывает компании с недавним финансированием и диагностику источников из структурированных публичных лент, не меняя ваши данные |
| **Пакетная обработка** | Параллельная оценка headless CLI-воркерами (`claude -p` / `opencode run`) |
| **Dashboard TUI** | Терминальный интерфейс для просмотра, фильтрации и сортировки вашего конвейера |
| **Целостность конвейера** | Автоматическое слияние, дедупликация, нормализация статусов, проверки состояния |
| **Набор для собеседований** | Планы подготовки по временным блокам, тренировочные сессии с обратной связью, разборы после собеседования ([`interview/`](modes/interview/README.md)) и детектор тревожных признаков компании ([`interview-redflag`](modes/interview-redflag.md)) |
| **Этап оффера** | Сопровождение чтения контракта: проход по пунктам плюс список вопросов для юриста ([`offer-prep`](modes/offer-prep.md)), и анализатор разрыва между желаемой, заявленной и фактической зарплатой (`salary-gap.mjs`) |
| **Фоллоу-апы и ответы** | Калькулятор ритма фоллоу-апов и заготовленные напоминания (`followup-cadence.mjs`, `followup-seed.mjs`); классификация ответов работодателя в обновления трекера ([`reply-watch`](modes/reply-watch.md)) |
| **Система плагинов** | Опциональные интеграции (Gmail, Notion, Apify + реестр сообщества), выключены по умолчанию; см. [docs/PLUGINS.md](docs/PLUGINS.md) |
## Как это работает
## Быстрый старт
**Самый быстрый путь, одна команда:**
```bash
npx @santifer/career-ops init
```
> 💡 `npx` идёт вместе с [Node.js](https://nodejs.org): он запускает установщик один раз,
> ничего не устанавливая глобально. Ещё нет Node? Сначала установите его.
> (Уже пользуетесь CLI Claude Code / Codex? Тогда он у вас уже есть.)
Это клонирует последний релиз в `./career-ops` и устанавливает зависимости. Затем:
```bash
cd career-ops
claude # or codex / qwen / opencode / agy / grok — open your AI CLI here
```
**При первом запуске career-ops проведёт вас через настройку (ваше резюме, профиль и целевые роли) просто в разговоре. Ничего не нужно редактировать вручную.**
Хотите настроить вручную? (git clone)
```bash
git clone https://github.com/career-ops-hq/career-ops.git
cd career-ops && npm install
npx playwright install chromium # only needed for PDF generation
# On a non-Debian/Ubuntu Linux distro (Fedora, Arch, ...), Chromium's system
# libraries aren't installed by the line above — install them yourself with
# your distro's package manager if PDF generation fails to launch the browser
# (Playwright's own docs list the required libraries per platform).
# 2. Open your AI CLI in this directory. On first launch it walks you
# through setup (your CV, profile and target roles) by chatting
claude # or codex / opencode / qwen / agy / grok
# Then ask your CLI to adapt the system to you:
# "Change the archetypes to backend engineering roles"
# "Translate the modes to English"
# "Add these 5 companies to portals.yml"
# "Update my profile with this CV I'm pasting"
# 3. Start using
# Вставьте URL вакансии или текст описания, чтобы запустить auto-pipeline.
# Все остальные режимы и способ вызвать их в вашем CLI: см. раздел «Использование» ниже.
```
### Глобальная установка
```bash
npm i -g @santifer/career-ops
```
Это устанавливает бинарник `career-ops` глобально, так что вы можете запускать `career-ops init [folder]` без `npx`. `init` — его единственная команда: она создаёт рабочее пространство, а всё дальнейшее происходит внутри вашего AI-CLI (см. «Использование» ниже), а не через этот бинарник.
**Что выбрать?**
- `npx @santifer/career-ops init`: лучше всего для первого запуска; создаёт отдельную папку проекта.
- `npm i -g @santifer/career-ops`: если вам удобнее набирать `career-ops init`, чем форму с `npx`. Других команд он не добавляет.
### Другие способы запуска
- **Из любой папки, как плагин Claude Code:** [docs/CLAUDE_PLUGIN.md](docs/CLAUDE_PLUGIN.md).
- **Без ИИ-CLI:** автономные скрипты для Gemini, Ollama и OpenAI-совместимых моделей оценивают вакансию самостоятельно. См. [docs/SCRIPTS.md](docs/SCRIPTS.md#geminieval--ollamaeval--openaieval).
> **Система спроектирована так, чтобы её настраивал сам ваш AI-CLI.** Режимы, архетипы, веса оценки, скрипты переговоров: просто попросите его изменить их. Он читает те же файлы, которыми пользуется, поэтому точно знает, что редактировать.
Смотрите [docs/SETUP.md](docs/SETUP.md) для полного руководства по настройке, [docs/RUNNING_ON_A_BUDGET.md](docs/RUNNING_ON_A_BUDGET.md) для дешёвого запуска career-ops на своих или локальных моделях (и [docs/FREE_TIER.md](docs/FREE_TIER.md) для запуска без затрат на бесплатном тарифе Antigravity CLI), [docs/AUTOMATION.md](docs/AUTOMATION.md) для планирования регулярных сканирований и рецепта отбора в шортлист без расхода токенов, [docs/APPLY_AUTOFILL.md](docs/APPLY_AUTOFILL.md) для деталей автозаполнения форм ATS, [docs/LINKEDIN_JOIN.md](docs/LINKEDIN_JOIN.md) для сверки экспорта ваших контактов LinkedIn с компаниями в вашей воронке, и [docs/FAQ.md](docs/FAQ.md) для ответов на типичные вопросы по настройке, включая [как происхождение историй предотвращает выдуманные цифры](docs/FAQ.md#why-does-career-ops-refuse-to-use-a-number-from-my-story-bank). Принципы дизайна в [ARCHITECTURE.md](ARCHITECTURE.md); потоки выполнения в [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md).
## Использование
Вставьте URL или описание вакансии в ваш ИИ-CLI. career-ops проверяет, что вакансия по ссылке ещё открыта (у вставленного текста нет ссылки для проверки), оценивает её по вашему резюме, пишет отчёт, адаптирует ваше резюме (по умолчанию в PDF) и добавляет строку в трекер. Этого хватает в большинство дней. Всё остальное — режимы, которые вы вызываете по названию. Если вакансию не удаётся прочитать, пайплайн останавливается и просит вставить текст.
### Как вызвать режим
| CLI | Как вызвать `scan` |
| --- | --- |
| Claude Code, OpenCode, Antigravity CLI (`agy`), Grok Build CLI | `/career-ops scan` |
| Pi | `/skill:career-ops scan` |
| Codex, Qwen, Cursor или любой другой поддерживаемый CLI | Обычным языком: "Run the career-ops scan mode" |
`/career-ops` без продолжения показывает меню команд в CLI, которые его используют. Обычный язык работает в любом поддерживаемом CLI. Как плагин Claude Code команда выглядит так: `/career-ops:career-ops`.
У всех них один общий роутер, `.agents/skills/career-ops/SKILL.md`, и одни и те же файлы `modes/*.md`, поэтому любой CLI направляет запрос одинаково (режимам, активно использующим браузер, также нужны инструменты Playwright). Slash-команды в Codex не гарантированы: просите обычным языком или запустите один промпт в headless-режиме через `codex exec "Evaluate this JD with career-ops auto-pipeline: https://company.com/jobs/123"` ([docs/CODEX.md](docs/CODEX.md)). Как запускать career-ops в каждом поддерживаемом CLI, headless-команды там, где они есть, и заметки по настройке отдельных CLI — в [docs/SUPPORTED_CLIS.md](docs/SUPPORTED_CLIS.md).
### Повседневные команды
| Команда | Что делает |
| --- | --- |
| *вставьте URL или описание вакансии* | Полный пайплайн: проверка, что вакансия ещё открыта (только для URL), оценка A-G плюс H при высокой оценке, отчёт, адаптированное резюме (по умолчанию PDF), строка в трекере |
| `scan` | Сканирует ваши порталы в поисках новых вакансий и добавляет их во входящие (`data/pipeline.md`) |
| `pipeline` | Обрабатывает URL, ожидающие во входящих (уровни standard и premium могут пропускать явные несоответствия) |
| `apply` | Заполняет форму отклика вместе с вами, поле за полем. Останавливается перед отправкой |
| `tracker` | На каком этапе каждый отклик |
| `followup` | Какие отклики пора напомнить о себе, с черновиками |
Все команды по этапам поиска
`oferta`, `ofertas` и `contacto` сохраняют исходные испанские названия: предложение, предложения, контакт.
**Найти вакансии**
| Команда | Что делает |
| --- | --- |
| [`scan`](modes/scan.md) | Сканирует порталы и находит новые вакансии |
| [`discover`](modes/discover.md) | Превращает список названий компаний в сканируемые ATS-доски. По умолчанию показывает только предпросмотр и добавляет их в `portals.yml` лишь с `--write` (без токенов) |
| [`pipeline`](modes/pipeline.md) | Обрабатывает отложенные URL из входящих (`data/pipeline.md`) |
| [`triage`](modes/triage.md) | Быстрая первичная оценка «стоит / не стоит» по `modes/_brief.md` перед полной оценкой (файлы не пишет) |
| [`batch`](modes/batch.md) | Оценивает много вакансий headless-воркерами (параллельно с Claude, по одной с другими CLI) |
| [`titles`](modes/titles.md) | Предлагает смежные названия должностей по вашему резюме, чтобы расширить поиск |
**Оценить вакансию**
| Команда | Что делает |
| --- | --- |
| *вставьте URL или описание вакансии* | [Auto-pipeline](modes/auto-pipeline.md): оценка + отчёт + адаптированное резюме (по умолчанию PDF) + запись в трекере |
| [`oferta`](modes/oferta.md) | Только оценка, блоки A–G плюс H при высокой оценке (без PDF) |
| [`ofertas`](modes/ofertas.md) | Сравнивает и ранжирует несколько вакансий |
| [`deep`](modes/deep.md) | Промпт для глубокого исследования компании |
| [`eu-swe`](modes/regional/eu-swe.md) | Калибрует европейский отклик на позицию в разработке ПО перед резюме, откликом или интервью |
**Отклик**
| Команда | Что делает |
| --- | --- |
| [`pdf`](modes/pdf.md) | ATS-оптимизированное резюме в PDF |
| [`ats`](modes/ats.md) | Проверка совместимости сгенерированного резюме с ATS: оценка и исправимые проблемы |
| [`text`](modes/text.md) | Адаптированное резюме в markdown (повторяет `cv.md`, без PDF) |
| [`latex`](modes/latex.md) | Экспортирует резюме в LaTeX/Overleaf `.tex` |
| [`latex-tex`](modes/latex-tex.md) | Адаптирует ваш собственный `resume.tex` на месте (по желанию; `cv.md` остаётся по умолчанию) |
| [`cover`](modes/cover.md) | Сопроводительное письмо по вставленному описанию вакансии или по оценённому отчёту (`cover {slug}`) |
| [`email`](modes/email.md) | Черновик официального письма-отклика. Только черновик: ничего не отправляет и не нажимает |
| [`contacto`](modes/contacto.md) | Находит нанимающего менеджера, рекрутера или коллегу и готовит черновик сообщения в LinkedIn |
| [`apply`](modes/apply.md) | Живой помощник подачи (Playwright из этого репозитория). Не отправляет |
**Интервью**
| Команда | Что делает |
| --- | --- |
| [`interview-prep`](modes/interview-prep.md) | Документ подготовки к интервью под конкретную компанию |
| [`interview/plan`](modes/interview/plan.md) | План подготовки по временным блокам к предстоящему интервью |
| [`interview/practice`](modes/interview/practice.md) | Тренировочное интервью, по одному вопросу, с обратной связью |
| [`interview/debrief`](modes/interview/debrief.md) | Разбор после интервью: закрыть пробелы, предсказать следующий раунд |
| [`interview-redflag`](modes/interview-redflag.md) | Анализирует тревожные признаки работодателя, прежде чем вы к нему присоединитесь |
**После отклика**
| Команда | Что делает |
| --- | --- |
| [`tracker`](modes/tracker.md) | Обзор статусов откликов |
| [`followup`](modes/followup.md) | Ритм фоллоу-апов: помечает просроченные отклики, генерирует черновики |
| [`reply-watch`](modes/reply-watch.md) | Классифицирует ответы работодателей и предлагает обновления трекера |
| [`outcome`](modes/outcome.md) | Записывает результат отклика и архивирует его артефакты |
| [`offer-prep`](modes/offer-prep.md) | Читает вместе с вами полученный оффер или договор: разбор пунктов и вопросы юристу (не юридическая консультация) |
**Ваш профиль и резюме**
| Команда | Что делает |
| --- | --- |
| [`interview`](modes/interview.md) | Настройка профиля: интерактивное интервью о вашем опыте, из которого строятся резюме и профиль (это не тренировка интервью) |
| [`intake`](modes/intake.md) | Создаёт или дополняет профиль по файлам из `documents/` (основное резюме, экспорт LinkedIn). Без вашего подтверждения ничего не записывается |
| [`master-profile`](modes/master-profile.md) | Импортирует, проверяет и валидирует ваш Master Career Profile и готовит выбранные факты как пункты резюме |
| [`add`](modes/add.md) | Добавляет проект, статью или роль в резюме (загрузка, предпросмотр, подтверждение) |
| [`expand`](modes/expand.md) | Находит недостающие в резюме компетенции по ссылкам из вашего профиля |
| [`retro`](modes/retro.md) | Разбирает эту сессию и сохраняет то, чему вы её научили, как правила (записывает только принятые вами) |
**Улучшить таргетинг**
| Команда | Что делает |
| --- | --- |
| [`patterns`](modes/patterns.md) | Анализирует закономерности отказов и улучшает таргетинг |
| [`calibrate`](modes/calibrate.md) | Проверяет, предсказывают ли ваши оценки реальные результаты. Только рекомендации: оценки никогда не меняет |
| [`upskill`](modes/upskill.md) | Анализ пробелов в навыках по вашим оценённым отчётам |
| [`training`](modes/training.md) | Оценивает курс или сертификацию относительно вашей North Star |
| [`project`](modes/project.md) | Оценивает идею проекта для портфолио |
**Система**
| Команда | Что делает |
| --- | --- |
| [`agent-inbox`](modes/agent-inbox.md) | Ставит запросы в очередь на следующую сессию и разбирает их тогда (`data/agent-inbox.md`). `inbox` тоже работает |
| [`update`](modes/update.md) | Обновляет системные файлы career-ops с предпросмотром диффа и проверкой совместимости |
## Настройка порталов
Сканер поставляется со **100+ компаниями**, готовыми к сканированию, и **35+ поисковыми запросами** по основным доскам вакансий. Скопируйте `templates/portals.example.yml` в `portals.yml` и добавьте свои:
**AI-лаборатории:** Anthropic, OpenAI, Mistral, Cohere, LangChain, Pinecone
**Голосовой ИИ:** ElevenLabs, PolyAI, Parloa, Hume AI, Deepgram, Vapi, Bland AI
**AI-платформы:** Retool, Airtable, Vercel, Temporal, Glean, Arize AI
**Контакт-центры:** Ada, LivePerson, Sierra, Decagon, Talkdesk, Genesys
**Enterprise:** Salesforce, Twilio, Gong, Dialpad
**LLMOps:** Langfuse, Weights & Biases, Lindy, Cognigy, Speechmatics
**Автоматизация:** n8n, Zapier, Make.com
**Европа:** Factorial, Attio, Tinybird, Clarity AI, Travelperk
**Сканируемые доски вакансий:** 55+ модулей провайдеров покрывают API ATS, ленты целых досок, XML/RSS-ленты, markdown-ленты и локальные парсеры. Полная таблица: [Поддерживаемые доски вакансий](docs/SUPPORTED_JOB_BOARDS.md).
По умолчанию `node scan.mjs` (он же `npm run scan`) доверяет тому, что возвращает каждая лента ATS. Некоторые компании оставляют устаревшие объявления в своём публичном API даже после закрытия вакансии, так что эти просроченные записи могут попасть в `pipeline.md`. Передайте `--verify`, чтобы после прохода по API запустить Playwright и отбросить просроченные объявления до того, как они попадут в конвейер:
```bash
node scan.mjs --verify # zero-token discovery + Playwright liveness check
```
Проверка последовательная и выполняется только для новых вакансий (после дедупликации), так что стоимость остаётся ограниченной.
### 🇷🇺 Российские площадки
career-ops поддерживает ключевые российские джоб-борды:
| Площадка | URL | Тип | Особенности |
| ------------------- | ------------------------------------------ | --------- | ------------------------------------------------------------ |
| **HeadHunter** | [hh.ru](https://hh.ru) | API + Web | Главная площадка РФ. Открытый API. 600k+ IT-вакансий |
| **Хабр Карьера** | [career.habr.com](https://career.habr.com) | Web | IT-вакансии, грейды, зарплатные вилки, техническое комьюнити |
| **Работа в России** | [trudvsem.ru](https://trudvsem.ru) | API + Web | Госпортал Роструда. Открытый API для массового парсинга |
| **Rabota.ru** | [rabota.ru](https://rabota.ru) | Web | Принадлежит Сберу. Крупные компании, финтех |
| **Superjob** | [superjob.ru](https://www.superjob.ru) | Web | Вторая по величине после hh.ru |
| **Geekjob** | [geekjob.ru](https://geekjob.ru) | Web | IT-вакансии с указанием вилок |
| **Буду** | [budu.jobs](https://budu.jobs) | Web | IT-вакансии, бывший Хантфлоу |
**Telegram-каналы** подключаются как обычный источник сканера через `provider: telegram-channel` (читает публичное превью `t.me/s/<канал>` — без ключей и логина, историю до `since_days`), образец записи — в `templates/portals.example.yml`. В выдачу попадают только посты, где назван работодатель («Компания: …», «Title @ Компания») и есть ссылка на саму вакансию (ATS работодателя или страница вакансии на борде): компанией становится работодатель, URL — эта ссылка, пермалинк поста уходит в описание. Посты «пишите @hr» без работодателя, подборки и анонимные вакансии отбрасываются, так что для HR-каналов вроде @jobforjunior или @job_python это работает, для чатов свободного формата — почти нет. Приватные каналы и каналы с выключенным превью так не читаются — сканер сообщит об этом явно.
#### Особенности российского рынка в оценке
- **Зарплата**: gross (до НДФЛ 13%) vs net (на руки) — система учитывает разницу
- **Оформление**: ТК РФ, ГПХ, самозанятость — влияет на оценку стабильности
- **Бенефиты**: ДМС, ДМС стомат., компенсация питания/спорта/обучения
- **Испытательный срок**: до 3 мес. (6 мес. для руководителей по ТК РФ)
- **Отпуск**: 28 календарных дней минимум по ТК + доп. дни
## Dashboard TUI
Встроенный терминальный дашборд позволяет просматривать ваш конвейер визуально:
```bash
npm run serve:dashboard # launch the TUI
npm run build:dashboard # optional: build the standalone binary
```
Функции: 10 вкладок фильтров, 8 режимов сортировки, сгруппированный/плоский вид, ленивая загрузка предпросмотра, изменение статусов в строке.
Есть также **экспериментальный веб-интерфейс** (альфа, опционально: ничего не запускается, пока вы его не запустите): смотрите [`web/README.md`](web/README.md).
## Структура проекта
```
career-ops/
├── AGENTS.md # Canonical agent instructions (all CLIs)
├── CLAUDE.md # Claude Code wrapper (imports AGENTS.md)
├── CODEX.md # Codex wrapper (imports AGENTS.md)
├── OPENCODE.md # OpenCode wrapper (imports AGENTS.md)
├── GEMINI.md # Legacy no-op guard to avoid Antigravity duplicate context
├── cv.md # Your CV (create this)
├── article-digest.md # Your proof points (optional)
├── config/
│ └── profile.example.yml # Template for your profile
├── modes/ # Skill modes
│ ├── _shared.md # Shared context (customize this)
│ ├── oferta.md # Single evaluation
│ ├── pdf.md # PDF generation
│ ├── cover.md # Cover letter generation
│ ├── email.md # Formal application email drafts
│ ├── scan.md # Portal scanner
│ ├── batch.md # Batch processing
│ └── ...
├── templates/
│ ├── cv-template.html # ATS-optimized CV template
│ ├── portals.example.yml # Scanner config template
│ └── states.yml # Canonical statuses
├── batch/
│ ├── batch-prompt.md # Self-contained worker prompt
│ └── batch-runner.sh # Orchestrator script
├── dashboard/ # Go TUI pipeline viewer
├── data/ # Your tracking data (gitignored)
├── reports/ # Evaluation reports (gitignored)
├── output/ # Generated PDFs (gitignored)
├── fonts/ # Space Grotesk + DM Sans
├── docs/ # Setup, customization, budget guide, architecture
└── examples/ # Sample CV, report, proof points
```
## Внешний каталог данных (опционально)
По умолчанию данные пользовательского слоя (такие как `cv.md`, `portals.yml` и папки `data/`, `reports/`, `output/`) живут в корневой папке проекта.
Чтобы отделить личные данные от кода (проще переключать ветки, подтягивать обновления или тестировать несколько профилей), вы можете настроить внешний каталог данных со следующим приоритетом:
1. **Переменные окружения:** задайте переменную `CAREER_OPS_ROOT` или `CAREER_OPS_DATA_DIR`:
```bash
export CAREER_OPS_ROOT=~/my-career-data
```
2. **Файл-маркер:** создайте в корне репозитория файл `.career-ops-data` с путём к вашему каталогу данных.
3. **По умолчанию:** корень репозитория.
После определения все пользовательские файлы разрешаются и записываются относительно этой папки, тогда как файлы промптов и скрипты по-прежнему разрешаются относительно репозитория.
- **Переопределение трекера:** можно также задать `CAREER_OPS_TRACKER`, чтобы напрямую указать путь к файлу трекера откликов.
- **Записи:** все операции записи (например, слияния) канонически направлены в `{DATA_ROOT}/data/applications.md`.
- **Конфигурация сканера:** `portals.yml` читается и валидируется по пути `{DATA_ROOT}/portals.yml`, так что `node validate-portals.mjs` проверяет тот же файл, что читает `scan.mjs`.
- **Сгенерированные документы:** адаптированные резюме и сопроводительные письма записываются в `{DATA_ROOT}/output/`, а PDF-манифест, связывающий их с отчётом, лежит в `{DATA_ROOT}/data/pdf-index.tsv`. Пока `CAREER_OPS_TRACKER` не задан, рабочим пространством трекера, которое ограничивает эти записи, является корень данных, а не checkout репозитория.
- **PDF при переопределённом трекере:** `generate-pdf.mjs` разрешает `CAREER_OPS_TRACKER` до того, как вычислить рабочее пространство, поэтому при заданном переопределении рабочим пространством становится папка с этим трекером (или папка уровнем выше, если трекер лежит в папке `data/`). HTML резюме и каждый PDF должны тогда находиться внутри этого рабочего пространства, а манифест переезжает в его `data/pdf-index.tsv`. Сопроводительные письма по-прежнему пишутся в `{DATA_ROOT}/output/`, поэтому они отклоняются, если эта папка оказывается вне рабочего пространства трекера.
- **Слой кода остаётся на месте:** `node_modules/`, `providers/`, `modes/` и сами скрипты всегда разрешаются относительно репозитория, никогда относительно корня данных.
Дашборд TUI на Go, скрипты Node.js и режимы ИИ-агента автоматически соблюдают эту иерархию.
## Технологии





- **Агент**: AI-CLI с общими скиллами и режимами (`AGENTS.md` + обёртка для CLI)
- **PDF**: Playwright + HTML-шаблон
- **Сопроводительные письма**: HTML-шаблон + Playwright (A4 PDF, тот же конвейер, что и для резюме)
- **Сканер**: Playwright + Greenhouse API + WebSearch
- **Дашборд**: Go + Bubble Tea + Lipgloss (тема Catppuccin Mocha)
- **Данные**: таблицы Markdown + конфигурация YAML + пакетные файлы TSV
Работает также в любом CLI со стандартом agent skills. См. поддерживаемые CLI.
## Также с открытым кодом
- **[cv-santiago](https://github.com/santifer/cv-santiago)**: сайт-портфолио (santifer.io) с ИИ-чатботом, дашбордом LLMOps и кейс-стади. Если вам нужно портфолио в дополнение к поиску работы, сделайте форк и сделайте его своим.
## FAQ
**Что такое career-ops?**
career-ops ([career-ops.org](https://career-ops.org), также известный как **careerops**) является ИИ-поиском работы с открытым кодом, который работает локально в вашем AI-CLI (Claude Code, Codex, OpenCode и других) и оставляет каждое решение за вами. Он оценивает вакансии относительно вашего резюме, генерирует ATS-адаптированные PDF, находит нужного человека для контакта и отслеживает всё в одном месте: последнее слово всегда за вами. Это первая эталонная реализация [Манифеста CareerOps](https://career-ops.org/manifesto).
**Может ли адаптированное резюме что-то выдумать?**
Не должно, и промпты это говорят: переформулировать, никогда не выдумывать. `generate-pdf` блокирует резюме, в котором есть цифры или факты, отсутствующие в ваших источниках, если только вы не передадите `--skip-fact-check`. Режим `pdf` также запускает `cv-title-check.mjs`: он сравнивает каждое название должности в адаптированном резюме с названием, которое cv.md даёт той же работе (сопоставление по компании и датам), и спрашивает, оставить или вернуть каждое отличающееся. Он только предупреждает, а не блокирует, потому что переформулировать название должности иногда ваше решение. Переформулировки пока ничто не оценивает: это отслеживает [#1411](https://github.com/career-ops-hq/career-ops/issues/1411) (проверка достоверности, блокирующая при несовпадении). До тех пор читайте каждое резюме перед отправкой. [Юридическая оговорка](LEGAL_DISCLAIMER.md) говорит то же самое длиннее.
**Могу ли я запускать career-ops бесплатно или на более дешёвой / локальной модели?**
Да. career-ops не зависит от CLI и работает на бесплатных и локальных моделях (бесплатные модели OpenRouter, Ollama или любой OpenAI-совместимый эндпоинт), так что вы не привязаны к платной подписке. Полная настройка: [docs/RUNNING_ON_A_BUDGET.md](docs/RUNNING_ON_A_BUDGET.md).
**Я плачу за Claude Pro/Max, но career-ops сжигает API-кредиты. Почему?**
Потому что `ANTHROPIC_API_KEY` в вашем окружении имеет приоритет над подпиской, в которую вы вошли: CLI использует ключ и тарифицирует за токен. Выполните `echo $ANTHROPIC_API_KEY`, и если что-то выводится, уберите его из профиля оболочки, перезапустите терминал и выполните `/login`. Пакетный режим является исключением, потому что воркеры `claude -p` не используют интерактивный вход: один раз выполните `claude setup-token` и экспортируйте результат как `CLAUDE_CODE_OAUTH_TOKEN`. Полное пошаговое описание: [docs/RUNNING_ON_A_BUDGET.md](docs/RUNNING_ON_A_BUDGET.md#2b-already-paying-for-a-subscription-make-sure-you-are-using-it).
**С какими AI-CLI работает career-ops?**
career-ops работает с любым основным AI-CLI для программирования (Claude Code, Codex, Gemini / Antigravity, OpenCode, Grok, Qwen и другими) через открытый Agent Skill Standard, так что никогда не привязан к одному вендору. Используйте тот CLI, что у вас уже есть.
**Как установить career-ops на Windows?**
career-ops работает на Windows. Специфичная для платформы настройка и известные острые углы (поиск Git Bash, концы строк, Планировщик заданий) описаны в [docs/WINDOWS.md](docs/WINDOWS.md). Если скиллы не загружаются с ошибкой символической ссылки при установке, решение в [docs/FAQ.md](docs/FAQ.md). Полные шаги в [docs/SETUP.md](docs/SETUP.md).
**Откликается ли career-ops на вакансии за меня?**
Нет. career-ops является фильтром, а не инструментом массовой автоматической рассылки. ИИ оценивает, ранжирует и готовит черновики; вы просматриваете и решаете. Он готовит черновики и заполняет поля; он никогда не отправляет. Вы нажимаете «Отправить». Именно в этом дизайне с человеком в контуре вся суть.
**Бесплатен ли career-ops и открыт ли его код?**
Да. career-ops бесплатен и с открытым кодом, и для кандидата так будет всегда. Это первая эталонная реализация [Манифеста CareerOps](https://career-ops.org/manifesto). Прочитайте его, и если он говорит то, во что вы верите, подпишите.
## Об авторе
Я [Santiago Fernández de Valderrama Aparicio](https://santifer.io/about) (santifer), бывший основатель: построил и продал бизнес, который до сих пор работает под моим именем. Я создал career-ops для управления собственным поиском работы, и это сработало: с его помощью я получил должность Head of Applied AI. Через полгода я ушёл с этой должности, чтобы сосредоточиться на career-ops и работать над ним полный рабочий день.
Интересно, как флот ИИ-агентов поддерживает репозиторий такого размера, а решение о каждом слиянии принимает человек? Читайте [Agentic maintenance: how career-ops is run by a fleet of AI agents](https://santifer.io/ai-agent-fleet).
Моё портфолио и другие open source проекты → [santifer.io](https://santifer.io)
Wikidata: [Santiago Fernández de Valderrama Aparicio](https://www.wikidata.org/wiki/Q138710224) · [career-ops](https://www.wikidata.org/wiki/Q139007988).
## Дисклеймер
**career-ops является локальным open-source инструментом, а НЕ хостинг-сервисом.** Используя это ПО, вы подтверждаете:
1. **Вы контролируете свои данные.** Ваше резюме, контакты и персональные данные остаются на вашей машине и отправляются напрямую выбранному вами AI-провайдеру (Anthropic, OpenAI и др.). Мы не собираем, не храним и не имеем доступа ни к каким вашим данным.
2. **Вы контролируете ИИ.** Промпты по умолчанию инструктируют ИИ не отправлять отклики автоматически, но ИИ-модели могут вести себя непредсказуемо. Если вы меняете промпты или используете другие модели, вы делаете это на свой риск. **Всегда проверяйте точность сгенерированного ИИ контента перед отправкой.**
3. **Вы соблюдаете условия сервиса третьих сторон.** Вы должны использовать этот инструмент в соответствии с Условиями использования карьерных порталов, с которыми взаимодействуете (Greenhouse, Lever, Workday, LinkedIn и др.). Не используйте этот инструмент для спама работодателям или перегрузки систем ATS.
4. **Без гарантий.** Оценки являются рекомендациями, а не истиной. ИИ-модели могут галлюцинировать навыки или опыт. Авторы не несут ответственности за результаты трудоустройства, отклонённые отклики, ограничения учётных записей или любые другие последствия.
Смотрите [LEGAL_DISCLAIMER.md](LEGAL_DISCLAIMER.md) за полной информацией. Это ПО распространяется по [лицензии MIT](LICENSE) «как есть», без каких-либо гарантий.
## Контрибьюторы
Все, кто внёс вклад кодом, документацией, переводами или тестами, перечислены в
[CONTRIBUTORS.md](CONTRIBUTORS.md), включая вклады без кода, которые
график выше показать не может.
Получили работу с career-ops? [Поделитесь своей историей!](https://github.com/career-ops-hq/career-ops/issues/new?template=i-got-hired.yml)
## Лицензия и товарный знак
Код лицензирован по [MIT](LICENSE). Название и бренд
«career-ops» регулируются [Политикой товарного знака](TRADEMARK.md): разрешительной
для использования сообществом, зарезервированной для названий коммерческих продуктов
и одобрений.
## История звёзд