Сложность: Уровень сложностиУровень сложностиУровень сложности

Егор Трушников: построил автономный IT-новостной портал на 2500 статей с себестоимостью $0,001 за новость

В кейсе рассказываем, как Егор собрал и в одиночку ведет новостной IT-портал itech-news.ru. На сайте около 2500 публикаций, новые новости выходят ежедневно, а раз в неделю Егор публикует ИИ-дайджесты. Весь продакшн — VPS, Claude Code и GPT-4o-mini по API. Себестоимость одной новости — около $0,001, а управляется все голосом с телефона через Telegram-бота.

Год смотрел на нейросети со стороны, пока не узнал про Claude Code

С конца 2025 года я следил за тем, что происходит с нейросетями. Но дальше браузерных ChatGPT, DeepSeek и Qwen я не продвигался. Было ощущение, что вокруг происходит что-то важное, а я стою сбоку и не знаю, с какой стороны подойти.

Потом в чате Нейроцеха я узнал про Claude Code. До этого я не знал, что такие инструменты существуют и что ими можно закрывать задачи, которые раньше требовали разработчика. После вебинара я начал разбираться с Claude Code — как он устроен, как им пользоваться, что можно делать.

В конце января 2026 года у меня был отпуск и там все и началось. За неделю я собрал свой первый проект — aifluent.ru, голосовой бот-носитель английского для тренировки произношения. После этого я уже не мог остановиться. Сейчас я работаю в связке из Claude Code и Codex. Сам код я не пишу. Я ставлю задачи, держу в голове архитектуру и слежу, чтобы инструменты не уехали куда-нибудь не туда.

Хотел делать IT-новостной портал, но ручная редактура убивала идею

После aifluent я захотел собрать что-то в IT-сфере. В русскоязычном сегменте как раз была проблема: аналогов TheNewStack и Hacker News почти нет. Англоязычные новости в российский сегмент быстро не попадают. Поэтому появилась простая идея: брать лучшие западные источники, быстро переупаковывать материалы на русский, размечать под SEO и публиковать.

Источники я выбрал те, которые сам читаю каждый день: MIT Tech Review, Hacker News, TheNewStack, Reddit-сабреддиты про ИИ и безопасность. У каждого есть публичный RSS-поток, поэтому собрать из них общий поток — вопрос пары часов. Главная проблема начиналась уже после сбора.

Я думал делать всю работу руками, но на одну новость у меня уходило от тридцати минут до часа. Нужно было найти источник, перевести, переписать для русского читателя, проставить категорию и теги, сверстать в WordPress, написать мету для Yoast, опубликовать и кинуть анонс в Telegram. Для живого портала нормальный ритм — двадцать новостей в день. Если делать это вручную, получается полноценная работа на троих-пятерых человек. Для сольного проекта без монетизации это точно не вариант.

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

itech news

Первый прототип: скормил RSS одной модели и получил мусор

Сразу я решил пойти простым путем: попросил Claude Code изучить источники по IT-новостям и настроить с них парсинг. А потом придумать промпт, чтобы переписывать их нормальным русским языком.

Нейронка нашла нужные источники, но с текстами была беда. Модель теряла факты и выдумывала то, чего в оригинале не было. Она могла дописать сумму сделки, которой в исходнике не существовало, или приклеить к релизу фамилию CEO, не имеющего к нему отношения.

Еще все материалы выходили как под копирку. Одна и та же структура, одни и те же связки в начале и в конце, одинаковый ритм абзацев. Если выложить десять таких новостей подряд, читатель на третьей поймет, что их писала одна и та же машина.

плохая новость

Вот пример такой новости. Мало того, что тема не соответствует теме сайта, так и написана она достаточно странным языком

И на выходе получался просто пересказ текста: без тегов, без категорий, без внятного заголовка под поисковый запрос. Для SEO такая страница бесполезна: без разметки поисковики ее просто не увидят.

Так я понял, что одним промптом задачу не решить. Значит, надо разбивать работу на шаги и давать модели в каждом шаге свою узкую задачу.

За пару недель продумал архитектуру и запустил первую автопубликацию

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

Конвейер устроен как цепочка из пяти ролей. У каждой своя узкая задача.

  • Collector классифицирует поступающие статьи: определяет тип материала, важность, ключевые сущности.
  • Analyst кластеризует события, ищет повторяющиеся паттерны и формулирует главный тезис периода.
  • Editor пишет редакционный материал. Для дайджеста это цельная статья, а не перечень новостей.
  • Chief Editor отдельной ролью вырезает воду, канцелярит и пустые связки. Сам Editor себя не очищает, поэтому нужен отдельный редактор.
  • Validator делает финальный чек качества и переписывает слабые блоки.

Вот как выглядит промпт роли Collector:

Prompt

| Аналитик itech-news.ru. Категория «{category_name}», период {week_label}. Для каждой статьи определи: summary (1-2 предл.), topic, entities (компании/продукты/технологии), type(release|investment|research|regulation|deployment|opensource|scandal|analytics|partnership|other), importance (High|Medium|Low). Верни JSON-массив: [{“id”:N,”title”:”…”,”url”:”…”,”summary”:”…”,”topic”:”…”, “entities”:[“…”],”type”:”…”,”importance”:”High|Medium|Low”}] | | :—- |

А вот что получает Editor — роль, ради которой весь конвейер и собирается:

Prompt

Ты — редактор еженедельного дайджеста для itech-news.ru. Напиши качественный дайджест по категории «{category_name}» за {week_label}. Это должна быть цельная редакционная статья, а не перечень новостей. Структура:  

1. Лид (2-4 абзаца): общая картина недели, главные темы, почему важно  

2. 3-6 тематических блоков (<h2>): каждый начинается с тезиса, объединяет несколько событий, содержит ссылки на источники, завершается мини-выводом  

3. Блок «Что это значит» (<h2>): интерпретация, усиливающиеся тренды, прогнозы  

4. Финал (1-2 абзаца): короткий итог недели  

Требования:  

– HTML-формат, БЕЗ <h1> (WP создает из title)  

– Ссылки как <a href=”URL”>ключевая фраза</a> — органично в тексте  

– Стиль: ясный, плотный, живой, без воды и канцелярита  

– Не копируй формулировки исходных публикаций  

– Объясняй не только ЧТО произошло, но и ПОЧЕМУ это важно  

– 1500-2500 слов  

– Верни ТОЛЬКО HTML, без оберток markdown

Каждый шаг — отдельный вызов к API. Между ролями модель не переключается: везде работает одна и та же.

Сама система живет на сервере. Там круглосуточно работают планировщик, голосовой бот и есть очередь публикаций. Поэтому пока я сплю, система сама выпускает свежие новости дважды в сутки, гоняет SEO-аудит, отправляет URL в IndexNow и Google Indexing API, постит в Telegram-канал сайта и присылает мне в личку сводки после публикаций. В сводке указано количество вышедших материалов и сколько долларов ушло на прогон API.

выгрузка тг

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

За неделю Claude Sonnet съел кучу денег — пришлось дважды менять модель

Первый рабочий конвейер стартовал на Claude Sonnet. Тексты получались хорошие: русский язык, факты и структура — все нормально. Но на следующий день я увидел счет за сутки работы. При ритме двадцать новостей в день Sonnet оказался слишком дорогим для проекта, который пока не зарабатывает.

Поэтому я перевел весь конвейер на Claude Haiku. На тех же задачах Haiku вышел в 12 раз дешевле Sonnet при приемлемом качестве. Продержался я на нем три дня на тестовых объемах статей, пока отлаживал конвейер. Деньги все равно уходили быстрее, чем хотелось на некоммерческом проекте. Поэтому через неделю я перешел на GPT-4o-mini, чтобы можно было выйти на реальные новостные объемы по 50+ новостей в день.

расходы на нейросети

Чтобы не переписывать код каждый раз при смене модели, я сделал переключатель между провайдерами. Теперь при переходе с одного поставщика на другого не нужно трогать весь код — достаточно поменять одну строчку. Любую из ролей при желании можно откатить обратно на Claude. Если Validator начнет пропускать грубые ошибки, я верну на эту роль Haiku или Sonnet, а остальные оставлю на GPT-4o-mini.

Сейчас все пять ролей работают на GPT-4o-mini. Это самая базовая из моделей, которая еще пишет приемлемые тексты. Себестоимость одной новости получилась около $0.001. Полный дайджест на 30+ новостей обходится примерно в $0.02.

Пока проект не монетизируется, вкладываться в более дорогую модель ради редакторского вылизывания смысла нет. Когда появится реклама и платные размещения, я вернусь к сравнению с Sonnet 4.5 и 4o. Но уже на реальных экономических метриках, а не вслепую.

Одни и те же новости лезли из разных RSS — сделал дедупликацию в три уровня

Параллельно с возней вокруг моделей я заметил другую проблему: в ленте появлялись дубли. Один и тот же релиз OpenAI приходил из Hacker News, потом из TechCrunch, потом в виде русскоязычного перепоста на профильном сайте. Заголовки везде разные, а смысл один и тот же. Без фильтра у меня на сайте висели три публикации про одно событие.

Дедупликацию я собрал каскадом из трех уровней: от дешевого к дорогому. Тяжелые сравнения запускаются только если дубль не отсекся на ранней стадии.

Первый уровень — точный URL. Если такая ссылка уже публиковалась, новость отбрасывается сразу, без обращения к модели и без всякой обработки.

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

Третий уровень — сравнение по смыслу. На этом этапе нейросети берет значимые слова из заголовков и смотрит, насколько они пересекаются. Если совпадает больше половины, скорее всего это тот же материал в другой обертке.

В ленту попадали карьерные рефлексии и умные матрасы — начал вести блеклист regex-паттернов

За первый месяц работы конвейера вылез еще один побочный эффект: в RSS-ленты попадали не-новости. Личные рефлексии в духе «я перешел из одной компании в другую, что посоветуете», треды «Ask HN», списки «15 советов джуниорам», ранжированные подборки подарков к Рождеству. Формально все это приходит из ленты IT-источников. По сути — не имеет отношения ни к новостям, ни к IT.

Чтобы решить проблему, вместе с нейронкой я собрал два списка regex-паттернов для отсева мусора по смыслу — шаблонов, которые ищут в заголовке характерные слова и отсекают подходящие новости до обработки

Prompt

| | SKIP_TITLE_PATTERNS = [      

re.compile(r”^\[D\]\s*Self-Promotion”, re.IGNORECASE),      

re.compile(r”^\[D\]\s*Weekly”, re.IGNORECASE),      

re.compile(r”^Ask HN:”, re.IGNORECASE),     

re.compile(r”Who is hiring”, re.IGNORECASE),    

# … ]  LOW_VALUE_PATTERNS = [     

# Personal stories / career advice     r

e.compile(r”\b(I switched|I quit|I left|my experience|my story)\b”, re.IGNORECASE),     

re.compile(r”\b(should I|is it worth|career path|resume tips)\b”, re.IGNORECASE),     re.compile(r”\b(burnout|work.life balance|impostor syndrome)\b”, re.IGNORECASE),     

# Listicles / aggregation without news value      

re.compile(r”^\d+ (things|tips|tricks|ways|reasons|lessons)”, re.IGNORECASE),      # Consumer reviews, not IT news      

re.compile(r”\b(gift guide|buyer.s guide|deals roundup|price drop)\b”, re.IGNORECASE),     

# … ] | | :—- | | | :—- |

SKIP_TITLE_PATTERNS работает по полному совпадению заголовков. LOW_VALUE_PATTERNS ловит характерные фрагменты по смыслу. Каждый раз, когда в ленте появляется новая категория мусора, я добавляю в нужный список один паттерн, и больше он в текстах не появляется. Например, однажды вылезла подборка «лучшие умные матрасы 2026». Я дописал строчку про listicles, и эта штука ушла в блеклист.

Отдельная история случилась с новостями, которые формально выглядят как IT, но к теме сайта отношения не имеют. В ленту про ИИ как-то приехали «искусственный газон для дачи» и «опреснение морской воды». Ключевые слова «artificial» и «technology» совпадали с ИИ-лексикой, и источники честно отдавали эти материалы в IT-рубрики. Я дописал паттерны, которые отрезают такие совпадения по контексту.

Захотел управлять конвейером с телефона — за вечер собрал голосовой Telegram-бот

Со временем мне стало неудобно дергать конвейер только с компьютера. Прогон хочется запустить и из такси по дороге в офис, и прямо на встрече между двумя обсуждениями. Каждый раз открывать ноутбук — не всегда удобно. Идею голосового управления я подсмотрел в чате Нейроцеха: кто-то из резидентов рассказывал, как рулит своим проектом голосом через Telegram. Свою версию я собрал за вечер.

Бот живет отдельным сервисом на том же сервере и принимает от меня команды по порталу. Голосовое сообщение сначала прогоняется через локальную модель Whisper, которая стоит прямо на сервере: никаких внешних API, чтобы не платить за распознавание речи. Дальше готовый текст — надиктованный или напечатанный вручную — уходит в Claude с системным промптом «ты админ сайта, твои инструменты — команды на этом сервере». Claude переводит мою просьбу в конкретные команды и выполняет их. Долгие задачи бот запускает в фоне, чтобы я не ждал ответа с телефона.

Для частых операций у меня есть пять встроенных команд:

  • /status показывает, что сейчас происходит в конвейере;
  • /logs поднимает последние записи из лога;
  • /run backfill запускает прогон по архивам;
  • /cron показывает расписание задач;
  • /reset сбрасывает зависшие процессы.

Все остальное я просто формулирую словами, и Claude сам подбирает, что выполнить.

Бот не заменил работу с ноутбука, а просто добавил удобства.

бот в тг

Сайт выглядел только что запущенным — добавил архивные новости и запустил еженедельные ИИ-дайджесты

К середине марта конвейер стабильно выпускал новости дважды в сутки, но сайт все равно выглядел свежим и полупустым. Поэтому через месяц работы я запустил новый формат: еженедельные ИИ-дайджесты по понедельникам в 12:00. Идея была в том, чтобы раз в неделю собирать цельный редакционный материал со своими интерпретациями, ссылками на первоисточники и прогнозами.

Сам еженедельный дайджест собирается через Claude Code. Я пишу нейронке что-то вроде «сделай дайджест за прошлую неделю», и дальше система идет по всем пяти ролям: Collector собирает и классифицирует материалы, Analyst кластеризует события и вытаскивает главные тезисы, Editor пишет цельную статью, Chief Editor чистит воду, Validator проверяет результат и переписывает слабые места. На выходе получается статья на 1500–2500 слов со ссылками на источники, обложка в стиле сайта (ее рисует шаблонный генератор на Pillow с одним бренд-цветом) и все SEO-атрибуты.

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

К концу марта допилил SEO-автоматизацию, и сайт пошел в индекс Яндекса

Сами новости уже выходили с проставленными категориями, тегами и метаописанием — за это отвечал и отвечает Yoast, стандартный SEO-плагин для WordPress. Но для нормальной индексации этого мало: поисковику нужно было помочь связать страницы между собой и вовремя о них узнавать.

Первое, что я добавил, — автоматическую пролинковку статей между собой. Система сама проставляет внутренние ссылки с одних новостей на другие по смежным темам, чтобы страницы не висели в вакууме и у поисковиков была понятная карта сайта. Туда же я залил полноценный sitemap в Яндекс.Вебмастер, чтобы Яндекс видел сразу весь объем материалов, а не ждал, пока сам на них наткнется.

Дальше я подключил IndexNow — это протокол, через который сайт сам сообщает Яндексу и Bing о новых страницах, чтобы они попадали в поиск не через неделю, а за минуты. Для Google существует такой же механизм и называется Google Indexing API. Теперь, как только конвейер публикует новость, оба поисковика получают пинг с адресом и заходят индексировать ее почти сразу.

После этого сайт начал заходить в индекс по-настоящему. От статуса «сайт не видно» за пару недель дошло до регулярного попадания в выдачу Яндекса — без единого рубля на платное продвижение.

визиты itech-news

За месяц работы понял: без Validator и ручной проверки раз в неделю публиковать нельзя

За месяц работы проекта набралось пять типичных проблем, которые я разбираю руками раз в неделю. Трачу на это примерно 2-3 часа.

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

Выдуманные цифры и имена. GPT-4o-mini охотно докручивает суммы сделок и фамилии CEO, которых в оригинале не было. На этот случай у Validator есть отдельная проверка: он сверяет факты в готовом тексте с исходной статьей и вырезает то, чего в источнике нет. Но иногда выдумка все-таки проскакивает, и приходится править вручную.

Slop-фразы. Chief Editor в теории должен вычищать канцелярит и пустые связки, но периодически оставляет «важно отметить» и «стоит сказать». Под это у меня есть отдельный мини-проход поверх Chief Editor — с жестким промптом в духе «вырежи вот эти сорок формулировок» по закрытому списку оборотов, которые я собрал за месяц.

Редкие SEO-случаи. Автоматика не ловит три типа проблем. Первый — orphan-страницы: материалы, на которые никто не ссылается изнутри сайта, и поисковик до них попросту не доходит. Второй — случайные дубли: WordPress иногда создает две одинаковые страницы с цифрой на конце адреса. Третий — расхождения между реальным адресом страницы и тем, который указан как основной для поисковика. Для всего этого у меня отдельный скрипт audit_news.py. Раз в неделю я запускаю его руками, глазами прохожу по результатам и решаю, что чинить.

Блеклист и модель, которая устает. Раз в неделю я дописываю в блеклист новые regex-паттерны — по тем категориям мусора, что успели вылезти в ленту за эти дни.

И отдельное наблюдение за этот месяц: модель иногда деградирует без видимой причины. Работает стабильно неделю, а потом вдруг начинает пропускать то, что раньше ловила. Почему — не пойму. Это и есть главная причина, по которой без ручной проверки пока не обойтись.

Что получилось: 2500 публикаций, 6800 посетителей в месяц и $10 в месяц на API

На момент выхода кейса на сайте около 3000 страниц, из которых 2000 уже в индексе Яндекса. Для молодого новостного сайта без платного продвижения это нормальный показатель. Посещаемость — около 6800 человек в месяц, в среднем 200–300 читателей в день. Новости выходят ежедневно, ИИ-дайджест — каждый понедельник.

Экономика получилась такой, ради которой весь конвейер и затевался. OpenAI API на GPT-4o-mini обходится примерно в $10 в месяц на всю ленту и дайджесты вместе. VPS Beget — 1100 рублей в месяц, но сервер используется и под рабочие задачи, а не только под itech-news.ru. Подписка Claude Code Max — $100 в месяц, тоже на всю мою работу в целом, не только на этот проект. Домен стоит 199 рублей в год. Единственный кост, который существует только ради портала, — это OpenAI API. Все остальное живет «нагрузкой поверх» инфраструктуры, которую я оплачиваю в любом случае.

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

Для проекта, который я собрал один за пару месяцев между основной работой, это неплохой результат.

В Нейроцехе подсмотрел и Claude Code, и разбиение на роли — без клуба itech-news.ru остался бы еще одним заброшенным пет-проектом

Первый и самый важный толчок я получил в чате клуба. Без вебинара Кирилла Гурбанова я бы не пересел на Claude Code и еще долго пытался что-то делать через браузерный ChatGPT. Ни одного из моих проектов — ни aifluent.ru, ни itech-news.ru — без этого вебинара просто не существовало бы.

Вот еще несколько полезностей, которые я узнал благодаря Нейроцеху.

Скиллы Claude Code. Переход с Cursor на Claude Code случился после обсуждений в чате клуба. Резиденты наглядно показывали, как устроены скиллы и чем это отличается от одноразовых промптов. В моем проекте это превратилось в персональные скиллы для рутинных операций: деплой фронта, прогон SEO-аудита, запуск архивного прогона по источникам. Я не набираю одни и те же команды каждый раз, а вызываю скилл, а он уже знает, где лежит виртуальное окружение, где VPS и какие логи смотреть.

Планирование через MD-ТЗ. Сначала я пишу отдельный Markdown-файл с планом, даже на небольшую задачу, и только потом сажусь за реализацию. Поначалу казалось бюрократией, но после двух-трех случаев, когда отсутствие плана приводило к рефакторингу на два дня, стало очевидно: час на ТЗ окупается каждый раз. Сам конвейер из пяти ролей я тоже сначала описал в Markdown, прогнал через ревью, и только потом закодил.

Обмен промптами и насмотренность. Идея разбить работу на роли, а не гнать одним промптом, — из чата Нейроцеха. Идея Chief Editor отдельной ролью, которая чистит воду, тоже оттуда. Внутри клуба видишь, как десятки людей решают похожие задачи, и перестаешь изобретать велосипед. Даже если сам не пишешь в чат, регулярное чтение меняет подход.

Идея голосового управления проектом. Telegram-бот с распознаванием речи, через который я запускаю конвейер из такси, появился после того, как кто-то в чате показал похожую конструкцию для своего проекта. Я собрал свою версию за вечер и теперь не представляю, как без этого жить.

Главное, что дает Нейроцех, — видишь, как другие думают о процессе, и переосмысливаешь свой. Без этого itech-news.ru был бы еще одним заброшенным пет-проектом. А теперь туда заходят люди каждый день.

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии