<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Milen</title>
    <description>The latest articles on Forem by Milen (@milenpkurian).</description>
    <link>https://forem.com/milenpkurian</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3740874%2F3f959bed-4b3c-4bdf-b8ce-7e449e378659.png</url>
      <title>Forem: Milen</title>
      <link>https://forem.com/milenpkurian</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/milenpkurian"/>
    <language>en</language>
    <item>
      <title>YTBlog‑Pilot — Convert YouTube videos into polished, SEO-ready blog posts</title>
      <dc:creator>Milen</dc:creator>
      <pubDate>Sun, 08 Feb 2026 17:30:03 +0000</pubDate>
      <link>https://forem.com/milenpkurian/ytblog-pilot-convert-youtube-videos-into-polished-seo-ready-blog-posts-1pg1</link>
      <guid>https://forem.com/milenpkurian/ytblog-pilot-convert-youtube-videos-into-polished-seo-ready-blog-posts-1pg1</guid>
      <description>&lt;p&gt;YTBlog-Pilot is a powerful .NET 10 CLI tool that converts YouTube video transcripts into well-structured, engaging blog posts using AI models like Claude, GPT, and Gemini. Perfect for content creators, developers, and bloggers who want to repurpose video content.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🎥 &lt;strong&gt;Extract YouTube Transcripts&lt;/strong&gt; - Automatically fetch video transcripts and metadata&lt;/li&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI-Powered Generation&lt;/strong&gt; - Choose from 16+ AI models (Claude Sonnet/Haiku/Opus, GPT-5.x, Gemini)&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;Interactive Mode&lt;/strong&gt; - Beautiful CLI with guided prompts and progress tracking&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Multi-Video Support&lt;/strong&gt; - Process multiple videos or entire playlists at once&lt;/li&gt;
&lt;li&gt;🎬 &lt;strong&gt;Playlist Expansion&lt;/strong&gt; - Automatically extract all videos from YouTube playlists&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;Customizable Templates&lt;/strong&gt; - Use built-in or create your own Markdown templates&lt;/li&gt;
&lt;li&gt;🎨 &lt;strong&gt;HTML Output&lt;/strong&gt; - Generate styled HTML alongside Markdown&lt;/li&gt;
&lt;li&gt;💾 &lt;strong&gt;Smart Caching&lt;/strong&gt; - Avoid redundant API calls with intelligent caching (7-day TTL)&lt;/li&gt;
&lt;li&gt;🔄 &lt;strong&gt;Retry Logic&lt;/strong&gt; - Automatic exponential backoff for failed requests&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;Beautiful UI&lt;/strong&gt; - Powered by Spectre.Console with progress bars and spinners&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  My Experience with GitHub Copilot CLI
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot CLI was used extensively throughout development and materially sped up iteration: it helped prototype and refine prompts, scaffold C# implementations (transcript chunking, retry policies, caching), generate Spectre.Console interactive flows, and accelerate unit test scaffolding and README content. &lt;/p&gt;




&lt;h2&gt;
  
  
  📸 Screenshots
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Interactive Mode
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn4fuixudpz1587l7dhno.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn4fuixudpz1587l7dhno.png" alt=" " width="750" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Step-by-step guided experience with AI model selection&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-Video Processing
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwwf1ss8fkq5vbglxwsea.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwwf1ss8fkq5vbglxwsea.png" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Process multiple videos or playlists in one go&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Generated Output
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4joylv72hl2r9maqmzuh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4joylv72hl2r9maqmzuh.png" alt=" " width="800" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Professional blog posts with YAML frontmatter and proper formatting&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Quick Start
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;Before you begin, ensure you have the following installed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://dotnet.microsoft.com/download/dotnet/10.0" rel="noopener noreferrer"&gt;.NET 10 SDK&lt;/a&gt;&lt;/strong&gt; (Required)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Verify installation&lt;/span&gt;
   dotnet &lt;span class="nt"&gt;--version&lt;/span&gt;
   &lt;span class="c"&gt;# Should show: 10.0.x&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://docs.github.com/en/copilot/using-github-copilot/using-github-copilot-in-the-command-line" rel="noopener noreferrer"&gt;GitHub Copilot CLI&lt;/a&gt;&lt;/strong&gt; (Required)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Install Copilot CLI (standalone command)&lt;/span&gt;
   &lt;span class="c"&gt;# Visit: https://github.com/github/gh-copilot&lt;/span&gt;

   &lt;span class="c"&gt;# Authenticate&lt;/span&gt;
   copilot login

   &lt;span class="c"&gt;# Test it works&lt;/span&gt;
   copilot &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Hello world"&lt;/span&gt; &lt;span class="nt"&gt;--allow-all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot Subscription&lt;/strong&gt; (Required for AI generation)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Option 1: From Source (Recommended for now)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Clone the repository&lt;/span&gt;
git clone https://github.com/Milenpkurian/ytblog-pilot.git
&lt;span class="nb"&gt;cd &lt;/span&gt;ytblog-pilot

&lt;span class="c"&gt;# 2. Build the project&lt;/span&gt;
dotnet build

&lt;span class="c"&gt;# 3. Pack and install globally&lt;/span&gt;
dotnet pack VideoToBlog/VideoToBlog.csproj &lt;span class="nt"&gt;-c&lt;/span&gt; Release
dotnet tool &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--global&lt;/span&gt; &lt;span class="nt"&gt;--add-source&lt;/span&gt; ./VideoToBlog/bin/Release YTBlogPilot.CLI

&lt;span class="c"&gt;# 4. Verify installation&lt;/span&gt;
ytblog-pilot &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📖 Usage
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Interactive Mode (Recommended for Beginners)
&lt;/h3&gt;

&lt;p&gt;Simply run the command without arguments:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ytblog-pilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll be guided through:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AI Model Selection&lt;/strong&gt; - Choose from 16+ models&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Sonnet 4.5 (Recommended) - Balanced quality and speed&lt;/li&gt;
&lt;li&gt;Claude Haiku 4.5 (Fast &amp;amp; Cheap) - Quick processing&lt;/li&gt;
&lt;li&gt;Claude Opus 4.6 (Premium) - Highest quality&lt;/li&gt;
&lt;li&gt;GPT-5.2, GPT-5.1, GPT-5 variants&lt;/li&gt;
&lt;li&gt;Gemini 3 Pro&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;YouTube URLs&lt;/strong&gt; - Enter one or more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single video: &lt;code&gt;https://www.youtube.com/watch?v=VIDEO_ID&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Multiple videos: &lt;code&gt;url1, url2, url3&lt;/code&gt; (comma or space separated)&lt;/li&gt;
&lt;li&gt;Playlist: &lt;code&gt;https://www.youtube.com/playlist?list=PLAYLIST_ID&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Mixed: Any combination&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Template Selection&lt;/strong&gt; - Choose your blog template (&lt;code&gt;default&lt;/code&gt;, &lt;code&gt;custom&lt;/code&gt;, etc.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Output Directory&lt;/strong&gt; - Specify where to save files (default: &lt;code&gt;./output&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Additional Options&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate HTML alongside Markdown&lt;/li&gt;
&lt;li&gt;Overwrite existing files&lt;/li&gt;
&lt;li&gt;And more!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Command-Line Mode (For Automation)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Basic usage&lt;/span&gt;
ytblog-pilot https://www.youtube.com/watch?v&lt;span class="o"&gt;=&lt;/span&gt;dQw4w9WgXcQ

&lt;span class="c"&gt;# With options&lt;/span&gt;
ytblog-pilot &amp;lt;url&amp;gt; &lt;span class="nt"&gt;--html&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; ./myblog &lt;span class="nt"&gt;--template&lt;/span&gt; custom &lt;span class="nt"&gt;--verbose&lt;/span&gt;

&lt;span class="c"&gt;# Force overwrite&lt;/span&gt;
ytblog-pilot &amp;lt;url&amp;gt; &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Multi-Video Processing
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# In interactive mode, enter multiple URLs:&lt;/span&gt;
&lt;span class="c"&gt;# Single: https://www.youtube.com/watch?v=vid1&lt;/span&gt;
&lt;span class="c"&gt;# Multiple: vid1_url, vid2_url, vid3_url&lt;/span&gt;
&lt;span class="c"&gt;# Playlist: https://www.youtube.com/playlist?list=PLa1F2ddGya...&lt;/span&gt;

&lt;span class="c"&gt;# The tool will:&lt;/span&gt;
&lt;span class="c"&gt;# 1. Expand playlists to individual videos&lt;/span&gt;
&lt;span class="c"&gt;# 2. Fetch transcripts for all videos&lt;/span&gt;
&lt;span class="c"&gt;# 3. Generate a comprehensive blog post combining all content&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎨 Customization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Templates
&lt;/h3&gt;

&lt;p&gt;Create custom templates in the &lt;code&gt;templates/&lt;/code&gt; directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt;TITLE&lt;/span&gt;&lt;span class="pi"&gt;}}&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt;DESCRIPTION&lt;/span&gt;&lt;span class="pi"&gt;}}&lt;/span&gt;
&lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt;DATE&lt;/span&gt;&lt;span class="pi"&gt;}}&lt;/span&gt;
&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt;TAGS&lt;/span&gt;&lt;span class="pi"&gt;}}&lt;/span&gt;
&lt;span class="na"&gt;reading_time&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt;READING_TIME&lt;/span&gt;&lt;span class="pi"&gt;}}&lt;/span&gt;
&lt;span class="na"&gt;video_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt;VIDEO_URL&lt;/span&gt;&lt;span class="pi"&gt;}}&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# {{TITLE}}&lt;/span&gt;

{{CONTENT}}
&lt;span class="p"&gt;
---
&lt;/span&gt;
&lt;span class="ge"&gt;*This blog post was generated from a YouTube video transcript.*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Available Placeholders:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;{{TITLE}}&lt;/code&gt; - Video title&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{{DESCRIPTION}}&lt;/code&gt; - Auto-generated description&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{{DATE}}&lt;/code&gt; - Current date&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{{TAGS}}&lt;/code&gt; - Auto-extracted tags&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{{READING_TIME}}&lt;/code&gt; - Estimated reading time&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{{VIDEO_URL}}&lt;/code&gt; - Original YouTube URL&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{{CONTENT}}&lt;/code&gt; - AI-generated blog content&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Configuration
&lt;/h3&gt;

&lt;p&gt;Edit &lt;code&gt;VideoToBlog/appsettings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"AppSettings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"CacheDirectory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".cache"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"CacheTtlDays"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"MaxTranscriptLength"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ChunkSize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"DefaultOutputDirectory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./output"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"DefaultTemplate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"MaxRetries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"RetryDelaySeconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"CopilotTimeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📂 Output Format
&lt;/h2&gt;

&lt;p&gt;Generated blog posts include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;YAML Frontmatter&lt;/strong&gt; with metadata (title, description, date, tags, reading time)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Properly Formatted Markdown&lt;/strong&gt; with headings, lists, code blocks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO-Friendly Description&lt;/strong&gt; (auto-extracted from content)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-Generated Tags&lt;/strong&gt; (extracted from title and content)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reading Time Estimate&lt;/strong&gt; (based on word count)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Link to Original Video&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Python&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Tips&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Beginners"&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Learn&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;essential&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Python&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;tips&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;tricks&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;that&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;will&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;boost&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;your..."&lt;/span&gt;
&lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-02-08&lt;/span&gt;
&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;python"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tutorial"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;programming"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;reading_time&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5 min read&lt;/span&gt;
&lt;span class="na"&gt;video_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://www.youtube.com/watch?v=example&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# 10 Python Tips for Beginners&lt;/span&gt;

&lt;span class="gu"&gt;## Introduction&lt;/span&gt;

In this comprehensive guide, we'll explore...

&lt;span class="gu"&gt;## 1. Use List Comprehensions&lt;/span&gt;

List comprehensions provide a concise way to create lists...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🛠️ Development
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Building from Source
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone and build&lt;/span&gt;
git clone https://github.com/Milenpkurian/ytblog-pilot.git
&lt;span class="nb"&gt;cd &lt;/span&gt;ytblog-pilot
dotnet build

&lt;span class="c"&gt;# Run tests&lt;/span&gt;
dotnet &lt;span class="nb"&gt;test&lt;/span&gt;

&lt;span class="c"&gt;# Run locally (interactive mode)&lt;/span&gt;
dotnet run &lt;span class="nt"&gt;--project&lt;/span&gt; VideoToBlog/VideoToBlog.csproj

&lt;span class="c"&gt;# Run locally (command-line mode)&lt;/span&gt;
dotnet run &lt;span class="nt"&gt;--project&lt;/span&gt; VideoToBlog/VideoToBlog.csproj &lt;span class="nt"&gt;--&lt;/span&gt; &amp;lt;youtube-url&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;options]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Project Structure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ytblog-pilot/
├── .github/
│   ├── assets/              # Screenshots and images
│   └── copilot-instructions.md  # AI assistant guidelines
├── VideoToBlog/             # Main CLI project
│   ├── Commands/            # Interactive &amp;amp; ConvertCommand
│   ├── Services/            # Business logic
│   ├── Models/              # Data models
│   ├── Configuration/       # AppSettings
│   └── Exceptions/          # Custom exceptions
├── VideoToBlog.Tests/       # xUnit tests
├── templates/               # Blog post templates
├── output/                  # Generated blog posts
├── .cache/                  # Transcript cache
└── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Running Tests
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run all tests&lt;/span&gt;
dotnet &lt;span class="nb"&gt;test&lt;/span&gt;

&lt;span class="c"&gt;# Run specific test&lt;/span&gt;
dotnet &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--filter&lt;/span&gt; FullyQualifiedName~VideoToBlog.Tests.BlogPostServiceTests.GenerateBlogPostAsync_WithValidVideoInfo_ReturnsBlogPostWithCorrectTitle

&lt;span class="c"&gt;# Run with verbose output&lt;/span&gt;
dotnet &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--logger&lt;/span&gt; &lt;span class="s2"&gt;"console;verbosity=detailed"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>cli</category>
      <category>githubcopilot</category>
    </item>
  </channel>
</rss>
