Turn GitHub changelog articles into polished, presentation-ready slides — automatically.
Fetch · Summarize · Translate · Present — in under 5 minutes.
Why · How · Demo · Quick Start · Usage · Config · Contribute
GitHub ships product updates every single week — across Copilot, Actions, Security, and more.
For any team that tracks these changes, the same recurring challenge surfaces: how do you stay on top of everything, and share what matters with your audience in a meaningful way?
Today, the answer is usually manual:
- 📰 Someone reads through dozens of changelog articles
- 🔍 Picks what's relevant for their team or audience
- ✍️ Writes summaries, formats slides, repeats this every week
That's hours of low-leverage work — done by people who should be doing something harder.
This repository is a working AI pipeline powered by a repo-local Copilot skill that orchestrates everything — it calls Python scripts for deterministic work (scraping, validation, indexing, slide generation) and uses AI only for what requires it: writing structured summaries and speaker notes. The result is a polished, multilingual PowerPoint presentation — automatically.
|
|
Note
This repository is the skill. Clone or symlink it to ~/.copilot/skills/copilot-updates/ to use it from any project. The skill supplies workflow knowledge; the Python scripts in scripts/ do the heavy lifting.
Important: generated artifacts are written to the current working directory where you invoke the skill, not to the skill folder itself. That means the skill will create output/ and .pptx files in the project or folder you are currently working in.
Every generated presentation uses a dark GitHub-themed design (16:9 widescreen) with four slide types:
Tip
Summaries and speaker notes can be generated in any language. Article titles and technical terms always stay in English.
| Requirement | Notes |
|---|---|
| Python 3.11+ | Core runtime |
| VS Code + GitHub Copilot | Optional for chat-based usage |
You can use copilot-updates in two different ways:
Use this mode when you want to work directly in this repo.
- Clone the repository anywhere you like
- Open Copilot in this repository
- Run the pipeline from this repository root
In this mode, generated files are written inside this repo's working folder:
.\output\raw\.\output\{locale}\...- generated
.pptxfiles in the repo root
Use this mode when you want the skill available from any project folder.
- Keep one clone of this repo somewhere on disk
- Register that clone under your user skills folder
- Invoke the skill while working in another folder or project
In this mode, generated files are written to the folder where you invoke the skill, not to the repo that contains the skill:
C:\work\demo\output\raw\C:\work\demo\output\{locale}\...- generated
.pptxfiles inC:\work\demo\
# Clone to your user skills directory
git clone https://github.com/g-mercuri/copilot-updates ~/.copilot/skills/copilot-updates
# Or symlink an existing clone
ln -s /path/to/copilot-updates ~/.copilot/skills/copilot-updatesOn Windows (PowerShell):
New-Item -ItemType SymbolicLink -Path "$env:USERPROFILE\.copilot\skills\copilot-updates" -Target "C:\path\to\copilot-updates"Run this once for the clone that contains the skill scripts:
cd scripts
uv sync💡 Alternative: plain venv / pip
cd scripts
python -m venv .venv
.venv\Scripts\Activate.ps1 # Windows
source .venv/bin/activate # macOS / Linux
pip install .|
If you are using Option 1, open Copilot Chat in this repository and ask Copilot to use the If you are using Option 2, open Copilot in the project folder where you want the output to be created, and then invoke the skill there. |
This repository is a self-contained Copilot skill (
You can ask in natural language, or invoke it explicitly: |
In Copilot CLI, use /skills list to confirm the skill is available and /skills reload after editing skill files.
Warning
Check which folder you are currently in before invoking the skill. The pipeline writes output/raw/, output/{locale}/..., and the generated .pptx to your current working directory.
Example: if you run Copilot from C:\work\demo, the skill writes files under C:\work\demo\output\... and creates the presentation there.
You'll be prompted for:
| Input | Example | Description |
|---|---|---|
startDate |
2026-02-01 |
Start of the date range |
endDate |
2026-02-25 |
End of the date range |
labels |
copilot,actions or all |
Which changelog labels to include |
language |
italian, english, spanish |
Output language for summaries |
The skill orchestrates the full pipeline end-to-end:
Fetch → Prepare → Summarize → Validate → Index → PowerPoint
In practice, the important boundary is:
scripts/fetch_articles.py,scripts/process_articles.py, andscripts/create_pptx.pydo the deterministic work- the skill reads
output/batch.json, writes each processed article file underoutput/{locale}/..., and then resumes the scripted pipeline - before validation, every
target_fileinoutput/batch.jsonshould exist on disk
Tip
Re-running for the same date range is safe — both the scraper and the skill skip articles that already have output files.
1️⃣ Fetch raw articles
python scripts/fetch_articles.py --labels copilot --from-date 2026-02-01 --to-date 2026-02-25More examples & flags
# Multiple labels
python scripts/fetch_articles.py --labels copilot,actions,client-apps --from-date 2026-02-01 --to-date 2026-02-25
# All labels
python scripts/fetch_articles.py --labels all --from-date 2026-02-01 --to-date 2026-02-25| Flag | Default | Description |
|---|---|---|
--labels, -L |
copilot |
Comma-separated label slugs, or all |
--from-date |
required | Start date (YYYY-MM-DD) |
--to-date |
required | End date (YYYY-MM-DD) |
--output-dir, -d |
output/ |
Output directory |
2️⃣ Process articles
python scripts/process_articles.py --prepare --locale en \
--from-date 2026-02-01 --to-date 2026-02-25Between
--prepareand--validate, run the Copilot skill (or write summaries manually) to generate the structured article files.
Then verify that every target_file listed in output/batch.json exists, and continue:
python scripts/process_articles.py --validate --locale en
python scripts/process_articles.py --index --locale en[!TIP]
--prepareonly buildsoutput/batch.json. It does not generate translated summaries by itself.
[!TIP] If you write summaries manually, assemble the full file: front matter,
#title, optional,---, then the structured body. Validation may pass even if a file is missing from the expected date range, so it is worth checking the batch manifest before generating the deck.
Flags
| Flag | Default | Description |
|---|---|---|
--prepare |
— | Scan raw files and produce output/batch.json |
--validate |
— | Validate processed article files |
--index |
— | Generate/update index.md |
--locale, -l |
en |
Locale code |
--from-date |
(none) | Start date filter (YYYY-MM-DD) |
--to-date |
(none) | End date filter (YYYY-MM-DD) |
--labels, -L |
(all) | Comma-separated label slugs to filter |
--output-dir, -d |
output/ |
Output directory |
3️⃣ Generate the PowerPoint
python scripts/create_pptx.py --locale it --from-date 2026-02-01 --to-date 2026-02-25More examples & flags
python scripts/create_pptx.py --label copilot
python scripts/create_pptx.py --label copilot,actions --categories new-release,improvement| Flag | Default | Description |
|---|---|---|
--output-dir, -d |
output/ |
Root directory containing locale subfolders |
--locale, -l |
en |
Locale subfolder to read from |
--output, -o |
auto-generated | Output .pptx filename |
--from-date |
auto-detected | Start date filter |
--to-date |
auto-detected | End date filter |
--label, -L |
(all) | Comma-separated label slugs to filter by |
--categories, -c |
(all) | Comma-separated categories: new-releases, improvements, deprecations |
All labels, categories, colors, and defaults live in scripts/config.yaml.
📋 Supported labels (13 labels)
| Slug | Display Name |
|---|---|
account-management |
Account Management |
actions |
Actions |
application-security |
Application Security |
client-apps |
Client Apps |
collaboration-tools |
Collaboration Tools |
community-engagement |
Community Engagement |
copilot |
Copilot |
ecosystem-and-accessibility |
Ecosystem & Accessibility |
enterprise-management-tools |
Enterprise Management Tools |
platform-governance |
Platform Governance |
projects-and-issues |
Projects & Issues |
supply-chain-security |
Supply Chain Security |
universe25 |
Universe '25 |
📄 Article format
Each processed article follows this markdown structure:
---
title: "Article Title"
date: "2026-02-15"
type: "new-releases"
labels: ["copilot", "client-apps"]
image_url: "https://github.blog/wp-content/uploads/..."
article_url: "https://github.blog/changelog/2026-02-15-slug"
---
# Article Title

---
## What's new
One-liner with **key product/feature** and **status**.
### Why it matters
- **Key benefit 1** — short explanation
- **Key benefit 2** — short explanation
### Where you can use it
- **Platform 1** — details
### Who gets it
- Plans, rollout info
<!-- speaker_notes: Speaker notes in the target language (5–8 sentences). -->The ## heading varies by type: What's new (new-releases), What changed (improvements), What's deprecated (deprecations).
copilot-updates/ # Root IS the skill folder
├── SKILL.md # Skill definition (entry point)
├── scripts/
│ ├── fetch_articles.py # Stage 1 — Web scraper
│ ├── process_articles.py # Stage 2 — Batch planning, validation, indexing
│ ├── create_pptx.py # Stage 3 — PowerPoint generator
│ ├── config.yaml # Centralized configuration
│ ├── pyproject.toml # Python dependencies
│ └── imgs/ # Fallback hero images
├── references/ # Summary format guides (loaded by SKILL.md)
│ ├── summarize-new-releases.md
│ ├── summarize-improvements.md
│ ├── summarize-deprecations.md
│ └── translate-content.md
├── docs/imgs/ # README screenshots
├── output/ # Generated artifacts (git-ignored)
│ ├── raw/ # Scraped raw articles
│ └── {locale}/ # Processed articles per language
├── README.md
├── LICENSE
└── .github/
├── copilot-instructions.md # Repo-wide Copilot rules
└── skills/
└── make-skill-template/ # Skill scaffolding utility
Contributions are welcome! Here's how to get started:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes
- Open a Pull Request
Important
When adding new categories or labels, update scripts/config.yaml — all scripts read it at startup.
Special thanks to @congiuluc for conceiving and inspiring this solution.
Built entirely with GitHub Copilot.
MIT License · Made with ❤️ and 🤖



