From YouTube to Blog Post: How I Built a Self-Maintaining Website
February 15, 2026
In this post I walk through the three automation pipelines that keep this website up to date without any manual intervention.
TL;DR
- A daily GitHub Actions cron job fetches my latest YouTube video
- Downloads the transcript using
youtube-transcript-api - Sends it to Claude (
claude-sonnet-4-20250514) to generate a structured blog post - Commits the Markdown file and triggers a Hugo rebuild
Key Takeaways
- The whole process takes about 60 seconds from video publish to draft post
- The Claude prompt is the most important part — iteration matters
- Always diff before commit to avoid unnecessary rebuilds
The Pipeline
Step 1: Detect new video
import yaml, requests
def get_latest_video(api_key, channel_id):
url = "https://www.googleapis.com/youtube/v3/search"
params = {"key": api_key, "channelId": channel_id,
"order": "date", "part": "snippet", "maxResults": 1}
r = requests.get(url, params=params).json()
return r["items"][0]
Step 2: Generate blog post with Claude
The Claude API call uses a structured prompt that ensures the output includes all required frontmatter fields and a consistent article structure.