Назад в блог

Собственная CMS на GitHub: как Copilot помогает писать, публиковать и анонсировать контент

Как мы собрали простую CMS-систему на базе GitHub-репозитория: Copilot пишет статьи, GitHub Actions публикует их на сайте и рассылает анонсы в Telegram и Max.

Авторы: slavb18

Во времена вайб-кода можно не покупать дорогие платформы и не настраивать монструозные CMS. Достаточно GitHub-репозитория, нескольких GitHub Actions и Copilot - и у вас готовый автопилот для контент-маркетинга.

Вот как это работает у нас в iconicompany.

Идея: GitHub как CMS

Классические CMS (WordPress, Contentful, Strapi) решают задачу хранения и публикации контента, но тащат за собой инфраструктуру, зависимости и цену. А что если хранить контент там, где уже живет код, - в Git-репозитории?

Репозиторий iconicompany/icontent - это и есть наша CMS:

  • Статьи хранятся как .md-файлы в папках content/ru/blog/ и content/en/blog/
  • Любое изменение в ветке main запускает GitHub Actions
  • Actions публикует контент, переводит его на английский и рассылает анонсы

Copilot при этом играет роль редактора и автора: помогает писать статьи прямо в браузере или IDE через скилы, знает структуру репозитория и форматирование frontmatter.

Пайплайн: от идеи до поста в Telegram

Весь процесс выглядит так:

  1. Copilot пишет пост - через скил или прямо в IDE по brief'у
  2. Файл попадает в content/ru/blog/ - обычный коммит в main
  3. GitHub Actions запускается автоматически - срабатывает триггер на изменения в content/**
  4. Автоочистка - убираются кавычки-ёлочки, тире и другие AI-артефакты ("", --, ...)
  5. Автоперевод на английский - LLM переводит пост и кладет его в content/en/blog/
  6. Синхронизация с сайтом - вызывается webhook, сайт подтягивает новый контент
  7. Анонс - LLM генерирует короткий анонс (2-4 предложения), который уходит в Telegram и Max

Весь пайплайн описан в одном файле sync.yml.

Технический обзор

Структура репозитория

content/
ru/
blog/
post-slug.md
en/
blog/
post-slug.md # автоматически генерируется

Каждый пост - это MDX-файл с YAML frontmatter:

---
title: "Заголовок поста"
date: '2026-04-10'
description: "Краткое описание"
tags: ['AI', 'GitHub']
authors: ['slavb18']
language: 'ru'
---

GitHub Actions: что происходит под капотом

Очистка AI-артефактов - скрипт на sed убирает типографские символы, которые любят вставлять языковые модели: умные кавычки, длинные тире, многоточия. Это важно: MDX-парсеры могут ломаться на нестандартных символах.

Автоперевод - используется утилита llm Simon Willison. Она вызывает LLM через OpenAI-совместимый API (у нас - LiteLLM-прокси), который можно подключить к любой модели.

llm -m default --system "$PROMPT" -f "$FILE" -x > "$EN_FILE"

Если английская версия уже есть в коммите, перевод пропускается - это удобно, когда хочется сделать ручной перевод.

Анонс в мессенджеры - LLM генерирует анонс по тексту поста, затем он отправляется:

  • В Telegram через Bot API (sendMessage)
  • В Max (российский мессенджер) через botapi.max.ru

Синхронизация с сайтом - POST-запрос на webhook сайта iconicompany.com. Сайт сам забирает контент из репозитория через библиотеку icontentcollection.

Библиотека icontentcollection

icontentcollection - это npm-пакет, который умеет читать MDX/MD-файлы из локальной папки или GitHub-репозитория по API, парсить frontmatter и отдавать контент в удобном виде.

Это позволяет сайту на Next.js (или любом другом фреймворке) просто сказать: "дай мне список постов для блога" - и получить готовые данные без базы данных.

Секреты и переменные

В Actions используются:

  • TELEGRAM_BOT_TOKEN / TELEGRAM_CHANNEL_ID - для анонсов в Telegram
  • MAX_BOT_TOKEN / MAX_CHANNEL_ID - для анонсов в Max
  • OPENAI_API_KEY / OPENAI_API_BASE / OPENAI_MODEL - для LLM (перевод + анонсы)
  • SYNC_URL / SYNC_TOKEN - для триггера обновления сайта

Все чувствительные данные - в GitHub Secrets, остальное - в Variables.

Почему это работает

Copilot как редактор

Copilot знает структуру репозитория через скилы и может:

  • Написать пост по brief'у в нужном формате
  • Проверить frontmatter на корректность
  • Подобрать slug для имени файла
  • Предложить теги

Это не просто "помощник в написании текста" - это агент, встроенный в рабочий процесс.

Минимализм инфраструктуры

Нет базы данных. Нет CMS-сервера. Нет дополнительных дашбордов. Только:

  • Git-репозиторий (бесплатно)
  • GitHub Actions (бесплатно для публичных репо)
  • LiteLLM или любой OpenAI-совместимый API

Версионность и история

Каждый пост - это коммит. История правок, ревью через PR, откат изменений - все это из коробки. Хочешь посмотреть, как статья менялась со временем? git log к вашим услугам.

Это и есть вайб-кодинг

Раньше создать такую систему означало выбирать между WordPress, Contentful или самописным решением на месяц. Сейчас это несколько часов с Copilot: описываешь задачу, он пишет workflow, ты проверяешь, пушишь - готово.

Собственный autopilot для контента. Без vendor lock-in. С полным контролем над данными.


Репозиторий открытый: iconicompany/icontent. Смотрите, форкайте, адаптируйте под себя.

Вопросы и обратная связь - в канале @iconicompany.


📚 Читайте также

iconicompany

агрегатор аутстаффинга ·
проектная работа для ИТ-специалистов

заказчикам Платформа

Вход для заказчиков — отдельная страница, не витрина для специалистов.

примечания к спецификации
  • из проекта imatching берётся только тема кабинета — функциональность кабинета не переносится
  • цвета — из темы кабинета imatching
  • шрифты — из темы кабинета imatching: Bricolage Grotesque · Public Sans · JetBrains Mono
  • регистр — «воздух публичного сайта», а не плотность кабинета
  • тип продукта — landing, публичный сайт
  • не админка
  • не мобильное приложение
  • ориентир по типу продукта — skillstaff.ru, и только по типу
  • бренд и оформление skillstaff.ru не копируются
  • темы различаются: собственный продукт (эта витрина) и движок (страница «Платформа»)
  • собственный продукт — ИТ-аутстаффинг; витрина сделана для него
  • тендерная история на главную не выносится — она живёт на странице «Платформа»

© 2026 iconicompany

отклик — ссылкой на hh-резюме · без регистрации