
Building a Multi-Channel Content Syndication Pipeline with EmDash Plugins
<p>I recently built a content syndication plugin for EmDash that automatically distributes blog posts to Dev.to, LinkedIn, Medium, Hacker News, and email newsletters from a single publish action. Here's how the architecture works and what I learned about multi-platform API orchestration.</p
Tony Nguyen Posted on May 25 • Originally published at ai-kit.net Building a Multi-Channel Content Syndication Pipeline with EmDash Plugins # architecture # webdev # devops I recently built a content syndication plugin for EmDash that automatically distributes blog posts to Dev.to, LinkedIn, Medium, Hacker News, and email newsletters from a single publish action. Here's how the architecture works and what I learned about multi-platform API orchestration. The Problem: Format Fragmentation and Timing Drift Manual cross-posting breaks down in practice because each platform expects different formats and has different constraints: Format fragmentation — HTML on your site, Markdown on Dev.to, rich text on LinkedIn, plain text for HN, HTML for email Timing drift — manual workflows slip by days or weeks, defeating the purpose of coordinated launches Metadata mismatch — canonical URLs, tags, and excerpts need to be correct per platform for SEO No centralized tracking — you can't measure which channel drives the most traffic without a unified analytics layer Architecture Overview The pipeline runs entirely on Cloudflare Workers via EmDash's plugin system with four components: Component Purpose Technology Publish Hook Trigger on post status change EmDash plugin middleware Format Renderer Convert to platform-specific formats Template engine + markdown-it Channel Adapter Platform-specific API client Fetch API + OAuth tokens Queue Manager Retry failed syndications D1 queue table Analytics Tracker Log syndication events D1 events table No external cron jobs or queue infrastructure needed — Workers' Queues (or KV with TTL) handles the orchestration. Step 1: The Publish Hook The plugin registers a middleware that fires on afterPostSave when status flips to 'published': // emdash-plugin-syndication/hooks.js export default { async afterPostSave ( post , context ) { if ( post . status === ' published ' && post . wasDraft ) { await context . env . SYNDICATION_QUEUE . put (
📰Originally published at dev.to
Staff Writer