Back to the blog

/en/blog · writing

Your Own CMS on GitHub: How Copilot Helps Write, Publish, and Announce Content

How we built a simple CMS system based on a GitHub repository: Copilot writes articles, GitHub Actions publishes them to the site, and sends announcements to Telegram and Max.

Authors: slavb18
  • AI
  • Copilot
  • GitHub
  • CMS
  • Agents
  • DevOps
  • Automation

In the era of vibe coding, you don't need to buy expensive platforms or set up monstrous CMSs. A GitHub repository, a few GitHub Actions, and Copilot are enough - and you have a ready-made autopilot for content marketing.

Here's how it works for us at iconicompany.

Idea: GitHub as a CMS

Classic CMSs (WordPress, Contentful, Strapi) solve the problem of storing and publishing content, but they drag along infrastructure, dependencies, and cost. What if we store content where the code already lives - in a Git repository?

The iconicompany/icontent repository is our CMS:

  • Articles are stored as .mdx files in the content/ru/blog/ and content/en/blog/ folders
  • Any change in the main branch triggers GitHub Actions
  • Actions publishes content, translates it into English, and sends out announcements

Copilot, in turn, acts as an editor and author: it helps write articles directly in the browser or IDE via skills, knows the repository structure, and frontmatter formatting.

Pipeline: From Idea to Telegram Post

The entire process looks like this:

  1. Copilot writes a post - via a skill or directly in the IDE based on a brief
  2. The file goes into content/ru/blog/ - a regular commit to main
  3. GitHub Actions runs automatically - a trigger on changes in content/** is activated
  4. Auto-cleanup - smart quotes, em dashes, and other AI artifacts ("", --, ...) are removed
  5. Automatic translation to English - the LLM translates the post and places it in content/en/blog/
  6. Site synchronization - a webhook is invoked, and the site pulls the new content
  7. Announcement - the LLM generates a short announcement (2-4 sentences), which goes to Telegram and Max

The entire pipeline is described in a single file sync.yml.

Technical Overview

Repository Structure


📚 Read also

Back to the blog