Publishing fresh technical articles, release notes, or engineering blog posts is only half the battle. Reaching software developers across Discord channels, Slack communities, Mastodon, X (formerly Twitter), and LinkedIn requires consistent content distribution. Manually copying links, titles, and excerpts every time a new article goes live quickly becomes a tedious chore.

Instead of relying on restrictive paid SaaS automation platforms with strict monthly action caps, developers can leverage free open-source tools or lightweight custom scripts that consume website RSS/Atom feeds and dispatch updates via webhooks.

Comparing Free and Open-Source Automation Solutions

Depending on your infrastructure preferences, multiple self-hosted tools and lightweight services can automate website update distribution:

  • n8n (Fair-code / Self-Hosted): A powerful visual workflow automation tool with native nodes for RSS triggers, Slack, Discord, Telegram, and REST API webhooks. Easily deployed via Docker.

  • Huginn (Open Source): An agent-based system for building automated web tasks, monitoring RSS feeds, and parsing HTML content.

  • Activepieces (Open Source): Modern TypeScript-based alternative to Zapier, offering modular integrations for webhooks and social networks.

  • Custom Node.js / Python Webhook Bot: Lightweight serverless or cron script that checks your website feed.xml and posts structured JSON payloads directly to destination webhooks.

Production Implementation: RSS to Discord and Slack Webhook Bot

Here is a standalone Node.js script using rss-parser and axios that monitors an RSS feed, persists sent article URLs in a local JSON state file, and posts new content to Discord or Slack webhooks:

rss-social-auto.jsjavascript
const fs = require('fs');
const path = require('path');
const Parser = require('rss-parser');
const axios = require('axios');
 
const parser = new Parser();
const RSS_URL = process.env.RSS_URL || 'https://lynxbee.com/feed.xml';
const DISCORD_WEBHOOK_URL = process.env.DISCORD_WEBHOOK_URL;
const STATE_FILE = path.join(__dirname, 'posted_history.json');
 
// Load previously published URLs to prevent duplicate posts
function loadPostedHistory() {
  if (fs.existsSync(STATE_FILE)) {
    return new Set(JSON.parse(fs.readFileSync(STATE_FILE, 'utf8')));
  }
  return new Set();
}
 
function savePostedHistory(historySet) {
  fs.writeFileSync(STATE_FILE, JSON.stringify(Array.from(historySet), null, 2));
}
 
async function checkAndPublishFeed() {
  try {
    console.log(`Fetching RSS feed from: ${RSS_URL}`);
    const feed = await parser.parseURL(RSS_URL);
    const history = loadPostedHistory();
    let newPostsCount = 0;
 
    for (const item of feed.items.reverse()) {
      if (!history.has(item.link)) {
        console.log(`New post detected: ${item.title}`);
 
        // Construct Rich Discord Embed Payload
        const embedPayload = {
          username: "Lynxbee Bot",
          avatar_url: "https://lynxbee.com/icon.png",
          embeds: [{
            title: item.title,
            url: item.link,
            description: item.contentSnippet || item.title,
            color: 3447003, // Hex #3498DB
            timestamp: new Date(item.pubDate).toISOString(),
            footer: { text: "Lynxbee Engineering Platform" }
          }]
        };
 
        if (DISCORD_WEBHOOK_URL) {
          await axios.post(DISCORD_WEBHOOK_URL, embedPayload);
          console.log(`Successfully posted '${item.title}' to Discord Webhook.`);
        }
 
        history.add(item.link);
        newPostsCount++;
      }
    }
 
    savePostedHistory(history);
    console.log(`Feed check finished. Total new updates published: ${newPostsCount}`);
  } catch (error) {
    console.error('Error executing feed check:', error.message);
  }
}
 
checkAndPublishFeed();

Deploying the Script with Crontab

To run this automation on your Linux server automatically every 15 minutes, configure a standard user crontab:

Terminal Workflowbash
# 1. Install dependencies
npm install rss-parser axios
 
# 2. Test execution manually with environment variables
RSS_URL="https://lynxbee.com/feed.xml" \
DISCORD_WEBHOOK_URL="https://discord.com/api/webhooks/12345/abcde" \
node rss-social-auto.js
 
# 3. Add to user crontab for continuous monitoring
crontab -e
 
# Crontab Entry (runs every 15 minutes):
*/15 * * * * RSS_URL="https://lynxbee.com/feed.xml" DISCORD_WEBHOOK_URL="https://discord.com/api/webhooks/12345/abcde" /usr/bin/node /home/ubuntu/rss-social-auto.js >> /var/log/rss-bot.log 2>&1

Troubleshooting Common Automation Gotchas

  • Duplicate Social Posts: Caused by state persistence failures. Ensure the process has write permissions to update posted_history.json.

  • `HTTP 403 Forbidden` When Fetching RSS: Some CDNs block default Node.js HTTP user agents. Set a custom User-Agent header in rss-parser options (requestOptions: { headers: { "User-Agent": "Lynxbee-Bot/1.0" } }).

  • Broken Embed Images: Ensure your website RSS feed contains <og:image> metadata or <enclosure url="..."> tags pointing to absolute HTTPS image URLs.