This workflow corresponds to n8n.io template #16666 — we link there as the canonical source.
This workflow follows the HTTP Request → LinkedIn recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "Mini Deep Thought \u2014 Autonomous AI Content Pipeline",
"nodes": [
{
"id": "ad012790-3798-430e-ac69-573c306a0c72",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-368,
-80
],
"parameters": {
"width": 480,
"height": 880,
"content": "## \ud83e\udde0 Mini Deep Thought \u2014 Autonomous AI Content Pipeline\n\nRuns on a daily schedule, reads an RSS feed, takes the **top 3** articles, and pushes each through a **multi-stage AI pipeline** (insight extraction \u2192 brand-voice synthesis), gates the result, then publishes to **LinkedIn, X and Bluesky**.\n\n### Setup\n- **Schedule** \u2014 set run time / timezone in the trigger.\n- **RSS** \u2014 set the feed URL and confirm fields map in `Set Article Attributes`.\n- **OpenAI** \u2014 add your credential to **both** OpenAI HTTP nodes (set once, reuse).\n- **LinkedIn / X** \u2014 connect OAuth2 credentials.\n- **Bluesky** \u2014 in `Login to Bluesky API` set your handle + an **app password** (never your main password).\n\n### \u26a0\ufe0f Test before going live\nThe publish nodes post for real. Disable them, run once, and inspect `Format Content`. Tune the AI system prompts until the voice sounds like you \u2014 then re-enable and activate.\n\n### Customize\nArticle limit, RSS source, prompts, voice, quality rules, and target platforms are all adjustable."
},
"typeVersion": 1
},
{
"id": "4323fbce-6989-47c6-83a7-6988fa13e39b",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
192,
160
],
"parameters": {
"color": 7,
"width": 848,
"height": 320,
"content": "## 1\ufe0f\u20e3 Collect source articles\n\nDaily schedule \u2192 read the RSS feed \u2192 keep the **top 3** items \u2192 normalize each into `title` / `content` / `link` for the AI stages.\n\n\ud83d\udc49 Change the feed URL in **Fetch RSS Feed**."
},
"typeVersion": 1
},
{
"id": "f9a698e2-9493-468c-9591-a824deabf47c",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1072,
144
],
"parameters": {
"color": 7,
"width": 640,
"height": 336,
"content": "## 2\ufe0f\u20e3 Generate AI content\n\n**Insights** extracts the 3 most non-obvious points from each article. **Synthesis** rewrites them in your editorial voice and returns ready-to-post JSON per platform.\n\n\ud83d\udc49 Edit the system prompts to match your voice \u2014 that's the product."
},
"typeVersion": 1
},
{
"id": "c3b6640c-10ba-47e8-af86-5e51d6ac8044",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1760,
48
],
"parameters": {
"color": 7,
"width": 240,
"height": 432,
"content": "## 3\ufe0f\u20e3 Validate & format\n\nParses the AI JSON, falls back gracefully on parse errors, and clamps each post to its platform character limit before distribution."
},
"typeVersion": 1
},
{
"id": "8f6d36eb-8e05-4f96-a8ec-8946927355c6",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
2032,
-80
],
"parameters": {
"color": 7,
"width": 416,
"height": 768,
"content": "## 4\ufe0f\u20e3 Publish across platforms\n\nFans out to **LinkedIn** and **X**, and logs in to **Bluesky** before posting.\n\n\u26a0\ufe0f These fire for real \u2014 keep them disabled until you've tested the output upstream."
},
"typeVersion": 1
},
{
"id": "node-trigger",
"name": "When 8 AM Every Day",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
240,
320
],
"parameters": {
"rule": {
"interval": [
{
"field": "days",
"daysInterval": 1,
"triggerAtHour": 8
}
]
}
},
"typeVersion": 1.2
},
{
"id": "node-rss",
"name": "Fetch RSS Feed",
"type": "n8n-nodes-base.rssFeedRead",
"position": [
460,
320
],
"parameters": {
"url": "https://hnrss.org/frontpage",
"options": {}
},
"typeVersion": 1.1
},
{
"id": "node-limit",
"name": "Limit to 3 Articles",
"type": "n8n-nodes-base.limit",
"position": [
680,
320
],
"parameters": {
"maxItems": 3
},
"typeVersion": 1
},
{
"id": "node-prepare",
"name": "Set Article Attributes",
"type": "n8n-nodes-base.set",
"position": [
900,
320
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "f1",
"name": "title",
"type": "string",
"value": "={{ $json.title }}"
},
{
"id": "f2",
"name": "content",
"type": "string",
"value": "={{ $json.contentSnippet || $json.content || $json.description || '' }}"
},
{
"id": "f3",
"name": "link",
"type": "string",
"value": "={{ $json.link }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "node-extract",
"name": "Post to OpenAI Insights",
"type": "n8n-nodes-base.httpRequest",
"position": [
1120,
320
],
"parameters": {
"url": "https://api.openai.com/v1/chat/completions",
"method": "POST",
"options": {},
"jsonBody": "={{ { model: 'gpt-4o-mini', temperature: 0.3, messages: [ { role: 'system', content: 'You are a sharp analyst. Extract the 3 most important, non-obvious insights from the article. No fluff, no restating the headline. Output as 3 short bullet points.' }, { role: 'user', content: 'TITLE: ' + $json.title + '\\n\\nCONTENT: ' + $json.content } ] } }}",
"sendBody": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "openAiApi"
},
"typeVersion": 4.2
},
{
"id": "node-carry",
"name": "Set Extracted Insights",
"type": "n8n-nodes-base.set",
"position": [
1340,
320
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "k1",
"name": "insights",
"type": "string",
"value": "={{ $json.choices[0].message.content }}"
},
{
"id": "k2",
"name": "title",
"type": "string",
"value": "={{ $('Set Article Attributes').item.json.title }}"
},
{
"id": "k3",
"name": "link",
"type": "string",
"value": "={{ $('Set Article Attributes').item.json.link }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "node-synth",
"name": "Post to OpenAI Synthesis",
"type": "n8n-nodes-base.httpRequest",
"position": [
1560,
320
],
"parameters": {
"url": "https://api.openai.com/v1/chat/completions",
"method": "POST",
"options": {},
"jsonBody": "={{ { model: 'gpt-4o-mini', temperature: 0.7, response_format: { type: 'json_object' }, messages: [ { role: 'system', content: 'You are the ghostwriter for a senior AI automation engineer with 25 years of experience. Voice: sharp, opinionated, practical, zero hype, no emoji spam. Turn the insights into original posts that add a clear point of view, not a summary. Return ONLY valid JSON with keys: linkedin (max 1200 chars, line breaks allowed), x (max 270 chars), bluesky (max 290 chars). Each post must stand alone and end naturally.' }, { role: 'user', content: 'TOPIC: ' + $json.title + '\\n\\nKEY INSIGHTS:\\n' + $json.insights + '\\n\\nSOURCE: ' + $json.link } ] } }}",
"sendBody": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "openAiApi"
},
"typeVersion": 4.2
},
{
"id": "node-gate",
"name": "Format Content",
"type": "n8n-nodes-base.code",
"position": [
1808,
320
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "const raw = $json.choices[0].message.content;\nlet parsed;\ntry { parsed = JSON.parse(raw); } catch (e) { parsed = { linkedin: raw, x: raw.slice(0, 270), bluesky: raw.slice(0, 290) }; }\nconst clamp = (s, n) => (s || '').toString().trim().slice(0, n);\nreturn {\n json: {\n linkedin: clamp(parsed.linkedin, 1200),\n x: clamp(parsed.x, 280),\n bluesky: clamp(parsed.bluesky, 300),\n source: $('Set Extracted Insights').item.json.link\n }\n};"
},
"typeVersion": 2
},
{
"id": "node-linkedin",
"name": "Publish on LinkedIn",
"type": "n8n-nodes-base.linkedIn",
"position": [
2080,
128
],
"parameters": {
"text": "={{ $json.linkedin }}",
"postAs": "person",
"additionalFields": {},
"shareMediaCategory": "NONE"
},
"typeVersion": 1
},
{
"id": "node-x",
"name": "Publish on Twitter",
"type": "n8n-nodes-base.twitter",
"position": [
2080,
320
],
"parameters": {
"text": "={{ $json.x }}",
"resource": "tweet",
"operation": "create",
"additionalFields": {}
},
"typeVersion": 2
},
{
"id": "node-bsky-login",
"name": "Login to Bluesky API",
"type": "n8n-nodes-base.httpRequest",
"position": [
2080,
528
],
"parameters": {
"url": "https://bsky.social/xrpc/com.atproto.server.createSession",
"method": "POST",
"options": {},
"jsonBody": "={{ { identifier: 'YOUR_HANDLE.bsky.social', password: 'YOUR_APP_PASSWORD' } }}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "node-bsky-post",
"name": "Publish on Bluesky",
"type": "n8n-nodes-base.httpRequest",
"position": [
2288,
528
],
"parameters": {
"url": "https://bsky.social/xrpc/com.atproto.repo.createRecord",
"method": "POST",
"options": {},
"jsonBody": "={{ { repo: $('Login to Bluesky API').item.json.did, collection: 'app.bsky.feed.post', record: { '$type': 'app.bsky.feed.post', text: $('Format Content').item.json.bluesky, createdAt: $now.toISO() } } }}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "=Bearer {{ $('Login to Bluesky API').item.json.accessJwt }}"
}
]
}
},
"typeVersion": 4.2
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"connections": {
"Fetch RSS Feed": {
"main": [
[
{
"node": "Limit to 3 Articles",
"type": "main",
"index": 0
}
]
]
},
"Format Content": {
"main": [
[
{
"node": "Publish on LinkedIn",
"type": "main",
"index": 0
},
{
"node": "Publish on Twitter",
"type": "main",
"index": 0
},
{
"node": "Login to Bluesky API",
"type": "main",
"index": 0
}
]
]
},
"Limit to 3 Articles": {
"main": [
[
{
"node": "Set Article Attributes",
"type": "main",
"index": 0
}
]
]
},
"When 8 AM Every Day": {
"main": [
[
{
"node": "Fetch RSS Feed",
"type": "main",
"index": 0
}
]
]
},
"Login to Bluesky API": {
"main": [
[
{
"node": "Publish on Bluesky",
"type": "main",
"index": 0
}
]
]
},
"Set Article Attributes": {
"main": [
[
{
"node": "Post to OpenAI Insights",
"type": "main",
"index": 0
}
]
]
},
"Set Extracted Insights": {
"main": [
[
{
"node": "Post to OpenAI Synthesis",
"type": "main",
"index": 0
}
]
]
},
"Post to OpenAI Insights": {
"main": [
[
{
"node": "Set Extracted Insights",
"type": "main",
"index": 0
}
]
]
},
"Post to OpenAI Synthesis": {
"main": [
[
{
"node": "Format Content",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow runs daily, reads the Hacker News frontpage RSS feed, uses OpenAI to extract key insights and ghostwrite social posts, then publishes the generated content to LinkedIn, X, and Bluesky. Runs every day at 08:00 using a schedule trigger. Fetches the latest items from…
Source: https://n8n.io/workflows/16666/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This n8n workflow is designed for content curators, digital marketers, and social media managers who want to automate the process of discovering, translating, and publishing news content from multiple
Social Media AI Agent - Telegram. Uses httpRequest, airtable, linkedIn, twitter. Scheduled trigger; 26 nodes.
Symcio · Daily Brand Valuation Broadcast. Uses httpRequest, linkedIn, twitter, facebookGraphApi. Scheduled trigger; 8 nodes.
Symcio · SDG1 Poverty Digest. Uses httpRequest, linkedIn, twitter. Scheduled trigger; 6 nodes.
Turn your blog into a set-and-forget content engine: every new article is instantly repurposed into channel-specific social posts with visuals, keeping your brand visible on LinkedIn, X, and Reddit wi