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.xmland 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:
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:
# 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>&1Troubleshooting 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-parseroptions (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.
Comments and corrections