<?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>DEV Community: Gokul Nathan</title>
    <description>The latest articles on DEV Community by Gokul Nathan (@gokulnathan66).</description>
    <link>https://dev.to/gokulnathan66</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2802409%2Fec819928-130d-4251-8172-5ee6407d7d14.png</url>
      <title>DEV Community: Gokul Nathan</title>
      <link>https://dev.to/gokulnathan66</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gokulnathan66"/>
    <language>en</language>
    <item>
      <title>Article Automation Test Repository</title>
      <dc:creator>Gokul Nathan</dc:creator>
      <pubDate>Sun, 10 Aug 2025 07:55:48 +0000</pubDate>
      <link>https://dev.to/gokulnathan66/testing-the-possiblities-5033</link>
      <guid>https://dev.to/gokulnathan66/testing-the-possiblities-5033</guid>
      <description>&lt;h1&gt;
  
  
  Article Automation Test Repository
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;🚀 &lt;a href="https://github.com/features/actions" rel="noopener noreferrer"&gt;GitHub Actions&lt;/a&gt; • 📚 &lt;a href="https://hashnode.com" rel="noopener noreferrer"&gt;Hashnode&lt;/a&gt; • 📝 &lt;a href="https://dev.to"&gt;Dev.to&lt;/a&gt; • 📄 MIT License&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🧪 &lt;strong&gt;Test repository demonstrating the multi-platform blog publishing system&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This repository serves as a &lt;strong&gt;demonstration and testing ground&lt;/strong&gt; for the &lt;a href="https://github.com/gokulnathan66/article-automation" rel="noopener noreferrer"&gt;article-automation&lt;/a&gt; GitHub Actions that automatically publish content to Hashnode and Dev.to platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  📑 Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🎯 Purpose&lt;/li&gt;
&lt;li&gt;⚡ Quick Start&lt;/li&gt;
&lt;li&gt;📋 Prerequisites&lt;/li&gt;
&lt;li&gt;📁 Repository Structure&lt;/li&gt;
&lt;li&gt;📝 Test Content&lt;/li&gt;
&lt;li&gt;🔄 How It Works&lt;/li&gt;
&lt;li&gt;📥 Installation&lt;/li&gt;
&lt;li&gt;⚙️ Workflow Configuration&lt;/li&gt;
&lt;li&gt;🔐 Required Secrets&lt;/li&gt;
&lt;li&gt;🎮 Testing the System&lt;/li&gt;
&lt;li&gt;📊 Execution Process&lt;/li&gt;
&lt;li&gt;🔧 Debugging &amp;amp; Troubleshooting&lt;/li&gt;
&lt;li&gt;📈 Expected Results&lt;/li&gt;
&lt;li&gt;🎯 Use Cases&lt;/li&gt;
&lt;li&gt;🤝 Contributing&lt;/li&gt;
&lt;li&gt;📄 License&lt;/li&gt;
&lt;li&gt;🔗 Related Links&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎯 Purpose
&lt;/h2&gt;

&lt;p&gt;This repository demonstrates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ How to structure content for automated publishing&lt;/li&gt;
&lt;li&gt;✅ Proper workflow configuration&lt;/li&gt;
&lt;li&gt;✅ Integration with multiple blogging platforms&lt;/li&gt;
&lt;li&gt;✅ Automated image URL conversion&lt;/li&gt;
&lt;li&gt;✅ Post update functionality&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Estimated setup time: 15-20 minutes&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Quick Start Checklist
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fork this repository&lt;/strong&gt; (2 min)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get API keys&lt;/strong&gt; from Hashnode and Dev.to (5-10 min)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configure secrets&lt;/strong&gt; in repository settings (3-5 min)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test the workflow&lt;/strong&gt; with sample content (2-3 min)&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;First time?&lt;/strong&gt; Follow the detailed Installation section below.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  📋 Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before setting up the automation, ensure you have:&lt;/p&gt;

&lt;h3&gt;
  
  
  🔐 Account Requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub account&lt;/strong&gt; with repository admin access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hashnode account&lt;/strong&gt; with a publication (free tier supported)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dev.to account&lt;/strong&gt; with API access enabled&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📝 Content Requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Articles written in &lt;strong&gt;Markdown format&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Images hosted on GitHub or external CDN&lt;/li&gt;
&lt;li&gt;Basic understanding of &lt;strong&gt;GitHub Actions&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛠️ Technical Requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No local setup required&lt;/strong&gt; - runs entirely on GitHub Actions&lt;/li&gt;
&lt;li&gt;Compatible with &lt;strong&gt;public and private repositories&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Supports &lt;strong&gt;automated and manual triggers&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📊 Platform Limits
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Rate Limits&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hashnode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100 requests/hour&lt;/td&gt;
&lt;td&gt;GraphQL API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dev.to&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;30 requests/30 seconds&lt;/td&gt;
&lt;td&gt;REST API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Actions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2,000 minutes/month (free)&lt;/td&gt;
&lt;td&gt;Ubuntu runners&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  📁 Repository Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;article-automation-test/
├── 📁 content/
│   └── 📄 README.md              # Your article content (required)
├── 📁 images/                    # Referenced images (optional)
│   ├── 🖼️ demo-screenshot.png
│   └── 🖼️ feature-diagram.jpg
├── 📁 .github/workflows/
│   ├── ⚙️ devto.yml             # Dev.to publishing workflow
│   ├── ⚙️ hashnode.yml          # Hashnode publishing workflow
│   └── ⚙️ publish.yml           # Combined workflow (recommended)
├── 📄 .gitignore                # Git ignore rules
├── 📄 LICENSE                   # MIT license
└── 📄 README.md                 # This documentation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📋 File Descriptions
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File/Folder&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;content/README.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Your article content in Markdown&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Required&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;images/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Static images referenced in articles&lt;/td&gt;
&lt;td&gt;❌ Optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.github/workflows/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GitHub Actions automation&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Required&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.gitignore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Excludes temporary files&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Recommended&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LICENSE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Project license&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Recommended&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  📝 Test Content
&lt;/h2&gt;

&lt;p&gt;The test article in &lt;code&gt;content/README.md&lt;/code&gt; should follow this structure:&lt;/p&gt;

&lt;h3&gt;
  
  
  📋 Content Format Requirements
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Your Article Title&lt;/span&gt;

Your article introduction goes here. This will become the description.

&lt;span class="gu"&gt;## Section Headers&lt;/span&gt;

Use standard markdown formatting:
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="gs"&gt;**Bold text**&lt;/span&gt; for emphasis
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="ge"&gt;*Italic text*&lt;/span&gt; for subtle emphasis
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`inline code`&lt;/span&gt; for technical terms
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;links&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; to external resources

&lt;span class="gu"&gt;### Code Blocks&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
javascript&lt;br&gt;
// Your code examples&lt;br&gt;
function example() {&lt;br&gt;
    return "Hello World!";&lt;br&gt;
}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
### Images

![Alt text](https://raw.githubusercontent.com/gokulnathan66/article-automation-test/main/./images/screenshot.png)
&amp;lt;!-- Will be converted to: https://raw.githubusercontent.com/username/repo/main/images/screenshot.png --&amp;gt;

---

**Tags:** javascript, tutorial, automation, github-actions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ⚠️ &lt;strong&gt;Platform Compatibility Notes&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;GitHub&lt;/th&gt;
&lt;th&gt;Hashnode&lt;/th&gt;
&lt;th&gt;Dev.to&lt;/th&gt;
&lt;th&gt;Alternative&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HTML Badges&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;td&gt;❌ Not supported&lt;/td&gt;
&lt;td&gt;Use text alternatives&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HTML Tags&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Most supported&lt;/td&gt;
&lt;td&gt;✅ Most supported&lt;/td&gt;
&lt;td&gt;❌ Markdown only&lt;/td&gt;
&lt;td&gt;Use markdown equivalents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom CSS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ In repos&lt;/td&gt;
&lt;td&gt;❌ Limited&lt;/td&gt;
&lt;td&gt;❌ Not supported&lt;/td&gt;
&lt;td&gt;Use standard formatting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tables&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;td&gt;✅ Safe to use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Code Blocks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;td&gt;✅ Safe to use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Emojis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;td&gt;✅ Safe to use&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Tip&lt;/strong&gt;: When writing content for multi-platform publishing, stick to standard Markdown to ensure compatibility across GitHub, Hashnode, and Dev.to.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ✅ Content Validation Checklist
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Title starts with &lt;code&gt;#&lt;/code&gt; (becomes post title)&lt;/li&gt;
&lt;li&gt;[ ] Images use relative paths (&lt;code&gt;./images/file.png&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;[ ] Tags listed at bottom (&lt;code&gt;**Tags:** tag1, tag2, tag3&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;[ ] Proper markdown formatting throughout&lt;/li&gt;
&lt;li&gt;[ ] No HTML tags (use markdown equivalents)&lt;/li&gt;
&lt;li&gt;[ ] External links include &lt;code&gt;https://&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔄 How It Works
&lt;/h2&gt;

&lt;p&gt;When content is pushed to the &lt;code&gt;main&lt;/code&gt; branch:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions Trigger&lt;/strong&gt;: The workflow in &lt;code&gt;.github/workflows/publish.yml&lt;/code&gt; runs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content Processing&lt;/strong&gt;: Actions read &lt;code&gt;content/README.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image URL Conversion&lt;/strong&gt;: Relative image paths → GitHub raw URLs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Platform Publishing&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hashnode&lt;/strong&gt;: Uses GraphQL API to publish/update&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dev.to&lt;/strong&gt;: Uses REST API to publish/update&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State Management&lt;/strong&gt;: Saves post IDs for future updates&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  📥 Installation
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Important&lt;/strong&gt;: This is a test repository. To use the automation in your own projects, follow these detailed steps:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🍴 Step 1: Fork Repository (2 minutes)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Click "Fork"&lt;/strong&gt; button at the top of this repository&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose your account&lt;/strong&gt; as the destination&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the same name&lt;/strong&gt; or customize it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ensure "Copy the main branch only"&lt;/strong&gt; is checked&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🔑 Step 2: Get API Keys (5-10 minutes)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Hashnode API Key&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://hashnode.com/settings/developer" rel="noopener noreferrer"&gt;Hashnode Settings&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Generate New Token"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy the PAT&lt;/strong&gt; (Personal Access Token)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Find your Publication ID&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Go to your publication dashboard&lt;/li&gt;
&lt;li&gt;Copy the ID from the URL or settings&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Dev.to API Key&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Visit &lt;a href="https://dev.to/settings/extensions"&gt;Dev.to API Keys&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generate new API key&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy the key&lt;/strong&gt; (starts with &lt;code&gt;dto_&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;GitHub Token&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://github.com/settings/tokens?type=beta" rel="noopener noreferrer"&gt;GitHub Token Settings&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create fine-grained token&lt;/strong&gt; for your repository&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Select permissions&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;Contents: Read and Write&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;Actions: Write&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;Variables: Write&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🔐 Step 3: Configure Secrets (3-5 minutes)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Go to your forked repository&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Click Settings&lt;/strong&gt; → &lt;strong&gt;Secrets and variables&lt;/strong&gt; → &lt;strong&gt;Actions&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add the following secrets&lt;/strong&gt;:
&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;# Required for Hashnode&lt;/span&gt;
&lt;span class="nv"&gt;HASHNODE_PAT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;hn_pat_your_token_here
&lt;span class="nv"&gt;HASHNODE_PUBLICATION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_publication_id
&lt;span class="nv"&gt;HASHNODE_PUBLICATION_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yourblog.hashnode.dev

&lt;span class="c"&gt;# Required for Dev.to&lt;/span&gt;
&lt;span class="nv"&gt;DEV_TO_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dto_your_api_key_here

&lt;span class="c"&gt;# Required for both&lt;/span&gt;
&lt;span class="nv"&gt;VAR_EDIT_TOKEN_GIT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;github_pat_your_token_here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📝 Step 4: Test the Setup (2-3 minutes)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Edit &lt;code&gt;content/README.md&lt;/code&gt;&lt;/strong&gt; with your test article&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commit and push&lt;/strong&gt; to main branch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Go to Actions tab&lt;/strong&gt; to watch the workflow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check your platforms&lt;/strong&gt; for published articles&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro tip&lt;/strong&gt;: Start with a simple test article to verify everything works before publishing your main content.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  ⚙️ Workflow Configuration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  📋 Available Workflow Options
&lt;/h3&gt;

&lt;p&gt;Choose the configuration that best fits your needs:&lt;/p&gt;

&lt;h4&gt;
  
  
  🚀 &lt;strong&gt;Option 1: Combined Workflow&lt;/strong&gt; (Recommended)
&lt;/h4&gt;

&lt;p&gt;Create &lt;code&gt;.github/workflows/publish.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Multi-Platform Publishing&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content/**'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# Only trigger on content changes&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;platform&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="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Platform&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;publish&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to'&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
        &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;both'&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;choice&lt;/span&gt;
        &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;both&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;hashnode&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;devto&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;validate-content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;outputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;has-content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ steps.check.outputs.has-content }}&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout repository&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Check if content exists&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;check&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;if [ -f "content/README.md" ] &amp;amp;&amp;amp; [ -s "content/README.md" ]; then&lt;/span&gt;
            &lt;span class="s"&gt;echo "has-content=true" &amp;gt;&amp;gt; $GITHUB_OUTPUT&lt;/span&gt;
          &lt;span class="s"&gt;else&lt;/span&gt;
            &lt;span class="s"&gt;echo "has-content=false" &amp;gt;&amp;gt; $GITHUB_OUTPUT&lt;/span&gt;
            &lt;span class="s"&gt;echo "❌ No content found in content/README.md"&lt;/span&gt;
            &lt;span class="s"&gt;exit 1&lt;/span&gt;
          &lt;span class="s"&gt;fi&lt;/span&gt;

  &lt;span class="na"&gt;publish-hashnode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;validate-content&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;needs.validate-content.outputs.has-content == 'true' &amp;amp;&amp;amp; (github.event.inputs.platform == 'hashnode' || github.event.inputs.platform == 'both' || github.event.inputs.platform == '')&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout repository&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Validate Hashnode secrets&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;if [ -z "${{ secrets.HASHNODE_PAT }}" ]; then&lt;/span&gt;
            &lt;span class="s"&gt;echo "❌ HASHNODE_PAT secret is missing"&lt;/span&gt;
            &lt;span class="s"&gt;exit 1&lt;/span&gt;
          &lt;span class="s"&gt;fi&lt;/span&gt;
          &lt;span class="s"&gt;if [ -z "${{ secrets.HASHNODE_PUBLICATION_ID }}" ]; then&lt;/span&gt;
            &lt;span class="s"&gt;echo "❌ HASHNODE_PUBLICATION_ID secret is missing"&lt;/span&gt;
            &lt;span class="s"&gt;exit 1&lt;/span&gt;
          &lt;span class="s"&gt;fi&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Publish to Hashnode&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gokulnathan66/article-automation/hashnode-publish@main&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;hashnode-pat&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.HASHNODE_PAT }}&lt;/span&gt;
          &lt;span class="na"&gt;hashnode-publication-id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.HASHNODE_PUBLICATION_ID }}&lt;/span&gt;
          &lt;span class="na"&gt;hashnode-publication-host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.HASHNODE_PUBLICATION_HOST }}&lt;/span&gt;
          &lt;span class="na"&gt;github-token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.VAR_EDIT_TOKEN_GIT }}&lt;/span&gt;
          &lt;span class="c1"&gt;# State management variables&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.HASHNODE_SAVED_POST_ID }}&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-slug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.HASHNODE_SAVED_POST_SLUG }}&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.HASHNODE_SAVED_POST_TITLE }}&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.HASHNODE_SAVED_POST_URL }}&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-published-at&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.HASHNODE_SAVED_POST_PUBLISHED_AT }}&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-updated-at&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.HASHNODE_SAVED_POST_UPDATED_AT }}&lt;/span&gt;

  &lt;span class="na"&gt;publish-devto&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;validate-content&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;needs.validate-content.outputs.has-content == 'true' &amp;amp;&amp;amp; (github.event.inputs.platform == 'devto' || github.event.inputs.platform == 'both' || github.event.inputs.platform == '')&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout repository&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Validate Dev.to secrets&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;if [ -z "${{ secrets.DEV_TO_API_KEY }}" ]; then&lt;/span&gt;
            &lt;span class="s"&gt;echo "❌ DEV_TO_API_KEY secret is missing"&lt;/span&gt;
            &lt;span class="s"&gt;exit 1&lt;/span&gt;
          &lt;span class="s"&gt;fi&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Publish to Dev.to&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gokulnathan66/article-automation/devto-publish@main&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;devto-api-key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.DEV_TO_API_KEY }}&lt;/span&gt;
          &lt;span class="na"&gt;github-token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.VAR_EDIT_TOKEN_GIT }}&lt;/span&gt;
          &lt;span class="c1"&gt;# State management variables&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.DEV_TO_SAVED_POST_ID }}&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.DEV_TO_SAVED_POST_TITLE }}&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.DEV_TO_SAVED_POST_URL }}&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-published-at&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.DEV_TO_SAVED_POST_PUBLISHED_AT }}&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-updated-at&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.DEV_TO_SAVED_POST_UPDATED_AT }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  🔧 &lt;strong&gt;Option 2: Separate Workflows&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;For more granular control, create separate workflow files:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;.github/workflows/hashnode.yml&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;.github/workflows/devto.yml&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚙️ &lt;strong&gt;Workflow Features&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Benefit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Content Validation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Checks if content exists before publishing&lt;/td&gt;
&lt;td&gt;Prevents empty posts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Secret Validation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Verifies all required secrets are configured&lt;/td&gt;
&lt;td&gt;Early error detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Manual Triggers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Allows publishing to specific platforms&lt;/td&gt;
&lt;td&gt;Testing flexibility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Path Filtering&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Only runs when content changes&lt;/td&gt;
&lt;td&gt;Saves CI minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;State Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tracks published posts for updates&lt;/td&gt;
&lt;td&gt;Smart update logic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  🔐 Required Secrets
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Important&lt;/strong&gt;: Configure these secrets in your repository before running the automation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Navigate to &lt;strong&gt;Repository Settings → Secrets and variables → Actions&lt;/strong&gt; and add:&lt;/p&gt;

&lt;h3&gt;
  
  
  🌐 Hashnode Integration
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Secret Name&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;How to Get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;HASHNODE_PAT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Personal Access Token&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://hashnode.com/settings" rel="noopener noreferrer"&gt;Hashnode Settings&lt;/a&gt; → API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;HASHNODE_PUBLICATION_ID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Your publication ID&lt;/td&gt;
&lt;td&gt;Found in publication settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;HASHNODE_PUBLICATION_HOST&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Publication domain&lt;/td&gt;
&lt;td&gt;e.g., &lt;code&gt;mysite.hashnode.dev&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  📝 Dev.to Integration
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Secret Name&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;How to Get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DEV_TO_API_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;API key from Dev.to&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.to/settings/extensions"&gt;Dev.to Settings&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  🔧 GitHub Integration
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Secret Name&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Scopes Required&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;VAR_EDIT_TOKEN_GIT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GitHub Personal Access Token&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;repo&lt;/code&gt;, &lt;code&gt;actions:write&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Tip&lt;/strong&gt;: Create a &lt;a href="https://github.com/settings/tokens?type=beta" rel="noopener noreferrer"&gt;fine-grained personal access token&lt;/a&gt; for better security.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🎮 Testing the System
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option 1: Manual Trigger
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Actions&lt;/strong&gt; tab in this repository&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;"Multi-Platform Publishing"&lt;/strong&gt; workflow&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Run workflow"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Watch the execution in real-time&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Option 2: Content Update
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Edit &lt;code&gt;content/README.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Commit and push to &lt;code&gt;main&lt;/code&gt; branch&lt;/li&gt;
&lt;li&gt;Workflow triggers automatically&lt;/li&gt;
&lt;li&gt;Check the Actions tab for execution logs&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Option 3: Fork and Test
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Fork this repository&lt;/li&gt;
&lt;li&gt;Configure your own secrets&lt;/li&gt;
&lt;li&gt;Update &lt;code&gt;content/README.md&lt;/code&gt; with your content&lt;/li&gt;
&lt;li&gt;Push changes to see it published to your platforms&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  📊 Execution Process
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph TD
    A[Push to Main Branch] --&amp;gt; B[GitHub Actions Trigger]
    B --&amp;gt; C[Setup Environment]
    C --&amp;gt; D[Read Content File]
    D --&amp;gt; E[Process Images &amp;amp; Tags]
    E --&amp;gt; F{Platform Publishing}
    F --&amp;gt; G[Hashnode API]
    F --&amp;gt; H[Dev.to API]
    G --&amp;gt; I[Save Metadata]
    H --&amp;gt; I
    I --&amp;gt; J[Complete ✅]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔄 &lt;strong&gt;Phase 1: Setup&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Checkout action repository&lt;/li&gt;
&lt;li&gt;✅ Setup Node.js environment
&lt;/li&gt;
&lt;li&gt;✅ Install dependencies&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📝 &lt;strong&gt;Phase 2: Content Processing&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🔍 Locate &lt;code&gt;content/README.md&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;📝 Extract title from first &lt;code&gt;# heading&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;🖼️ Convert relative image URLs to GitHub raw URLs&lt;/li&gt;
&lt;li&gt;🏷️ Parse tags from &lt;code&gt;Tags:&lt;/code&gt; line at the end&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 &lt;strong&gt;Phase 3: Platform Publishing&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hashnode&lt;/strong&gt;: GraphQL API calls for publish/update&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dev.to&lt;/strong&gt;: REST API calls for publish/update
&lt;/li&gt;
&lt;li&gt;🔍 Check for existing posts by title&lt;/li&gt;
&lt;li&gt;✅ Create new or update existing post&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💾 &lt;strong&gt;Phase 4: State Management&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;💾 Save post IDs to repository variables&lt;/li&gt;
&lt;li&gt;📊 Store metadata for future updates&lt;/li&gt;
&lt;li&gt;✅ Enable smart update functionality&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔧 Debugging &amp;amp; Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔍 &lt;strong&gt;Common Issues &amp;amp; Solutions&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  ❌ &lt;strong&gt;Workflow Fails to Start&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Workflow doesn't trigger on push&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check these common causes:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;th&gt;Prevention&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No workflow file&lt;/td&gt;
&lt;td&gt;Create &lt;code&gt;.github/workflows/publish.yml&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Use provided templates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wrong branch&lt;/td&gt;
&lt;td&gt;Push to &lt;code&gt;main&lt;/code&gt; branch&lt;/td&gt;
&lt;td&gt;Check workflow &lt;code&gt;branches:&lt;/code&gt; setting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing content&lt;/td&gt;
&lt;td&gt;Add content to &lt;code&gt;content/README.md&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Validate content exists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disabled Actions&lt;/td&gt;
&lt;td&gt;Enable Actions in repository settings&lt;/td&gt;
&lt;td&gt;Check Settings → Actions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  🔑 &lt;strong&gt;Authentication Errors&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: &lt;code&gt;401 Unauthorized&lt;/code&gt; or &lt;code&gt;403 Forbidden&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Common secret validation errors&lt;/span&gt;
&lt;span class="na"&gt;Error&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Request failed with status code &lt;/span&gt;&lt;span class="m"&gt;401&lt;/span&gt;
&lt;span class="na"&gt;Error&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Invalid API key format&lt;/span&gt;
&lt;span class="na"&gt;Error&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Token expired or revoked&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solutions&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Verify secret names match exactly&lt;/strong&gt;:
&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;# Required secrets (case-sensitive):&lt;/span&gt;
   HASHNODE_PAT
   HASHNODE_PUBLICATION_ID
   HASHNODE_PUBLICATION_HOST
   DEV_TO_API_KEY
   VAR_EDIT_TOKEN_GIT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Check token permissions&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hashnode&lt;/strong&gt;: Ensure PAT has publication access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dev.to&lt;/strong&gt;: Verify API key is not expired&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: Token needs &lt;code&gt;Contents: Write&lt;/code&gt;, &lt;code&gt;Actions: Write&lt;/code&gt;, &lt;code&gt;Variables: Write&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test tokens manually&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;&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;# Test Hashnode token&lt;/span&gt;
   curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_PAT"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"query":"{ me { id username } }"}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        https://gql.hashnode.com/

   &lt;span class="c"&gt;# Test Dev.to token&lt;/span&gt;
   curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"api-key: YOUR_API_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        https://dev.to/api/articles/me
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  📝 &lt;strong&gt;Content Processing Errors&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Article not parsed correctly&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error Type&lt;/th&gt;
&lt;th&gt;Common Cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;No title found&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Missing &lt;code&gt;# Title&lt;/code&gt; at start&lt;/td&gt;
&lt;td&gt;Add &lt;code&gt;# Your Title&lt;/code&gt; as first line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Images not converted&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Wrong image path format&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;./images/file.png&lt;/code&gt; format&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tags not detected&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Wrong tag format&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;**Tags:** tag1, tag2, tag3&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Content too long&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Article exceeds platform limits&lt;/td&gt;
&lt;td&gt;Check platform limits below&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  📊 &lt;strong&gt;Platform-Specific Limits&lt;/strong&gt;
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Title Limit&lt;/th&gt;
&lt;th&gt;Content Limit&lt;/th&gt;
&lt;th&gt;Tags Limit&lt;/th&gt;
&lt;th&gt;Image Size&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hashnode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;255 chars&lt;/td&gt;
&lt;td&gt;~65,000 chars&lt;/td&gt;
&lt;td&gt;5 tags max&lt;/td&gt;
&lt;td&gt;10MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dev.to&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;128 chars&lt;/td&gt;
&lt;td&gt;~64,000 chars&lt;/td&gt;
&lt;td&gt;4 tags max&lt;/td&gt;
&lt;td&gt;25MB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  🔄 &lt;strong&gt;State Management Issues&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Posts duplicated instead of updated&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check repository variables&lt;/span&gt;
Settings → Secrets and variables → Actions → Variables tab

&lt;span class="c"&gt;# Required variables (auto-created):&lt;/span&gt;
HASHNODE_SAVED_POST_ID
HASHNODE_SAVED_POST_SLUG
DEV_TO_SAVED_POST_ID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Variables are created automatically after first successful publish. If missing:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Delete and recreate the post manually&lt;/li&gt;
&lt;li&gt;Or run workflow again (it will create new post and set variables)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  📋 &lt;strong&gt;Debugging Checklist&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When workflow fails, check in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;✅ Repository Setup&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Workflow file exists in &lt;code&gt;.github/workflows/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Content file exists at &lt;code&gt;content/README.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Content is not empty&lt;/li&gt;
&lt;li&gt;[ ] Pushing to &lt;code&gt;main&lt;/code&gt; branch&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;✅ Secrets Configuration&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] All required secrets are added&lt;/li&gt;
&lt;li&gt;[ ] Secret names match exactly (case-sensitive)&lt;/li&gt;
&lt;li&gt;[ ] No extra spaces in secret values&lt;/li&gt;
&lt;li&gt;[ ] Tokens are not expired&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;✅ Content Format&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Title starts with &lt;code&gt;#&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Images use relative paths (&lt;code&gt;./images/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;[ ] Tags format: &lt;code&gt;**Tags:** tag1, tag2&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] No HTML tags used&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;✅ Platform Accounts&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Hashnode publication exists and is accessible&lt;/li&gt;
&lt;li&gt;[ ] Dev.to account has API access enabled&lt;/li&gt;
&lt;li&gt;[ ] GitHub token has correct repository permissions&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🔍 &lt;strong&gt;How to Read Logs&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Go to Actions tab&lt;/strong&gt; in your repository&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Click the failed workflow run&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Click the failed job&lt;/strong&gt; (e.g., "publish-hashnode")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expand each step&lt;/strong&gt; to see detailed output&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Look for red ❌ errors&lt;/strong&gt; and yellow ⚠️ warnings&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  📞 &lt;strong&gt;Getting Help&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you're still stuck:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check existing issues&lt;/strong&gt;: &lt;a href="https://github.com/gokulnathan66/article-automation/issues" rel="noopener noreferrer"&gt;Article Automation Issues&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create new issue&lt;/strong&gt; with:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Error message&lt;/strong&gt; (from Actions logs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow file&lt;/strong&gt; content&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Steps to reproduce&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform&lt;/strong&gt; (Hashnode/Dev.to/both)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro tip&lt;/strong&gt;: Enable debug logging by adding &lt;code&gt;ACTIONS_STEP_DEBUG: true&lt;/code&gt; to your repository secrets for more detailed logs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  📈 Expected Results
&lt;/h2&gt;

&lt;p&gt;After successful execution:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hashnode&lt;/strong&gt;: Article published/updated at your publication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dev.to&lt;/strong&gt;: Article published/updated on your Dev.to profile&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repository Variables&lt;/strong&gt;: Post metadata saved for future updates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Images&lt;/strong&gt;: All relative paths converted to accessible GitHub URLs&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🎯 Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎓 &lt;strong&gt;Learning &amp;amp; Education&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Understand automation workflows&lt;/strong&gt;: Study GitHub Actions implementation&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Learn API integration&lt;/strong&gt;: See real examples of Hashnode and Dev.to APIs&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Study best practices&lt;/strong&gt;: Discover proper secret management and error handling&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Explore CI/CD concepts&lt;/strong&gt;: Understand continuous publishing workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧪 &lt;strong&gt;Testing &amp;amp; Validation&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Verify setup&lt;/strong&gt;: Test configuration before production use&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Debug issues&lt;/strong&gt;: Troubleshoot problems in isolated environment&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Validate content&lt;/strong&gt;: Ensure articles render correctly on both platforms&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Performance testing&lt;/strong&gt;: Check automation speed and reliability&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 &lt;strong&gt;Production Use&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Multi-platform publishing&lt;/strong&gt;: Automatically publish to Hashnode and Dev.to&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Content synchronization&lt;/strong&gt;: Keep articles updated across platforms&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Workflow automation&lt;/strong&gt;: Reduce manual publishing effort&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Brand consistency&lt;/strong&gt;: Maintain uniform content across platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔧 &lt;strong&gt;Development &amp;amp; Customization&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Fork and customize&lt;/strong&gt;: Create your own publishing automation&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Add new platforms&lt;/strong&gt;: Extend to support additional blogging platforms&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Integrate with CMS&lt;/strong&gt;: Connect with headless CMS or blog generators&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Advanced workflows&lt;/strong&gt;: Build complex publishing pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📊 &lt;strong&gt;Version Compatibility&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Minimum Version&lt;/th&gt;
&lt;th&gt;Recommended&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Actions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;actions/checkout@v3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;actions/checkout@v4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Latest stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Node.js&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;16.x&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;20.x&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LTS versions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Article Automation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@main&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@main&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Always use latest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hashnode API&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GraphQL v1&lt;/td&gt;
&lt;td&gt;GraphQL v1&lt;/td&gt;
&lt;td&gt;Stable API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dev.to API&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;REST API v1&lt;/td&gt;
&lt;td&gt;REST API v1&lt;/td&gt;
&lt;td&gt;No versioning&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  🔄 &lt;strong&gt;Update Strategy&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Recommended: Pin to specific versions for stability&lt;/span&gt;
&lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gokulnathan66/article-automation/hashnode-publish@v1.2.0&lt;/span&gt;

&lt;span class="c1"&gt;# Alternative: Use latest (auto-updates, but may break)&lt;/span&gt;
&lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gokulnathan66/article-automation/hashnode-publish@main&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Important&lt;/strong&gt;: For production use, pin to specific versions to avoid breaking changes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🔗 Related Links
&lt;/h2&gt;

&lt;h3&gt;
  
  
  📚 &lt;strong&gt;Documentation&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🏠 &lt;strong&gt;Main Repository&lt;/strong&gt;: &lt;a href="https://github.com/gokulnathan66/article-automation" rel="noopener noreferrer"&gt;article-automation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;GitHub Actions&lt;/strong&gt;: &lt;a href="https://docs.github.com/en/actions" rel="noopener noreferrer"&gt;GitHub Actions Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;strong&gt;Workflow Syntax&lt;/strong&gt;: &lt;a href="https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions" rel="noopener noreferrer"&gt;GitHub Workflow Syntax&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🌐 &lt;strong&gt;Platform APIs&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;📚 &lt;strong&gt;Hashnode GraphQL&lt;/strong&gt;: &lt;a href="https://api.hashnode.com/" rel="noopener noreferrer"&gt;Hashnode API Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;Dev.to REST API&lt;/strong&gt;: &lt;a href="https://developers.forem.com/api" rel="noopener noreferrer"&gt;Dev.to API Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔑 &lt;strong&gt;GitHub API&lt;/strong&gt;: &lt;a href="https://docs.github.com/en/rest" rel="noopener noreferrer"&gt;GitHub REST API&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛠️ &lt;strong&gt;Platform Setup&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;strong&gt;Create Hashnode Blog&lt;/strong&gt;: &lt;a href="https://hashnode.com" rel="noopener noreferrer"&gt;hashnode.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;Join Dev.to&lt;/strong&gt;: &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔐 &lt;strong&gt;GitHub Tokens&lt;/strong&gt;: &lt;a href="https://github.com/settings/tokens" rel="noopener noreferrer"&gt;Personal Access Tokens&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎓 &lt;strong&gt;Learning Resources&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;📖 &lt;strong&gt;Markdown Guide&lt;/strong&gt;: &lt;a href="https://www.markdownguide.org/" rel="noopener noreferrer"&gt;markdownguide.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🚀 &lt;strong&gt;GitHub Actions Tutorial&lt;/strong&gt;: &lt;a href="https://lab.github.com/" rel="noopener noreferrer"&gt;GitHub Learning Lab&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;YAML Syntax&lt;/strong&gt;: &lt;a href="https://yaml.org/spec/1.2/spec.html" rel="noopener noreferrer"&gt;YAML.org&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚡ &lt;strong&gt;Technical Specifications&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Specification&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Supported Formats&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Markdown (.md)&lt;/td&gt;
&lt;td&gt;CommonMark compliant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Image Formats&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PNG, JPG, GIF, WebP&lt;/td&gt;
&lt;td&gt;Auto-converted to GitHub raw URLs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Content Length&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Up to 64KB&lt;/td&gt;
&lt;td&gt;Combined limit for both platforms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Execution Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~2-5 minutes&lt;/td&gt;
&lt;td&gt;Depends on content size and platform response&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rate Limits&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Platform dependent&lt;/td&gt;
&lt;td&gt;See Platform Limits
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Concurrent Jobs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2 (Hashnode + Dev.to)&lt;/td&gt;
&lt;td&gt;Runs in parallel for faster publishing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  🤝 Contributing
&lt;/h2&gt;

&lt;p&gt;We welcome contributions to improve this test repository! Here's how you can help:&lt;/p&gt;

&lt;h3&gt;
  
  
  🐛 Found a Bug?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Check if it's already reported in &lt;a href="https://github.com/gokulnathan66/article-automation/issues" rel="noopener noreferrer"&gt;Issues&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create a detailed bug report with steps to reproduce&lt;/li&gt;
&lt;li&gt;Include relevant logs from the Actions tab&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  💡 Have an Improvement?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Fork this repository&lt;/li&gt;
&lt;li&gt;Create a feature branch: &lt;code&gt;git checkout -b feature/amazing-feature&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Make your changes and test thoroughly&lt;/li&gt;
&lt;li&gt;Submit a pull request with a clear description&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  📝 Improve Documentation?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fix typos or unclear instructions&lt;/li&gt;
&lt;li&gt;Add examples or clarifications&lt;/li&gt;
&lt;li&gt;Translate content to other languages&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧪 Share Testing Results
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Test with different content types&lt;/li&gt;
&lt;li&gt;Report platform-specific behaviors&lt;/li&gt;
&lt;li&gt;Share performance insights&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: For issues with the core automation actions, please use the &lt;a href="https://github.com/gokulnathan66/article-automation" rel="noopener noreferrer"&gt;main repository&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  📄 License
&lt;/h2&gt;

&lt;p&gt;This project is licensed under the &lt;strong&gt;MIT License&lt;/strong&gt; - see the &lt;a href="https://dev.toLICENSE"&gt;LICENSE&lt;/a&gt; file for details.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MIT License

Copyright (c) 2024 Article Automation Test

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🙏 Acknowledgments
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Thanks to &lt;a href="https://github.com/gokulnathan66" rel="noopener noreferrer"&gt;@gokulnathan66&lt;/a&gt; for creating the automation system&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hashnode.com" rel="noopener noreferrer"&gt;Hashnode&lt;/a&gt; and &lt;a href="https://dev.to"&gt;Dev.to&lt;/a&gt; for their excellent APIs&lt;/li&gt;
&lt;li&gt;The GitHub Actions community for inspiration and best practices&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;This is a test repository for the article automation system. For the actual actions, see &lt;a href="https://github.com/gokulnathan66/article-automation" rel="noopener noreferrer"&gt;article-automation&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Multi-Platform Blog Publisher</title>
      <dc:creator>Gokul Nathan</dc:creator>
      <pubDate>Sun, 10 Aug 2025 05:35:04 +0000</pubDate>
      <link>https://dev.to/gokulnathan66/article-automation-for-success-test-post-hashcode-test-update-h1a</link>
      <guid>https://dev.to/gokulnathan66/article-automation-for-success-test-post-hashcode-test-update-h1a</guid>
      <description>&lt;h1&gt;
  
  
  Multi-Platform Blog Publisher
&lt;/h1&gt;




&lt;blockquote&gt;
&lt;p&gt;🚀 &lt;strong&gt;Automatically publish your articles to multiple blogging platforms using GitHub Actions&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Overview&lt;/li&gt;
&lt;li&gt;Features&lt;/li&gt;
&lt;li&gt;Quick Start&lt;/li&gt;
&lt;li&gt;Repository Structure&lt;/li&gt;
&lt;li&gt;Installation&lt;/li&gt;
&lt;li&gt;Usage&lt;/li&gt;
&lt;li&gt;Configuration&lt;/li&gt;
&lt;li&gt;Content Format&lt;/li&gt;
&lt;li&gt;Setup Instructions&lt;/li&gt;
&lt;li&gt;Usage Examples&lt;/li&gt;
&lt;li&gt;Troubleshooting&lt;/li&gt;
&lt;li&gt;Contributing&lt;/li&gt;
&lt;li&gt;License&lt;/li&gt;
&lt;li&gt;Acknowledgments&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;This project automates the process of synchronizing content between GitHub README files and various blogging platforms. Eliminate manual copy-pasting and separate content maintenance—write once in Markdown and publish everywhere!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub README → Blog Post Automation&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Supported Platforms
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;&lt;a href="https://hashnode.com" rel="noopener noreferrer"&gt;Hashnode&lt;/a&gt;&lt;/strong&gt; - Fully integrated&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;&lt;a href="https://dev.to"&gt;Dev.to&lt;/a&gt;&lt;/strong&gt; - Fully integrated
&lt;/li&gt;
&lt;li&gt;🚧 &lt;strong&gt;Medium&lt;/strong&gt; - API restrictions prevent automation&lt;/li&gt;
&lt;li&gt;🚧 &lt;strong&gt;LinkedIn&lt;/strong&gt; - OAuth limitations prevent API usage&lt;/li&gt;
&lt;/ul&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;⚡ Zero Setup&lt;/strong&gt;: No need to create API scripts—everything is included&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🌐 Multi-Platform&lt;/strong&gt;: Supports Hashnode and Dev.to&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🧠 Smart Updates&lt;/strong&gt;: Automatically tracks and updates existing posts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🖼️ Image Processing&lt;/strong&gt;: Converts relative image paths to GitHub raw URLs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📝 Flexible Content&lt;/strong&gt;: Works with any markdown content structure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔒 Secure&lt;/strong&gt;: All credentials stay in your repository secrets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;♻️ State Management&lt;/strong&gt;: Saves post metadata for future updates&lt;/li&gt;
&lt;/ul&gt;




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

&lt;h3&gt;
  
  
  1. Fork or Use This Repository
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/gokulnathan66/article-automation" rel="noopener noreferrer"&gt;gokulnathan66 article-automation Repo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can either fork this repository or use it as a GitHub Action in your own repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Set Up Your Content Repository
&lt;/h3&gt;

&lt;p&gt;Create a repository structure like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;your-blog-repo/
├── content/                 # Your articles directory
│   └── README.md           # Your article content
├── .github/workflows/
│   └── publish.yml         # Workflow using these actions
├── images/                 # Optional: images referenced in articles
│   └── screenshot.png
└── README.md              # Project documentation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Configure GitHub Secrets
&lt;/h3&gt;

&lt;p&gt;Go to &lt;strong&gt;Settings → Secrets and variables → Actions&lt;/strong&gt; and add the required secrets.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Create Workflow File
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;.github/workflows/publish.yml&lt;/code&gt; with the provided configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Push and Publish! 🎉
&lt;/h3&gt;

&lt;p&gt;Your articles will be automatically published when you push to the main branch.&lt;/p&gt;




&lt;h2&gt;
  
  
  Repository Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;article-automation/
├── hashnode-publish/
│   ├── action.yml          # Hashnode action definition
│   └── scripts/
│       └── hashnode.js     # Hashnode publishing script
├── devto-publish/
│   ├── action.yml          # Dev.to action definition
│   └── scripts/
│       └── devto_post.js   # Dev.to publishing script
├── api/                    # Legacy API scripts
│   ├── hashnode.js
│   └── devto_post.js
├── package.json            # Dependencies for scripts
├── image.png              # Project logo
└── README.md              # This file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Method 1: Use as GitHub Action (Recommended)
&lt;/h3&gt;

&lt;p&gt;Add this to your workflow file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Publish to Hashnode&lt;/span&gt;
  &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gokulnathan66/article-automation/hashnode-publish@main&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;hashnode-pat&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.HASHNODE_PAT }}&lt;/span&gt;
    &lt;span class="c1"&gt;# ... other configuration&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Method 2: Fork and Customize
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Fork this repository&lt;/li&gt;
&lt;li&gt;Customize the scripts in &lt;code&gt;hashnode-publish/scripts/&lt;/code&gt; or &lt;code&gt;devto-publish/scripts/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Update action configurations in &lt;code&gt;action.yml&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;Use your forked version in workflows&lt;/li&gt;
&lt;/ol&gt;




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

&lt;h3&gt;
  
  
  GitHub Secrets Configuration
&lt;/h3&gt;

&lt;h4&gt;
  
  
  For Hashnode:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;HASHNODE_PAT&lt;/code&gt; - Your Hashnode Personal Access Token&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;HASHNODE_PUBLICATION_ID&lt;/code&gt; - Your publication ID&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;HASHNODE_PUBLICATION_HOST&lt;/code&gt; - Your publication domain (e.g., &lt;code&gt;yourblog.hashnode.dev&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;VAR_EDIT_TOKEN_GIT&lt;/code&gt; - GitHub token with &lt;code&gt;repo&lt;/code&gt; and &lt;code&gt;actions:write&lt;/code&gt; permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  For Dev.to:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;DEV_TO_API_KEY&lt;/code&gt; - Your Dev.to API Key&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;VAR_EDIT_TOKEN_GIT&lt;/code&gt; - GitHub token with &lt;code&gt;repo&lt;/code&gt; and &lt;code&gt;actions:write&lt;/code&gt; permissions&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Create &lt;code&gt;.github/workflows/publish.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Multi-Platform Publishing&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content/**'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;README.md'&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;NODE_VERSION&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;20'&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;publish-hashnode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.event_name == 'push' || github.event_name == 'workflow_dispatch'&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout content&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;fetch-depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Validate required secrets&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;if [ -z "${{ secrets.HASHNODE_PAT }}" ]; then&lt;/span&gt;
            &lt;span class="s"&gt;echo "Error: HASHNODE_PAT secret is not set"&lt;/span&gt;
            &lt;span class="s"&gt;exit 1&lt;/span&gt;
          &lt;span class="s"&gt;fi&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Publish to Hashnode&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gokulnathan66/article-automation/hashnode-publish@main&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;hashnode-pat&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.HASHNODE_PAT }}&lt;/span&gt;
          &lt;span class="na"&gt;hashnode-publication-id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.HASHNODE_PUBLICATION_ID }}&lt;/span&gt;
          &lt;span class="na"&gt;hashnode-publication-host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.HASHNODE_PUBLICATION_HOST }}&lt;/span&gt;
          &lt;span class="na"&gt;github-token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.VAR_EDIT_TOKEN_GIT }}&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.HASHNODE_SAVED_POST_ID }}&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-slug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.HASHNODE_SAVED_POST_SLUG }}&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.HASHNODE_SAVED_POST_TITLE }}&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.HASHNODE_SAVED_POST_URL }}&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-published-at&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.HASHNODE_SAVED_POST_PUBLISHED_AT }}&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-updated-at&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.HASHNODE_SAVED_POST_UPDATED_AT }}&lt;/span&gt;

  &lt;span class="na"&gt;publish-devto&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.event_name == 'push' || github.event_name == 'workflow_dispatch'&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout content&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;fetch-depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Validate required secrets&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;if [ -z "${{ secrets.DEV_TO_API_KEY }}" ]; then&lt;/span&gt;
            &lt;span class="s"&gt;echo "Error: DEV_TO_API_KEY secret is not set"&lt;/span&gt;
            &lt;span class="s"&gt;exit 1&lt;/span&gt;
          &lt;span class="s"&gt;fi&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Publish to Dev.to&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gokulnathan66/article-automation/devto-publish@main&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;devto-api-key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.DEV_TO_API_KEY }}&lt;/span&gt;
          &lt;span class="na"&gt;github-token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.VAR_EDIT_TOKEN_GIT }}&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.DEV_TO_SAVED_POST_ID }}&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.DEV_TO_SAVED_POST_TITLE }}&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.DEV_TO_SAVED_POST_URL }}&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-published-at&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.DEV_TO_SAVED_POST_PUBLISHED_AT }}&lt;/span&gt;
          &lt;span class="na"&gt;saved-post-updated-at&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.DEV_TO_SAVED_POST_UPDATED_AT }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Configuration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Hashnode Action Inputs
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hashnode-pat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Hashnode Personal Access Token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hashnode-publication-id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Publication ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hashnode-publication-host&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Publication host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;github-token&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;GitHub token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;content-path&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;&lt;code&gt;'content'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Path to content files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;node-version&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;&lt;code&gt;'20'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Node.js version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;saved-post-*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Previously saved post data for updates&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Dev.to Action Inputs
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;devto-api-key&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Dev.to API Key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;github-token&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;GitHub token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;content-path&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;&lt;code&gt;'content'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Path to content files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;node-version&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;&lt;code&gt;'24'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Node.js version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;saved-post-*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Previously saved post data for updates&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Content Format
&lt;/h2&gt;

&lt;p&gt;Your markdown files should follow this structure:&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="gh"&gt;# Your Article Title&lt;/span&gt;

Your content here with markdown formatting.

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

You can include images, code blocks, and other markdown elements.

&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Screenshot&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://raw.githubusercontent.com/gokulnathan66/article-automation/main/images/screenshot.png&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="gu"&gt;### Code Examples&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
javascript&lt;br&gt;
// Example: Basic error handling in Node.js&lt;br&gt;
try {&lt;br&gt;
  const result = processData();&lt;br&gt;
  console.log("Processing successful:", result);&lt;br&gt;
} catch (error) {&lt;br&gt;
  console.error("Error occurred:", error.message);&lt;br&gt;
  process.exit(1);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;function processData() {&lt;br&gt;
  // Your processing logic here&lt;br&gt;
  return "Hello, World!";&lt;br&gt;
}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&amp;lt;!-- Add tags at the end (optional) --&amp;gt;
Tags: javascript, tutorial, webdev, githubactions 
Tag "github-actions" contains non-alphanumeric or prohibited unicode characters
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: Tags should be added at the end of your content using the format &lt;code&gt;Tags: tag1, tag2, tag3&lt;/code&gt;. Avoid non-alphanumeric characters in tags.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Setup Instructions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Getting Hashnode Credentials
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Personal Access Token
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://hashnode.com" rel="noopener noreferrer"&gt;Hashnode&lt;/a&gt; → &lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;Developer&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Generate &lt;strong&gt;Personal Access Token&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Add as &lt;code&gt;HASHNODE_PAT&lt;/code&gt; secret in your repository&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  2. Publication Details
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Go to your publication dashboard&lt;/li&gt;
&lt;li&gt;Copy &lt;strong&gt;Publication ID&lt;/strong&gt; from the URL or settings&lt;/li&gt;
&lt;li&gt;Use your publication domain (e.g., &lt;code&gt;yourblog.hashnode.dev&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Getting Dev.to API Key
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://dev.to"&gt;Dev.to&lt;/a&gt; → &lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;Extensions&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Scroll to &lt;strong&gt;"DEV Community API Keys"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Generate a new API key&lt;/li&gt;
&lt;li&gt;Add as &lt;code&gt;DEV_TO_API_KEY&lt;/code&gt; secret in your repository&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Setting up GitHub Token
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;GitHub&lt;/strong&gt; → &lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;Developer settings&lt;/strong&gt; → &lt;strong&gt;Personal access tokens&lt;/strong&gt; → &lt;strong&gt;Tokens (classic)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Generate new token"&lt;/strong&gt; → &lt;strong&gt;"Generate new token (classic)"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Configure the token:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Note&lt;/strong&gt;: &lt;code&gt;Article Automation Token&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expiration&lt;/strong&gt;: Choose appropriate duration (30-90 days recommended)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scopes&lt;/strong&gt;: Select the following:

&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;repo&lt;/code&gt; (full repository access)&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;workflow&lt;/code&gt; (update GitHub Action workflows)&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;write:packages&lt;/code&gt; (if using packages)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Generate token"&lt;/strong&gt; and copy the token immediately&lt;/li&gt;
&lt;li&gt;Add as &lt;code&gt;VAR_EDIT_TOKEN_GIT&lt;/code&gt; secret in your repository&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Security Note&lt;/strong&gt;: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set an expiration date for your GitHub token for better security&lt;/li&gt;
&lt;li&gt;GitHub will notify you before the token expires&lt;/li&gt;
&lt;li&gt;Store the token securely—you won't be able to see it again&lt;/li&gt;
&lt;li&gt;Regenerate tokens periodically as a security best practice&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Local Development Setup
&lt;/h3&gt;

&lt;p&gt;For testing locally, create a &lt;code&gt;.env&lt;/code&gt; file in your project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Required for Hashnode
HASHNODE_PAT=your_hashnode_personal_access_token
HASHNODE_PUBLICATION_ID=your_publication_id
HASHNODE_PUBLICATION_HOST=yourblog.hashnode.dev

# Required for Dev.to
DEV_TO_API_KEY=your_devto_api_key

# Required for GitHub operations
VAR_EDIT_TOKEN_GIT=your_github_token

# Optional: Content path (defaults to 'content')
CONTENT_PATH=content
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Important&lt;/strong&gt;: Never commit your &lt;code&gt;.env&lt;/code&gt; file to version control. Add it to your &lt;code&gt;.gitignore&lt;/code&gt; file.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Usage Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Single Platform Deployment
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Hashnode only:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gokulnathan66/article-automation/hashnode-publish@main&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Dev.to only:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gokulnathan66/article-automation/devto-publish@main&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Custom Content Path
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gokulnathan66/article-automation/hashnode-publish@main&lt;/span&gt;
&lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# ... other inputs&lt;/span&gt;
  &lt;span class="na"&gt;content-path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;articles'&lt;/span&gt;  &lt;span class="c1"&gt;# Look in 'articles' directory instead&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Different Node.js Version
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gokulnathan66/article-automation/devto-publish@main&lt;/span&gt;
&lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# ... other inputs&lt;/span&gt;
  &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;18'&lt;/span&gt;  &lt;span class="c1"&gt;# Use Node.js 18 instead of default 24&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Content Detection&lt;/strong&gt;: Finds &lt;code&gt;README.md&lt;/code&gt; in your content directory or repository root&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Title Extraction&lt;/strong&gt;: Uses the first &lt;code&gt;# heading&lt;/code&gt; as the article title&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image Processing&lt;/strong&gt;: Converts relative image paths to GitHub raw URLs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tag Processing&lt;/strong&gt;: Extracts tags from &lt;code&gt;Tags:&lt;/code&gt; line at the end of content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart Publishing&lt;/strong&gt;: 

&lt;ul&gt;
&lt;li&gt;Checks for existing posts with the same title&lt;/li&gt;
&lt;li&gt;Creates new post if none exists&lt;/li&gt;
&lt;li&gt;Updates existing post if found&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State Management&lt;/strong&gt;: Saves post IDs and metadata to repository variables for future updates&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Common Issues
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;th&gt;Additional Steps&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Action not found&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ensure repository is public or you have proper access&lt;/td&gt;
&lt;td&gt;Check the action reference path is correct&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;README not found&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Check content directory path and verify file exists&lt;/td&gt;
&lt;td&gt;Verify &lt;code&gt;content-path&lt;/code&gt; input matches your structure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API errors&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Verify all secrets are correctly configured&lt;/td&gt;
&lt;td&gt;Test API keys manually with curl commands&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Permission errors&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ensure GitHub token has required scopes&lt;/td&gt;
&lt;td&gt;Regenerate token with proper permissions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Image not loading&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Check image paths and ensure they're accessible&lt;/td&gt;
&lt;td&gt;Use absolute URLs or verify relative paths&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tags not working&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Check tag format and characters&lt;/td&gt;
&lt;td&gt;Use only alphanumeric characters and hyphens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Content not updating&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clear browser cache and check post URLs&lt;/td&gt;
&lt;td&gt;Verify the post ID variables are updated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Debugging Steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check Action Logs&lt;/strong&gt;: Go to the &lt;strong&gt;Actions&lt;/strong&gt; tab in your repository for detailed execution logs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify Secrets&lt;/strong&gt;: Ensure all required secrets are set in repository settings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test API Keys&lt;/strong&gt;:
&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;# Test Hashnode API&lt;/span&gt;
   curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_TOKEN"&lt;/span&gt; https://gql.hashnode.com

   &lt;span class="c"&gt;# Test Dev.to API  &lt;/span&gt;
   curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"api-key: YOUR_API_KEY"&lt;/span&gt; https://dev.to/api/articles/me
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check File Paths&lt;/strong&gt;: Verify your content structure matches the expected format&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review Variables&lt;/strong&gt;: Check repository variables for saved post metadata&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Error Messages and Solutions
&lt;/h3&gt;

&lt;h4&gt;
  
  
  "Post not found" or "Failed to update"
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cause&lt;/strong&gt;: Post metadata variables are incorrect or outdated&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Delete the post variables from repository settings and republish&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  "Invalid API key" or "Unauthorized"
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cause&lt;/strong&gt;: API keys are expired or incorrect&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Regenerate API keys and update repository secrets&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  "File not found" errors
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cause&lt;/strong&gt;: Content path configuration doesn't match your repository structure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Update the &lt;code&gt;content-path&lt;/code&gt; input in your workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  "Image upload failed"
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cause&lt;/strong&gt;: Images are not accessible or paths are incorrect&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Use GitHub raw URLs or verify image accessibility&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Important Warnings
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Content Overwriting&lt;/strong&gt;: When you update something in your blog manually, it will be overwritten by this action. You must update the README, and that will automatically update the blog.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ℹ️ Local Testing&lt;/strong&gt;: If you want to test locally, create a &lt;code&gt;.env&lt;/code&gt; file with the required variables.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Frequently Asked Questions
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Q: Can I publish to multiple platforms simultaneously?
&lt;/h4&gt;

&lt;p&gt;A: Yes, the workflow supports parallel publishing to both Hashnode and Dev.to. Each platform runs in a separate job.&lt;/p&gt;

&lt;h4&gt;
  
  
  Q: How do I handle images in my articles?
&lt;/h4&gt;

&lt;p&gt;A: Use relative paths in your markdown (e.g., &lt;code&gt;![Alt text](https://raw.githubusercontent.com/gokulnathan66/article-automation/main/images/photo.jpg)&lt;/code&gt;). The action automatically converts them to GitHub raw URLs.&lt;/p&gt;

&lt;h4&gt;
  
  
  Q: Can I schedule automatic publishing?
&lt;/h4&gt;

&lt;p&gt;A: Yes, add a &lt;code&gt;schedule&lt;/code&gt; trigger to your workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;9&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1'&lt;/span&gt;  &lt;span class="c1"&gt;# Every Monday at 9 AM UTC&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Q: What happens if my API key expires?
&lt;/h4&gt;

&lt;p&gt;A: The action will fail with an authentication error. Update your repository secrets with a new API key.&lt;/p&gt;

&lt;h4&gt;
  
  
  Q: Can I customize the publication process?
&lt;/h4&gt;

&lt;p&gt;A: Yes, fork the repository and modify the scripts in the &lt;code&gt;hashnode-publish/scripts/&lt;/code&gt; or &lt;code&gt;devto-publish/scripts/&lt;/code&gt; directories.&lt;/p&gt;

&lt;h4&gt;
  
  
  Q: How do I prevent certain files from triggering publication?
&lt;/h4&gt;

&lt;p&gt;A: Use the &lt;code&gt;paths&lt;/code&gt; filter in your workflow to specify which files should trigger the action.&lt;/p&gt;




&lt;h2&gt;
  
  
  Contributing
&lt;/h2&gt;

&lt;p&gt;We welcome contributions! Here's how you can help:&lt;/p&gt;

&lt;h3&gt;
  
  
  Development Setup
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Fork the repository&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clone your fork&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   git clone https://github.com/yourusername/article-automation.git
   &lt;span class="nb"&gt;cd &lt;/span&gt;article-automation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install dependencies&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a feature branch&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feature/amazing-feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Make your changes&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test your changes&lt;/strong&gt; (add tests if applicable)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commit your changes&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s1"&gt;'Add some amazing feature'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Push to the branch&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   git push origin feature/amazing-feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Open a Pull Request&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Contribution Guidelines
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Code Standards
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Follow existing code style and conventions&lt;/li&gt;
&lt;li&gt;Use meaningful variable and function names&lt;/li&gt;
&lt;li&gt;Add comprehensive comments for complex logic&lt;/li&gt;
&lt;li&gt;Ensure compatibility with Node.js 18+ and 20+&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Pull Request Process
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create Feature Branch&lt;/strong&gt;: Use descriptive names (e.g., &lt;code&gt;feature/add-medium-support&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write Tests&lt;/strong&gt;: Add unit tests for new functionality&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update Documentation&lt;/strong&gt;: Keep README and inline docs current&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test Thoroughly&lt;/strong&gt;: Ensure all tests pass and no regressions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write Clear Commits&lt;/strong&gt;: Use conventional commit format
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   feat: add support for Medium platform
   fix: resolve image upload timeout issue
   docs: update API configuration examples
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Testing Your Changes
&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;# Install dependencies&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Run tests (if available)&lt;/span&gt;
npm &lt;span class="nb"&gt;test&lt;/span&gt;

&lt;span class="c"&gt;# Test locally with sample content&lt;/span&gt;
node scripts/test-local.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Areas for Contribution
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;🆕 New platform integrations (Medium, LinkedIn, etc.)&lt;/li&gt;
&lt;li&gt;🔧 Improved error handling and retry logic&lt;/li&gt;
&lt;li&gt;📚 Better documentation and examples&lt;/li&gt;
&lt;li&gt;🧪 Comprehensive test coverage&lt;/li&gt;
&lt;li&gt;🎨 UI improvements for logs and outputs&lt;/li&gt;
&lt;li&gt;🔍 Advanced content processing features&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Reporting Issues
&lt;/h3&gt;

&lt;p&gt;When reporting issues, please include:&lt;/p&gt;

&lt;h4&gt;
  
  
  Required Information
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Environment&lt;/strong&gt;: OS, Node.js version, Action version&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configuration&lt;/strong&gt;: Sanitized workflow file (remove secrets)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Details&lt;/strong&gt;: Complete error messages and stack traces&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Steps to Reproduce&lt;/strong&gt;: Detailed reproduction steps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expected vs Actual&lt;/strong&gt;: What should happen vs what does happen&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Issue Templates
&lt;/h4&gt;

&lt;p&gt;Use the appropriate issue template:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🐛 &lt;strong&gt;Bug Report&lt;/strong&gt;: For unexpected behavior or errors&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Feature Request&lt;/strong&gt;: For new functionality suggestions
&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Documentation&lt;/strong&gt;: For documentation improvements&lt;/li&gt;
&lt;li&gt;❓ &lt;strong&gt;Question&lt;/strong&gt;: For usage questions and support&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Example Issue Report
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gs"&gt;**Bug Description**&lt;/span&gt;: Action fails when publishing large images

&lt;span class="gs"&gt;**Environment**&lt;/span&gt;:
&lt;span class="p"&gt;-&lt;/span&gt; OS: Ubuntu 22.04
&lt;span class="p"&gt;-&lt;/span&gt; Node.js: 20.x
&lt;span class="p"&gt;-&lt;/span&gt; Action Version: @main

&lt;span class="gs"&gt;**Steps to Reproduce**&lt;/span&gt;:
&lt;span class="p"&gt;1.&lt;/span&gt; Add image larger than 5MB to content
&lt;span class="p"&gt;2.&lt;/span&gt; Push to main branch
&lt;span class="p"&gt;3.&lt;/span&gt; Action fails with timeout error

&lt;span class="gs"&gt;**Expected**&lt;/span&gt;: Image should be processed and uploaded
&lt;span class="gs"&gt;**Actual**&lt;/span&gt;: Action times out after 5 minutes

&lt;span class="gs"&gt;**Logs**&lt;/span&gt;: [Attach relevant action logs]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;This project is licensed under the &lt;strong&gt;MIT License&lt;/strong&gt; - see the &lt;a href="https://dev.toLICENSE"&gt;LICENSE&lt;/a&gt; file for details.&lt;/p&gt;

&lt;h3&gt;
  
  
  What this means:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Commercial use&lt;/li&gt;
&lt;li&gt;✅ Modification&lt;/li&gt;
&lt;li&gt;✅ Distribution&lt;/li&gt;
&lt;li&gt;✅ Private use&lt;/li&gt;
&lt;li&gt;❌ Liability&lt;/li&gt;
&lt;li&gt;❌ Warranty&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Acknowledgments
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Built with &lt;a href="https://github.com/features/actions" rel="noopener noreferrer"&gt;GitHub Actions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Integrates with &lt;a href="https://hashnode.com" rel="noopener noreferrer"&gt;Hashnode&lt;/a&gt; and &lt;a href="https://dev.to"&gt;Dev.to&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Inspired by the need for automated content distribution&lt;/li&gt;
&lt;li&gt;Thanks to all &lt;a href="https://github.com/gokulnathan66/article-automation/contributors" rel="noopener noreferrer"&gt;contributors&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Made with ❤️ by &lt;a href="https://github.com/gokulnathan66" rel="noopener noreferrer"&gt;Gokul Nathan B&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/gokulnathan66/article-automation/issues" rel="noopener noreferrer"&gt;Report Bug&lt;/a&gt; • &lt;a href="https://github.com/gokulnathan66/article-automation/issues" rel="noopener noreferrer"&gt;Request Feature&lt;/a&gt; • &lt;a href="https://github.com/gokulnathan66/article-automation" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>githubactions</category>
    </item>
  </channel>
</rss>
