This repo turns presentations into annotated blog-style write-ups with embedded slide images. It uses GitHub Copilot agent skills and prompts (backed by Azure OpenAI) to process video recordings and PDF slides.
Each presentation requires:
- Slides: PDF file, PDF URL, PPTX file, OneDrive sharing link, or RevealJS URL (required)
- Recording: YouTube video URL or local MP4 file (required)
- Transcript: Optional text file (auto-fetched from video if not provided)
Install uv if you haven't already:
curl -LsSf https://astral.sh/uv/install.sh | shInstall the project dependencies:
uv syncInstall Playwright browsers (required for RevealJS support):
uv run playwright install chromiumYou'll also need:
- Azure OpenAI access with the following environment variables:
AZURE_OPENAI_ENDPOINT: Your Azure OpenAI endpoint URLAZURE_OPENAI_CHAT_DEPLOYMENT: The deployment name for chat completions
- Azure authentication configured (uses
DefaultAzureCredential- works with Azure CLI login, managed identity, etc.) popplerinstalled for PDF processing:brew install popplerLibreOfficeinstalled for PPTX support (optional):brew install --cask libreoffice
Create a presentation.md file in your presentation folder:
# My Presentation
- **Date:** 2026-01-06
- **Video:** https://www.youtube.com/watch?v=abc123
- **Slides:** slides.pdf
- **Transcript:** transcript.txt
## Notes
Any additional contextRequired fields: Video (YouTube URL or local MP4 path) and Slides (PDF path, PPTX URL, OneDrive link, or RevealJS URL). All others are optional.
Then run the generate-writeup prompt in VS Code Copilot Chat:
/generate-writeup presentations/my-talk
This uses the prompt defined in .github/prompts/generate-writeup.prompt.md, which orchestrates the full pipeline:
- Fetches/converts slides to PDF (if URL provided)
- Converts PDF slides to images
- Extracts transcript from YouTube
- Generates chapter summaries
- Extracts slide text and generates slide outline
- Creates an annotated blog-style write-up with embedded slide images
All generated outputs are saved to an outputs/ folder, and intermediate results are cached for faster re-runs.
The pipeline is built from individual agent skills in .github/skills/:
| Skill | Purpose |
|---|---|
/fetch-slides |
Fetch/convert slides from URLs (PDF, PPTX, OneDrive, RevealJS) |
/extract-transcript |
Get timestamped transcript from YouTube |
/convert-slides-to-images |
Convert PDF slides to individual PNGs |
/extract-slide-text |
Extract text from each PDF page into a markdown file |
/outline-slides |
Summarize each slide image into a numbered list |
For RevealJS presentations, provide the presentation URL as the slides value:
- **Slides:** https://pamelafox.github.io/my-talks/some-presentation/The /fetch-slides skill will automatically:
- Append
?print-pdfto the URL - Use Playwright to render the presentation
- Save it as a PDF in the outputs folder
- Continue with the normal processing pipeline
For PowerPoint presentations hosted on OneDrive, provide the sharing URL as the slides value:
- **Slides:** https://onedrive.live.com/:p:/g/personal/...The /fetch-slides skill will automatically:
- Convert the sharing URL to a download URL
- Download the PPTX file
- Convert it to PDF using LibreOffice
- Continue with the normal processing pipeline
Note: LibreOffice must be installed for PPTX conversion (brew install --cask libreoffice on macOS).
presentations/
my-talk/
presentation.md # Configuration: video URL, slides path/URL
slides.pdf # PDF slides (if using local file)
transcript.txt # Optional: pre-made transcript
outputs/ # All generated content
slides.pdf # Downloaded PDF (if using RevealJS URL)
slide_images/ # Individual slide images (PNG)
chapters.txt # Generated video chapters
outline.txt # Generated slide outline
transcript.txt # Fetched/cached transcript
writeup.md # Final annotated blog post
Inspired by the hamel package by Hamel Husain.