{
  "id": "3eTIcbHUxRxSeWIrf6UCl",
  "name": "Write daily tech news with AI using RSS and WordPress",
  "tags": [],
  "nodes": [
    {
      "id": "85e28a2d-ff91-407c-9785-ec8dc9d53999",
      "name": "Daily 8AM Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        736,
        480
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 8
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "4c318cc4-2f48-4510-81d7-efa58416ab9e",
      "name": "RSS BBC Tech",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        1040,
        320
      ],
      "parameters": {
        "url": "https://feeds.bbci.co.uk/news/technology/rss.xml",
        "options": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "b0cc8dc1-1867-478e-bc5c-97112d6fdf58",
      "name": "RSS The Verge",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        1040,
        464
      ],
      "parameters": {
        "url": "https://www.theverge.com/rss/index.xml",
        "options": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "746d6b79-7348-439c-a790-9c10b86d8fa4",
      "name": "RSS Ars Technica",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        1040,
        624
      ],
      "parameters": {
        "url": "https://feeds.arstechnica.com/arstechnica/index",
        "options": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "148e1032-51de-4251-905b-2dfab02a9872",
      "name": "RSS TechCrunch",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        1040,
        784
      ],
      "parameters": {
        "url": "https://techcrunch.com/feed/",
        "options": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "5bc6bc47-a0d3-406a-9784-b106a4d41044",
      "name": "Merge All Feeds",
      "type": "n8n-nodes-base.merge",
      "position": [
        1328,
        480
      ],
      "parameters": {
        "numberInputs": 4
      },
      "typeVersion": 3
    },
    {
      "id": "bd7838fb-7542-4789-81d8-948871b46ce1",
      "name": "Normalize Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        1568,
        480
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "field-title",
              "name": "title",
              "type": "string",
              "value": "={{ $json.title }}"
            },
            {
              "id": "field-content",
              "name": "snippet",
              "type": "string",
              "value": "={{ $json.contentSnippet || $json.content || '' }}"
            },
            {
              "id": "field-link",
              "name": "link",
              "type": "string",
              "value": "={{ $json.link }}"
            },
            {
              "id": "field-date",
              "name": "isoDate",
              "type": "number",
              "value": "={{ new Date($json.isoDate || $json.pubDate || 0).getTime() }}"
            },
            {
              "id": "field-source",
              "name": "source",
              "type": "string",
              "value": "={{ $json.creator || $json['dc:creator'] || '' }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "09ac682e-fd46-4e82-91dd-5190bb540c26",
      "name": "Filter Last 24 Hours",
      "type": "n8n-nodes-base.filter",
      "position": [
        1808,
        480
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "filter-24h",
              "operator": {
                "type": "number",
                "operation": "gt"
              },
              "leftValue": "={{ $json.isoDate }}",
              "rightValue": "={{ Date.now() - 24 * 60 * 60 * 1000 }}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "db0a8216-2d17-41bf-bce9-2942780b9564",
      "name": "Sort by Date",
      "type": "n8n-nodes-base.sort",
      "position": [
        2048,
        480
      ],
      "parameters": {
        "options": {},
        "sortFieldsUi": {
          "sortField": [
            {
              "order": "descending",
              "fieldName": "isoDate"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "9d2ae888-3755-4bdd-a32f-63bc1f3472e2",
      "name": "Limit to 15",
      "type": "n8n-nodes-base.limit",
      "position": [
        2288,
        480
      ],
      "parameters": {
        "maxItems": 10
      },
      "typeVersion": 1
    },
    {
      "id": "f9b8c3fc-dd6c-4246-879e-6c8cd4c1a981",
      "name": "Aggregate Articles",
      "type": "n8n-nodes-base.code",
      "position": [
        2592,
        480
      ],
      "parameters": {
        "jsCode": "// Aggregate all articles into a single text block for the AI agent\nconst articles = $input.all();\n\nlet summaryText = 'TODAY\\'S TOP NEWS ARTICLES (' + articles.length + ' articles from the last 24 hours):\\n\\n';\n\nfor (let i = 0; i < articles.length; i++) {\n  const a = articles[i].json;\n  summaryText += (i + 1) + '. ' + (a.title || 'No title') + '\\n';\n  summaryText += '   URL: ' + (a.link || '') + '\\n';\n  const snippet = (a.snippet || '').substring(0, 250);\n  if (snippet) {\n    summaryText += '   ' + snippet + '\\n';\n  }\n  summaryText += '\\n';\n}\n\nreturn [{ json: { articlesSummary: summaryText, articleCount: articles.length } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "7a4410a3-aac1-4f48-9354-9425e5e5a064",
      "name": "AI Write News Article",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2880,
        480
      ],
      "parameters": {
        "text": "=You are a professional tech news journalist. Every day you receive a digest of the latest news articles from major tech publications. Your job is to pick the most newsworthy story (or combine 2-3 related stories into one narrative) and write an original, polished news article.\n\n## Today's News Digest\n{{ $json.articlesSummary }}\n\n## Tools Available\n- **Fetch Article**: Pass a full article URL (including https://) to read the complete text. Use this to get the full details of the articles you want to write about.\n\n## Your Task\n1. Review the headlines and snippets above.\n2. Pick the single most important/interesting story, OR pick 2-3 related stories you can weave into one narrative.\n3. Use the Fetch Article tool to read the full text of your chosen 2-3 articles. Do NOT fetch more than 3.\n4. If a fetch fails (paywall, error), skip it and work with what you have.\n5. Write an original news article based on what you've read.\n\n## NEWS ARTICLE STRUCTURE\n\n### Headline\nClear, factual, attention-grabbing.\n\n### Lead Paragraph (1 paragraph)\nThe most important facts: who, what, when, where, why.\n\n### Body (3-5 paragraphs, use <h2> subheadings where appropriate)\n- Key details and context\n- Background and significance\n- Multiple perspectives where available\n- Concrete data, numbers, or specifics\n\n### What's Next (1-2 paragraphs)\nImplications, what to watch for, what happens next.\n\n## WRITING RULES\n- Neutral, professional journalistic tone\n- 600-1000 words\n- All content ORIGINAL \u2014 synthesize and rewrite, never copy\n- Attribute sources naturally (e.g. \"according to Ars Technica\", \"The Verge reports\")\n- Use <h2>, <p>, <strong>, <em> for formatting\n- Do NOT include <html>, <head>, or <body> tags\n\n## OUTPUT FORMAT\nReturn in this EXACT format:\n\nTITLE: [Your headline]\n\n---CONTENT---\n\n[Full article in HTML]",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "80969c99-293b-4e32-b526-faa8fdf43e45",
      "name": "Parse AI Output",
      "type": "n8n-nodes-base.code",
      "position": [
        3280,
        480
      ],
      "parameters": {
        "jsCode": "const raw = String($input.item.json.output || '');\n\nconst contentMarker = '---CONTENT---';\n\nlet title = 'Untitled';\nlet content = raw;\n\nconst tIdx = raw.indexOf('TITLE:');\nif (tIdx !== -1) {\n  const afterTitle = raw.substring(tIdx + 6);\n  const newline = afterTitle.indexOf('\\n');\n  title = newline !== -1 ? afterTitle.substring(0, newline).trim() : afterTitle.trim();\n}\n\nconst contentIdx = raw.indexOf(contentMarker);\nif (contentIdx !== -1) {\n  content = raw.substring(contentIdx + contentMarker.length).trim();\n}\n\nreturn [{ json: { title, content } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "fd06df2c-2f58-4537-ac02-b558a0ad93ae",
      "name": "Create WordPress Draft",
      "type": "n8n-nodes-base.wordpress",
      "position": [
        3520,
        480
      ],
      "parameters": {
        "title": "={{ $json.title }}",
        "additionalFields": {
          "status": "draft",
          "content": "={{ $json.content }}"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4d6164f2-58c9-4a0e-a543-ac92679815e3",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        2752,
        768
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-5.1",
          "cachedResultName": "gpt-5.1"
        },
        "options": {},
        "builtInTools": {}
      },
      "typeVersion": 1.3
    },
    {
      "id": "ac9675ef-78f8-4c46-ac6f-760913278ab5",
      "name": "Fetch Article",
      "type": "@n8n/n8n-nodes-langchain.toolCode",
      "position": [
        2960,
        768
      ],
      "parameters": {
        "name": "my_tool",
        "jsCode": "const url = query.trim();\n\nif (!url.startsWith('http://') && !url.startsWith('https://')) {\n  return 'ERROR: Invalid URL. Must start with http:// or https://';\n}\n\ntry {\n  const html = await this.helpers.httpRequest({\n    method: 'GET',\n    url: url,\n    returnFullResponse: false,\n    timeout: 15000,\n  });\n\n  let text = String(html);\n\n  text = text\n    .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n    .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n    .replace(/<nav[\\s\\S]*?<\\/nav>/gi, '')\n    .replace(/<footer[\\s\\S]*?<\\/footer>/gi, '')\n    .replace(/<header[\\s\\S]*?<\\/header>/gi, '')\n    .replace(/<aside[\\s\\S]*?<\\/aside>/gi, '')\n    .replace(/<noscript[\\s\\S]*?<\\/noscript>/gi, '')\n    .replace(/<iframe[\\s\\S]*?<\\/iframe>/gi, '')\n    .replace(/<!--[\\s\\S]*?-->/g, '')\n    .replace(/<\\/(p|div|h[1-6]|li|tr|br|hr)[^>]*>/gi, '\\n')\n    .replace(/<br\\s*\\/?>/gi, '\\n')\n    .replace(/<[^>]+>/g, ' ')\n    .replace(/&amp;/g, '&')\n    .replace(/&lt;/g, '<')\n    .replace(/&gt;/g, '>')\n    .replace(/&quot;/g, '\"')\n    .replace(/&#39;/g, \"'\")\n    .replace(/&nbsp;/g, ' ')\n    .replace(/[ \\t]+/g, ' ')\n    .replace(/\\n\\s*\\n/g, '\\n\\n')\n    .replace(/\\n{3,}/g, '\\n\\n')\n    .trim();\n\n  if (text.length > 4000) {\n    text = text.substring(0, 4000) + '\\n\\n[Content truncated]';\n  }\n\n  if (text.length < 100) {\n    return 'ERROR: Page returned no usable content (likely 404 or paywall). Skip this URL.';\n  }\n\n  return text;\n\n} catch (error) {\n  return 'ERROR: Could not fetch (' + error.message + '). Skip this URL.';\n}"
      },
      "typeVersion": 1
    },
    {
      "id": "b569fea7-5255-48f1-90fa-0554a3998777",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        176,
        96
      ],
      "parameters": {
        "width": 460,
        "height": 920,
        "content": "## Try It Out!\n### Automatically write and publish an original tech news article to WordPress every morning \u2014 completely hands-free.\n\nGreat for tech bloggers, content creators, or anyone who wants a daily news column without the daily effort.\n\n### How it works\n* A schedule trigger fires daily at 8 AM and pulls articles from four RSS feeds (BBC Tech, The Verge, Ars Technica, TechCrunch).\n* Articles are merged, normalized, filtered to the last 24 hours, sorted, and capped at 10.\n* An OpenAI-powered AI agent picks the most newsworthy story, fetches full article text, and writes an original 600\u20131000 word article.\n* The output is parsed into a title and HTML body, then posted as a draft to WordPress.\n\n### How to use\n* Add your OpenAI API key under Credentials.\n* Add your WordPress API credentials (site URL + application password).\n* Optionally swap RSS feeds, adjust the article limit, or change the post status.\n* Activate the workflow \u2014 it runs daily at 8 AM.\n\n### Requirements\n* OpenAI account and API key\n* WordPress site with application password enabled\n\n### Need Help?\nJoin the [Discord](https://discord.com/invite/XPKeKXeB7d) or ask in the [Forum](https://community.n8n.io/)!\n\nHappy Hacking!"
      },
      "typeVersion": 1
    },
    {
      "id": "08bcd6ab-0e92-4a0c-ae78-0ee88d2a4883",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        720,
        224
      ],
      "parameters": {
        "color": 7,
        "width": 520,
        "height": 728,
        "content": "## 1. Fetch RSS feeds\nPulls the latest articles from BBC Tech, The Verge, Ars Technica, and TechCrunch in parallel, triggered daily at 8 AM."
      },
      "typeVersion": 1
    },
    {
      "id": "c657d8b8-fcef-4ea9-9c97-e2e7b7d1e691",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1520,
        224
      ],
      "parameters": {
        "color": 7,
        "width": 960,
        "height": 568,
        "content": "## 2. Normalize and filter\nStandardizes fields across feeds, drops articles older than 24 hours, sorts by date, and caps the list at 10 items."
      },
      "typeVersion": 1
    },
    {
      "id": "d89aa490-aed8-4940-a7a4-6fa223ce4374",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2544,
        224
      ],
      "parameters": {
        "color": 7,
        "width": 600,
        "height": 696,
        "content": "## 3. AI writes the article\nCompiles headlines into a digest, then an OpenAI agent picks the top story, fetches full text, and writes an original news article."
      },
      "typeVersion": 1
    },
    {
      "id": "25655991-be19-43c9-aecf-c2cb8b024726",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3232,
        224
      ],
      "parameters": {
        "color": 7,
        "width": 520,
        "height": 552,
        "content": "## 4. Publish to WordPress\nExtracts the headline and HTML body from the AI output and creates a WordPress draft post."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "8e182a70-0434-4464-8661-ee225c0e397f",
  "connections": {
    "Limit to 15": {
      "main": [
        [
          {
            "node": "Aggregate Articles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "RSS BBC Tech": {
      "main": [
        [
          {
            "node": "Merge All Feeds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sort by Date": {
      "main": [
        [
          {
            "node": "Limit to 15",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Article": {
      "ai_tool": [
        [
          {
            "node": "AI Write News Article",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "RSS The Verge": {
      "main": [
        [
          {
            "node": "Merge All Feeds",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "RSS TechCrunch": {
      "main": [
        [
          {
            "node": "Merge All Feeds",
            "type": "main",
            "index": 3
          }
        ]
      ]
    },
    "Merge All Feeds": {
      "main": [
        [
          {
            "node": "Normalize Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse AI Output": {
      "main": [
        [
          {
            "node": "Create WordPress Draft",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize Fields": {
      "main": [
        [
          {
            "node": "Filter Last 24 Hours",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "RSS Ars Technica": {
      "main": [
        [
          {
            "node": "Merge All Feeds",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Daily 8AM Trigger": {
      "main": [
        [
          {
            "node": "RSS BBC Tech",
            "type": "main",
            "index": 0
          },
          {
            "node": "RSS The Verge",
            "type": "main",
            "index": 0
          },
          {
            "node": "RSS Ars Technica",
            "type": "main",
            "index": 0
          },
          {
            "node": "RSS TechCrunch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Write News Article",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate Articles": {
      "main": [
        [
          {
            "node": "AI Write News Article",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Last 24 Hours": {
      "main": [
        [
          {
            "node": "Sort by Date",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Write News Article": {
      "main": [
        [
          {
            "node": "Parse AI Output",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}