AutomationFlowsAI & RAG › Automated AI News Curation and Linkedin Posting with Gpt-5 and Firebase

Automated AI News Curation and Linkedin Posting with Gpt-5 and Firebase

ByArthur Dimeglio @wakizara on n8n.io

What this workflow does

Cron / scheduled trigger★★★★★ complexityAI-powered66 nodesOpenAI ChatMemory Buffer WindowOutput Parser StructuredGoogle Firebase Cloud FirestoreHTTP RequestAgentLinkedIn
AI & RAG Trigger: Cron / scheduled Nodes: 66 Complexity: ★★★★★ AI nodes: yes Added:
Automated AI News Curation and Linkedin Posting with Gpt-5 and Firebase — n8n workflow card showing OpenAI Chat, Memory Buffer Window, Output Parser Structured integration

This workflow corresponds to n8n.io template #9886 — we link there as the canonical source.

This workflow follows the Agent → HTTP Request 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 →

Download .json
{
  "id": "e4i8hT22bMxGlNho",
  "name": "LinkedIn autoposting workflow",
  "tags": [],
  "nodes": [
    {
      "id": "a84fc2d1-8036-40f7-a81c-a51e70dfe451",
      "name": "OpenAI Chat Model2",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -1536,
        672
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-5",
          "cachedResultName": "gpt-5"
        },
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "04e01000-abc0-4fad-aa4f-6909de083717",
      "name": "Simple Memory2",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        -1344,
        672
      ],
      "parameters": {
        "sessionKey": "52",
        "sessionIdType": "customKey",
        "contextWindowLength": 20
      },
      "typeVersion": 1.3
    },
    {
      "id": "74387277-9abb-4963-8503-af55fcadfbf1",
      "name": "Structured Output Parser2",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -1168,
        672
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"text\":\"\"\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "e16df0e7-55d3-4c92-85b3-0bcc013d699f",
      "name": "OpenAI Chat Model4",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -1520,
        1248
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-5",
          "cachedResultName": "gpt-5"
        },
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "b15a08b1-78d9-4d38-a288-c7aacecdfabb",
      "name": "Simple Memory4",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        -1344,
        1248
      ],
      "parameters": {
        "sessionKey": "52",
        "sessionIdType": "customKey",
        "contextWindowLength": 20
      },
      "typeVersion": 1.3
    },
    {
      "id": "3bcdc942-5f77-4020-bd8a-fa686eac9f61",
      "name": "Structured Output Parser4",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -1168,
        1248
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"text\":\"\"\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "0c8624a7-90ac-4ab6-936f-19d9f551cabf",
      "name": "Hourly trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -3904,
        736
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 10,12,19,21 * * *"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "43965725-7cf8-4f4e-bb0a-e73ef0ade1e2",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3952,
        592
      ],
      "parameters": {
        "width": 192,
        "height": 368,
        "content": "SET UP TRIGGER"
      },
      "typeVersion": 1
    },
    {
      "id": "ab017486-f8d6-44ea-9e29-2dc246577faa",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3728,
        592
      ],
      "parameters": {
        "color": 3,
        "width": 352,
        "height": 368,
        "content": "**GET PREVIOUS POSTED NEWS TO PREVENT FROM POSTING IT TWICE**\n\n*Please set up your Firebase Credentials on https://firebase.google.com/*"
      },
      "typeVersion": 1
    },
    {
      "id": "82233359-6d6e-4113-ac9a-3584a169c914",
      "name": "Get Previous News Titles",
      "type": "n8n-nodes-base.googleFirebaseCloudFirestore",
      "position": [
        -3584,
        736
      ],
      "parameters": {
        "projectId": "<FIREBASE_PROJECT_ID>",
        "collection": "asma",
        "documentId": "x20",
        "authentication": "serviceAccount"
      },
      "typeVersion": 1.1
    },
    {
      "id": "faa9277c-7230-4f03-935f-0ecf0bdaa42a",
      "name": "API NEWS",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -3232,
        736
      ],
      "parameters": {
        "url": "https://newsapi.org/v2/everything",
        "options": {},
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "q",
              "value": "=AI startup"
            },
            {
              "name": "language",
              "value": "en"
            },
            {
              "name": "sortBy",
              "value": "publishedAt"
            },
            {
              "name": "from",
              "value": "={{ new Date(Date.now() - 48*60*60*1000).toISOString() }}"
            },
            {
              "name": "to",
              "value": "={{ new Date(Date.now() - 24*60*60*1000).toISOString() }}"
            },
            {
              "name": "searchIn",
              "value": "title"
            },
            {
              "name": "apiKey"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "7227823c-c5c6-4b5d-a142-f61905d97fb5",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3344,
        592
      ],
      "parameters": {
        "color": 4,
        "width": 320,
        "height": 368,
        "content": "**COLLECT NEWS FROM API**\n\n*Please set up newsapi api key on https://newsapi.org/\nAnd edit your target topic in \"q\"*\n "
      },
      "typeVersion": 1
    },
    {
      "id": "31e2ec55-501a-46a9-afe3-b39c6975ef3a",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2992,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 688,
        "height": 368,
        "content": "**FILTERING**\n\n*Now we filter to make sure every news as a link not null and the selected news are original and not included in our previously posted list*\n\n "
      },
      "typeVersion": 1
    },
    {
      "id": "7e77308b-b891-4f23-9377-71429b60ea9b",
      "name": "Collect Articles",
      "type": "n8n-nodes-base.set",
      "position": [
        -2912,
        736
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "03f3ee2b-56ea-4ab4-a8d8-e55a9a1ffa42",
              "name": "articles",
              "type": "array",
              "value": "={{ $('API NEWS').item.json.articles }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "a523f342-6277-4eb2-915d-8bb3abd456e2",
      "name": "Select Articles",
      "type": "n8n-nodes-base.code",
      "position": [
        -2688,
        736
      ],
      "parameters": {
        "jsCode": "// n8n Code node \u2014 Run Once for All Items\n// Goal: From multiple news API payloads, return up to 10 *distinct-topic* articles,\n//       each with a valid URL and image, excluding Biztoc and known aggregators.\n//\n// Input shape (per item):\n//   { json: { status, totalResults, articles: [ { title, url, urlToImage, source, publishedAt, description } ] } }\n// Output shape (array of n8n items):\n//   [ { json: { topicKey, title, url, image, source, publishedAt, description } }, ... ]\n\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// 1) Helpers & constants\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Domains considered aggregators / press-release wires to SKIP entirely.\n * Note: MarketWatch press releases are matched via path check.\n * Extend this set as needed (e.g., add your own blacklist domains).\n */\nconst aggregatorDomains = new Set([\n  'biztoc.com','techmeme.com','news.ycombinator.com','flipboard.com',\n  'finance.yahoo.com','consent.yahoo.com','news.yahoo.com',\n  'globenewswire.com','prnewswire.com','businesswire.com',\n  'marketwatch.com/press-release','medium.com','substack.com','thefly.com'\n]);\n\n/**\n * Extract normalized hostname from a URL (without \"www.\")\n * @param {string} url\n * @returns {string} hostname or '' on failure\n */\nfunction getHostname(url) {\n  try {\n    const u = new URL(url);\n    return u.hostname.replace(/^www\\./,'').toLowerCase();\n  } catch { return ''; }\n}\n\n/**\n * Extract pathname from a URL in lowercase.\n * @param {string} url\n * @returns {string} pathname or ''\n */\nfunction getPath(url) {\n  try { return new URL(url).pathname.toLowerCase(); } catch { return ''; }\n}\n\n/**\n * True if the URL belongs to an aggregator or a press-release page.\n * Items matching this are SKIPPED during collection.\n * @param {string} url\n * @returns {boolean}\n */\nfunction isAggregator(url) {\n  const host = getHostname(url);\n  const path = getPath(url);\n  if (!host) return true;\n  if (aggregatorDomains.has(host)) return true;\n  if (host === 'marketwatch.com' && path.includes('/press-release')) return true;\n  return false;\n}\n\n/**\n * True if the article is from Biztoc (by source name or hostname).\n * These are SKIPPED during collection.\n * @param {object} article\n * @returns {boolean}\n */\nfunction isBiztoc(article) {\n  const src = (article?.source?.name || '').toLowerCase().trim();\n  const host = getHostname(article?.url || '');\n  return src === 'biztoc.com' || host === 'biztoc.com';\n}\n\n/**\n * Sanitize title to a comparable, topic-level string.\n * Strips brackets/parentheses, common suffixes, and punctuation; collapses spaces.\n * @param {string} [title='']\n * @returns {string}\n */\nfunction cleanTitle(title = '') {\n  let t = String(title).toLowerCase();\n  t = t.replace(/\\([^)]*\\)/g, ' ').replace(/\\[[^\\]]*\\]/g, ' ');\n  t = t.split('|')[0];\n  t = t.split(' \u2014 ')[0];\n  t = t.split(' - ')[0];\n  t = t.replace(/\\b(opinion|analysis|update|breaking)\\b/g, ' ');\n  t = t.replace(/[^a-z0-9\\s]/g, ' ').replace(/\\s+/g, ' ').trim();\n  return t;\n}\n\n/**\n * Build a canonical topic key from cleaned title + registrable domain.\n * @param {object} article\n * @returns {string}\n */\nfunction canonicalKey(article) {\n  const titleKey = cleanTitle(article.title || '');\n  const host = getHostname(article.url || '');\n  return `${titleKey}__${host ? host.split('.').slice(-2).join('.') : ''}`;\n}\n\n/**\n * Parse date string to epoch ms (0 if invalid).\n * @param {string} s\n * @returns {number}\n */\nfunction parseDate(s) {\n  const d = new Date(s);\n  return isNaN(d.getTime()) ? 0 : d.getTime();\n}\n\n/**\n * Heuristic quality score (aggregators already excluded earlier):\n *  - Reward presence of image\n *  - Reward longer description (capped)\n *  - Light recency bias\n * @param {object} a\n * @returns {number}\n */\nfunction qualityScore(a) {\n  const hasImage = a.urlToImage ? 1 : 0;\n  const descLen = (a.description || '').length;\n\n  return (\n    hasImage * 5 +\n    Math.min(descLen, 800) / 160 + // up to +5\n    parseDate(a.publishedAt) / 1e12 // modest recency factor\n  );\n}\n\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/* 2) Collect & pre-filter all articles across inputs\n      Keep only items that:\n        - have URL AND image\n        - are NOT Biztoc\n        - are NOT from aggregators (isAggregator)\n        - are NOT Yahoo consent redirect pages\n*/\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst allArticles = [];\nfor (const item of items) {\n  const arts = item.json?.articles ?? [];\n  for (const a of arts) {\n    if (!a?.url || !a?.urlToImage) continue;           // must have URL + image\n    if (a.url.includes('consent.yahoo.com')) continue;  // skip consent redirects\n    if (isAggregator(a.url)) continue;                  // skip aggregators entirely\n    if (isBiztoc(a)) continue;                          // skip Biztoc entirely\n    allArticles.push(a);\n  }\n}\n\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// 3) Group by canonical \"topic\" key to avoid duplicates across sources\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst groups = new Map();\nfor (const a of allArticles) {\n  const key = canonicalKey(a);\n  if (!key) continue;\n  if (!groups.has(key)) groups.set(key, []);\n  groups.get(key).push(a);\n}\n\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// 4) For each topic, pick the best representative article (highest qualityScore)\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst picks = [];\nfor (const [key, arr] of groups.entries()) {\n  const sorted = arr.slice().sort((a, b) => qualityScore(b) - qualityScore(a));\n  const best = sorted.find(a => a?.url && a?.urlToImage);\n  if (!best) continue;\n\n  picks.push({\n    topicKey: key,\n    title: best.title || '',\n    url: best.url,\n    image: best.urlToImage,\n    source: best.source?.name || getHostname(best.url),\n    publishedAt: best.publishedAt || null,\n    description: best.description || null,\n  });\n}\n\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// 5) Sort by recency and take the 10 most recent topics\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\npicks.sort((a, b) => parseDate(b.publishedAt) - parseDate(a.publishedAt));\nconst top10 = picks.slice(0, 10);\n\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// 6) Return as n8n items \u2014 all guaranteed to have URL + image and not aggregators\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nreturn top10.map(x => ({ json: x }));"
      },
      "retryOnFail": true,
      "typeVersion": 2
    },
    {
      "id": "dcb51a5b-b8e9-4151-8182-5bd2a74b7d35",
      "name": "URL checker",
      "type": "n8n-nodes-base.if",
      "position": [
        -2464,
        736
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "e052b718-bf95-45e8-94ef-6c3eacbcfaed",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.url }}",
              "rightValue": ""
            },
            {
              "id": "8b1b3c27-cc86-48d9-95d1-8f55694b8491",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              },
              "leftValue": "={{ $('Get Previous News Titles').first().json.title10 }}",
              "rightValue": "={{ $json.title }}"
            },
            {
              "id": "6ff40e0f-076e-4a85-a7ee-a7933a09956e",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              },
              "leftValue": "={{ $('Get Previous News Titles').first().json.title19 }}",
              "rightValue": "={{ $json.title }}"
            },
            {
              "id": "d1ba154a-c500-48ee-9d17-0aae384ce839",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              },
              "leftValue": "={{ $('Get Previous News Titles').first().json.title12 }}",
              "rightValue": "={{ $json.title }}"
            },
            {
              "id": "05ce4ee6-2974-409b-bd53-ef3964f4399d",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              },
              "leftValue": "={{ $('Get Previous News Titles').first().json.title21 }}",
              "rightValue": "={{ $json.title }}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "f5f4cd01-0c2b-401e-9165-4a2ea1ca6542",
      "name": "Description Checker",
      "type": "n8n-nodes-base.if",
      "position": [
        -2144,
        720
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "20b3a4b5-f905-49a7-889c-68d8a14e0ff0",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.description }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "c3b8f012-27b5-402e-86c4-f8771eca9d84",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2256,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 368,
        "content": "**DESCRIPTION CHECKER**\n\n*Now we check if the description is empty or not*\n\n "
      },
      "typeVersion": 1
    },
    {
      "id": "68047bbb-aa9e-4552-90ea-3dad2f3e52f4",
      "name": "LinkedIn post redaction",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -1408,
        448
      ],
      "parameters": {
        "text": "=You\u2019re not a copywriter. You\u2019re a real human who loves AI and startups. \nYou scroll LinkedIn, see a new startup, and decide to explain it to people \u2014 in your own words. \n\nForget structure, forget polish. Write like someone who\u2019s thinking out loud, but still clear.\nIt should feel like a post written by a person who\u2019s genuinely curious and trying to make sense of what they just read.\n\nSTYLE\n\u2022 Natural, spontaneous, sometimes imperfect. Small hesitations, simple words.\n\u2022 Mix short and long sentences. Some can start with \u201cAnd\u201d, \u201cBut\u201d, \u201cSo\u201d.\n\u2022 Don\u2019t over-polish. It should sound like someone typing fast, not editing.\n\u2022 Use normal connectors: \u201cBasically\u201d, \u201cI mean\u201d, \u201cWhat\u2019s cool is\u201d, \u201cYou know how sometimes\u2026\u201d\n\u2022 No fluff, no hype, no marketing tone. Just someone smart trying to explain simply.\n\u2022 Sound slightly messy, but intelligent. Honest curiosity over perfection.\n\nCONTENT\n\u2022 Start with a hook, but not a \u201ccopywriter hook\u201d. Something casual.\n\u2022 Then explain what the startup does in plain words. No jargon. Imagine explaining to a friend who doesn\u2019t work in tech.\n\u2022 Add a small reaction \u2014 what surprised you, what you find smart, or what it makes you think about.\n\u2022 Close with a small, grounded reflection or observation. No \u201cwhat do you think?\u201d or corporate endings.\n\u2022 4\u20137 short paragraphs (line breaks for readability). 700\u20131200 characters total.\n\nRULES\n\u2022 English only.\n\u2022 No emojis, no links, no markdown.\n\u2022 2\u20133 simple hashtags at the end (#AI #Startups #Innovation).\n\u2022 Company's name start with a #\n\u2022 Avoid perfect structure or transitions \u2014 let it feel natural.\n\u2022 Output only the post text, nothing else.\n\nGOAL\nMake readers feel like they\u2019re reading a real human post \u2014 a bit raw, slightly disorganized, but genuinely insightful and understandable.\n\nContext:\nTitle: {{ $json.title }}\nDescription: {{ $json.description }}\nURL: {{ $json.url }}",
        "options": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "e3e87663-8f3c-427f-aba9-e243bf404957",
      "name": "LinkedIn post redaction 2",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -1408,
        1024
      ],
      "parameters": {
        "text": "=You\u2019re not a copywriter. You\u2019re a real human who loves AI and startups. \nYou scroll LinkedIn, see a new startup, and decide to explain it to people \u2014 in your own words. \n\nForget structure, forget polish. Write like someone who\u2019s thinking out loud, but still clear.\nIt should feel like a post written by a person who\u2019s genuinely curious and trying to make sense of what they just read.\n\nSTYLE\n\u2022 Natural, spontaneous, sometimes imperfect. Small hesitations, simple words.\n\u2022 Mix short and long sentences. Some can start with \u201cAnd\u201d, \u201cBut\u201d, \u201cSo\u201d.\n\u2022 Don\u2019t over-polish. It should sound like someone typing fast, not editing.\n\u2022 Use normal connectors: \u201cBasically\u201d, \u201cI mean\u201d, \u201cWhat\u2019s cool is\u201d, \u201cYou know how sometimes\u2026\u201d\n\u2022 No fluff, no hype, no marketing tone. Just someone smart trying to explain simply.\n\u2022 Sound slightly messy, but intelligent. Honest curiosity over perfection.\n\nCONTENT\n\u2022 Start with a hook, but not a \u201ccopywriter hook\u201d. Something casual.\n\u2022 Then explain what the startup does in plain words. No jargon. Imagine explaining to a friend who doesn\u2019t work in tech.\n\u2022 Add a small reaction \u2014 what surprised you, what you find smart, or what it makes you think about.\n\u2022 Close with a small, grounded reflection or observation. No \u201cwhat do you think?\u201d or corporate endings.\n\u2022 4\u20137 short paragraphs (line breaks for readability). 700\u20131200 characters total.\n\nRULES\n\u2022 English only.\n\u2022 No emojis, no links, no markdown.\n\u2022 2\u20133 simple hashtags at the end (#AI #Startups #Innovation).\n\u2022 Company's name start with a #\n\u2022 Avoid perfect structure or transitions \u2014 let it feel natural.\n\u2022 Output only the post text, nothing else.\n\nGOAL\nMake readers feel like they\u2019re reading a real human post \u2014 a bit raw, slightly disorganized, but genuinely insightful and understandable.\n\nContext:\nTitle: {{ $json.title }}\nURL: {{ $json.url }}",
        "options": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "4cf950b6-3d7a-46e3-85b8-527f210247dc",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1584,
        304
      ],
      "parameters": {
        "color": 5,
        "width": 544,
        "height": 544,
        "content": "**LinkedIn post redaction**\n\n*The AI Agent is writing the article for LinkedIn, you can adjust the prompt if needed*\n "
      },
      "typeVersion": 1
    },
    {
      "id": "a0d06f07-6ad2-43a5-87e0-b070d31fdd1f",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1584,
        880
      ],
      "parameters": {
        "color": 3,
        "width": 544,
        "height": 544,
        "content": "**LinkedIn post redaction**\n\n*The AI Agent is writing the article for LinkedIn, you can adjust the prompt if needed*\n "
      },
      "typeVersion": 1
    },
    {
      "id": "0bba3705-5af1-4489-8e53-fd00658dddd8",
      "name": "Post setup",
      "type": "n8n-nodes-base.set",
      "position": [
        -928,
        448
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "09e72bc3-709a-4f35-a195-afb59ee567c1",
              "name": "input image url",
              "type": "string",
              "value": "={{ $('URL checker').item.json.urlToImage }}"
            },
            {
              "id": "7624a24e-06b5-4c6d-aa3d-cad469b5273c",
              "name": "=post",
              "type": "string",
              "value": "={{ $json.output.text.replaceAll(\"\u2014\",\",\") }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "5579f486-11c7-465d-a233-8d222eb7e12e",
      "name": "Post setup 2",
      "type": "n8n-nodes-base.set",
      "position": [
        -912,
        1024
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "09e72bc3-709a-4f35-a195-afb59ee567c1",
              "name": "input image url",
              "type": "string",
              "value": "={{ $('URL checker').item.json.urlToImage }}"
            },
            {
              "id": "7624a24e-06b5-4c6d-aa3d-cad469b5273c",
              "name": "=post",
              "type": "string",
              "value": "={{ $json.output.text.replaceAll(\"\u2014\",\",\") }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "f184aa38-4eea-4ac8-889c-7b7942e731d8",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1920,
        496
      ],
      "parameters": {
        "color": 5,
        "width": 320,
        "height": 272,
        "content": "**CASE 1**\n\n*Description is not empty*\n\n "
      },
      "typeVersion": 1
    },
    {
      "id": "5048f64e-29d0-46fe-ab3f-53bde9e85656",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1920,
        784
      ],
      "parameters": {
        "color": 3,
        "width": 320,
        "height": 272,
        "content": "**CASE 2**\n\n*Description is empty*\n\n "
      },
      "typeVersion": 1
    },
    {
      "id": "3f94ff2f-4a77-44e6-9b32-6bbddcb1260d",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1024,
        304
      ],
      "parameters": {
        "color": 5,
        "width": 320,
        "height": 544,
        "content": "**Post setup**\n\n*We set up image url and clean post content*\n "
      },
      "typeVersion": 1
    },
    {
      "id": "83cdb55f-37f7-4751-bd33-e5419c0eb69a",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1024,
        880
      ],
      "parameters": {
        "color": 3,
        "width": 320,
        "height": 544,
        "content": "**Post setup**\n\n*We set up image url and clean post content*\n "
      },
      "typeVersion": 1
    },
    {
      "id": "cea36ac0-6bc4-4af0-9fd0-6eeb786b22ed",
      "name": "Image Dowloader",
      "type": "n8n-nodes-base.httpRequest",
      "onError": "continueErrorOutput",
      "position": [
        -576,
        448
      ],
      "parameters": {
        "url": "={{ $json[\"input image url\"] }}",
        "options": {
          "redirect": {
            "redirect": {}
          },
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "875ee847-2823-4f34-aace-c3dd4306ac8b",
      "name": "Image Dowloader 2",
      "type": "n8n-nodes-base.httpRequest",
      "onError": "continueErrorOutput",
      "position": [
        -592,
        1024
      ],
      "parameters": {
        "url": "={{ $json[\"input image url\"] }}",
        "options": {
          "redirect": {
            "redirect": {}
          },
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "07d778e4-aa2a-4641-a130-c316b2c9491a",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -688,
        304
      ],
      "parameters": {
        "color": 5,
        "width": 320,
        "height": 544,
        "content": "**Image Downloader**\n\n*We download the image to check if the link is usable*\n "
      },
      "typeVersion": 1
    },
    {
      "id": "bb94bcf4-a73f-4ec9-ae87-82e195096e51",
      "name": "Sticky Note12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -688,
        880
      ],
      "parameters": {
        "color": 3,
        "width": 320,
        "height": 544,
        "content": "**Image Downloader**\n\n*We download the image to check if the link is usable*\n "
      },
      "typeVersion": 1
    },
    {
      "id": "51cf0152-39a9-4d10-9621-f805622dbb0b",
      "name": "LinkedIn Publisher",
      "type": "n8n-nodes-base.linkedIn",
      "position": [
        -224,
        384
      ],
      "parameters": {
        "text": "={{ $('Post setup').item.json.post }}",
        "person": "<LINKEDIN_PERSON_ID>",
        "additionalFields": {},
        "shareMediaCategory": "IMAGE"
      },
      "typeVersion": 1
    },
    {
      "id": "208cf8fa-eea0-4059-aa80-ba26f4679698",
      "name": "LinkedIn Publisher 2",
      "type": "n8n-nodes-base.linkedIn",
      "position": [
        -224,
        672
      ],
      "parameters": {
        "text": "={{ $('Post setup').item.json.post }}",
        "person": "<LINKEDIN_PERSON_ID>",
        "additionalFields": {}
      },
      "typeVersion": 1
    },
    {
      "id": "3654a38e-2979-4bc3-a3aa-392f6cc14746",
      "name": "Sticky Note14",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -336,
        560
      ],
      "parameters": {
        "color": 5,
        "width": 320,
        "height": 288,
        "content": "**Case 2**\n\n*We post on LinkedIn without a media*\n "
      },
      "typeVersion": 1
    },
    {
      "id": "940f8e6b-fe71-4058-be85-04a2c11156ff",
      "name": "Sticky Note15",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -336,
        256
      ],
      "parameters": {
        "color": 5,
        "width": 320,
        "height": 288,
        "content": "**Case 1**\n\n*We post on LinkedIn with a media*\n "
      },
      "typeVersion": 1
    },
    {
      "id": "b37aa6b9-5bb0-40a6-a660-67b60732addc",
      "name": "LinkedIn Publisher 3",
      "type": "n8n-nodes-base.linkedIn",
      "position": [
        -256,
        1008
      ],
      "parameters": {
        "text": "={{ $('Post setup 2').item.json.post }}",
        "person": "<LINKEDIN_PERSON_ID>",
        "additionalFields": {},
        "shareMediaCategory": "IMAGE"
      },
      "typeVersion": 1
    },
    {
      "id": "832814d0-31b9-408c-81d3-d5c493fd9bb6",
      "name": "LinkedIn Publisher 4",
      "type": "n8n-nodes-base.linkedIn",
      "position": [
        -240,
        1312
      ],
      "parameters": {
        "text": "={{ $('Post setup 2').item.json.post }}",
        "person": "<LINKEDIN_PERSON_ID>",
        "additionalFields": {}
      },
      "typeVersion": 1
    },
    {
      "id": "5b65a38e-9ee3-485c-a031-681aa1c2d648",
      "name": "Sticky Note16",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        0
      ],
      "parameters": {
        "color": 5,
        "width": 2064,
        "height": 848,
        "content": "**SAVING IN FIRESTOR**\n\n*We save posted news in Firestore to make sure we won't post it again*\n "
      },
      "typeVersion": 1
    },
    {
      "id": "e3d978bc-6bb8-4595-b31f-3d43ae35d0de",
      "name": "Sticky Note17",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -352,
        1184
      ],
      "parameters": {
        "color": 3,
        "width": 320,
        "height": 288,
        "content": "**Case 2**\n\n*We post on LinkedIn without a media*\n "
      },
      "typeVersion": 1
    },
    {
      "id": "5b6ef939-c75a-40b6-bb96-102d7e667168",
      "name": "Sticky Note18",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -352,
        880
      ],
      "parameters": {
        "color": 3,
        "width": 320,
        "height": 288,
        "content": "**Case 1**\n\n*We post on LinkedIn with a media*\n "
      },
      "typeVersion": 1
    },
    {
      "id": "06a8b8f4-1b54-44b6-9ee6-1d4b6bb2abfc",
      "name": "time checker",
      "type": "n8n-nodes-base.if",
      "position": [
        640,
        384
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "309eefc6-38b4-4273-bb4f-27b2e0a52d7d",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $('Hourly trigger').item.json.Hour }}",
              "rightValue": "10"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "407e1ed7-8221-47d7-858c-98ab28290e86",
      "name": "time checker 2",
      "type": "n8n-nodes-base.if",
      "position": [
        864,
        480
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "309eefc6-38b4-4273-bb4f-27b2e0a52d7d",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $('Hourly trigger').item.json.Hour }}",
              "rightValue": "12"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "2f6ac17d-3e7d-4a4d-953e-cbf3eb3b139c",
      "name": "time checker 3",
      "type": "n8n-nodes-base.if",
      "position": [
        1088,
        576
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "309eefc6-38b4-4273-bb4f-27b2e0a52d7d",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $('Hourly trigger').item.json.Hour }}",
              "rightValue": "21"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "a9d0c1c6-6c97-4b15-afa3-b521e45f08cb",
      "name": "time checker 4",
      "type": "n8n-nodes-base.if",
      "position": [
        1312,
        672
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "309eefc6-38b4-4273-bb4f-27b2e0a52d7d",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $('Hourly trigger').item.json.Hour }}",
              "rightValue": "19"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "498d0a96-34af-418e-bc4a-1f3647bce430",
      "name": "time checker 5",
      "type": "n8n-nodes-base.if",
      "position": [
        688,
        1184
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "309eefc6-38b4-4273-bb4f-27b2e0a52d7d",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $('Hourly trigger').item.json.Hour }}",
              "rightValue": "10"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "43818ae9-98c6-4ff4-a2f4-f46fa5f8c959",
      "name": "time checker 6",
      "type": "n8n-nodes-base.if",
      "position": [
        912,
        1280
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "309eefc6-38b4-4273-bb4f-27b2e0a52d7d",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $('Hourly trigger').item.json.Hour }}",
              "rightValue": "12"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "907acd79-2765-447b-bf7d-f4b7772836cb",
      "name": "time checker 7",
      "type": "n8n-nodes-base.if",
      "position": [
        1136,
        1376
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "309eefc6-38b4-4273-bb4f-27b2e0a52d7d",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $('Hourly trigger').item.json.Hour }}",
              "rightValue": "21"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "febf0e90-2f81-4388-a528-323746c383ed",
      "name": "set up",
      "type": "n8n-nodes-base.set",
      "position": [
        864,
        96
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d5b9c1f7-d5a4-4034-81a2-ac7c7d3c5a1f",
              "name": "title10",
              "type": "string",
              "value": "={{ $('Select Articles').item.json.title }}"
            },
            {
              "id": "37b34019-1ca8-4572-9014-ddefe87b2cd7",
              "name": "id",
              "type": "string",
              "value": "x20"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "a8c6272d-437d-445b-959c-46d2c825d7a1",
      "name": "set up 2",
      "type": "n8n-nodes-base.set",
      "position": [
        1088,
        288
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d5b9c1f7-d5a4-4034-81a2-ac7c7d3c5a1f",
              "name": "title12",
              "type": "string",
              "value": "={{ $('Select Articles').item.json.title }}"
            },
            {
              "id": "37b34019-1ca8-4572-9014-ddefe87b2cd7",
              "name": "id",
              "type": "string",
              "value": "x20"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "f2275a8c-ad70-4a8f-affd-ba9518e031fc",
      "name": "set up 3",
      "type": "n8n-nodes-base.set",
      "position": [
        1312,
        480
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d5b9c1f7-d5a4-4034-81a2-ac7c7d3c5a1f",
              "name": "title21",
              "type": "string",
              "value": "={{ $('Select Articles').item.json.title }}"
            },
            {
              "id": "37b34019-1ca8-4572-9014-ddefe87b2cd7",
              "name": "id",
              "type": "string",
              "value": "x20"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "da8e686d-0dbf-4096-b1d5-537a0cd75883",
      "name": "set up 4",
      "type": "n8n-nodes-base.set",
      "position": [
        1536,
        672
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d5b9c1f7-d5a4-4034-81a2-ac7c7d3c5a1f",
              "name": "title19",
              "type": "string",
              "value": "={{ $('Select Articles').item.json.title }}"
            },
            {
              "id": "37b34019-1ca8-4572-9014-ddefe87b2cd7",
              "name": "id",
              "type": "string",
              "value": "x20"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "1a8f8954-ff89-4cd8-a5ed-06d5d1199daa",
      "name": "set up 5",
      "type": "n8n-nodes-base.set",
      "position": [
        912,
        992
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d5b9c1f7-d5a4-4034-81a2-ac7c7d3c5a1f",
              "name": "title10",
              "type": "string",
              "value": "={{ $('Select Articles').item.json.title }}"
            },
            {
              "id": "37b34019-1ca8-4572-9014-ddefe87b2cd7",
              "name": "id",
              "type": "string",
              "value": "x20"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "7d6cfc31-bed9-4c5d-a058-0df9555e8613",
      "name": "set up 6",
      "type": "n8n-nodes-base.set",
      "position": [
        1136,
        1184
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d5b9c1f7-d5a4-4034-81a2-ac7c7d3c5a1f",
              "name": "title12",
              "type": "string",
              "value": "={{ $('Select Articles').item.json.title }}"
            },
            {
              "id": "37b34019-1ca8-4572-9014-ddefe87b2cd7",
              "name": "id",
              "type": "string",
              "value": "x20"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "889ff863-f82c-421e-b95b-f589cfa4ade3",
      "name": "set up 7",
      "type": "n8n-nodes-base.set",
      "position": [
        1360,
        1376
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d5b9c1f7-d5a4-4034-81a2-ac7c7d3c5a1f",
              "name": "title21",
              "type": "string",
              "value": "={{ $('Select Articles').item.json.title }}"
            },
            {
              "id": "37b34019-1ca8-4572-9014-ddefe87b2cd7",
              "name": "id",
              "type": "string",
              "value": "x20"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "d0a5bbbc-acc4-47bf-bd2c-f408280c8c72",
      "name": "time checker 8",
      "type": "n8n-nodes-base.if",
      "position": [
        1344,
        1536
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "309eefc6-38b4-4273-bb4f-27b2e0a52d7d",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $('Hourly trigger').item.json.Hour }}",
              "rightValue": "19"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "f9733ae0-08fd-435e-9d70-5a562c8fca6b",
      "name": "set up 8",
      "type": "n8n-nodes-base.set",
      "position": [
        1568,
        1536
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d5b9c1f7-d5a4-4034-81a2-ac7c7d3c5a1f",
              "name": "title19",
              "type": "string",
              "value": "={{ $('Select Articles').item.json.title }}"
            },
            {
              "id": "37b34019-1ca8-4572-9014-ddefe87b2cd7",
              "name": "id",
              "type": "string",
              "value": "x20"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "273402f8-09fc-465d-afee-ad0dabb8e795",
      "name": "Firebase Article Saver",
      "type": "n8n-nodes-base.googleFirebaseCloudFirestore",
      "position": [
        1088,
        96
      ],
      "parameters": {
        "columns": "title10",
        "operation": "upsert",
        "projectId": "<FIREBASE_PROJECT_ID>",
        "updateKey": "id",
        "collection": "asma",
        "authentication": "serviceAccount"
      },
      "typeVersion": 1.1
    },
    {
      "id": "30444b6b-f441-48d2-9e3d-de62ed2cc306",
      "name": "Firebase Article Saver 2",
      "type": "n8n-nodes-base.googleFirebaseCloudFirestore",
      "position": [
        1312,
        288
      ],
      "parameters": {
        "columns": "title12",
        "operation": "upsert",
        "projectId": "<FIREBASE_PROJECT_ID>",
        "updateKey": "id",
        "collection": "asma",
        "authentication": "serviceAccount"
      },
      "typeVersion": 1.1
    },
    {
      "id": "87e8c1e8-c6aa-40fc-971e-9504626d489f",
      "name": "Firebase Article Saver 3",
      "type": "n8n-nodes-base.googleFirebaseCloudFirestore",
      "position": [
        1536,
        480
      ],
      "parameters": {
        "columns": "title21",
        "operation": "upsert",
        "projectId": "<FIREBASE_PROJECT_ID>",
        "updateKey": "id",
        "collection": "asma",
        "authentication": "serviceAccount"
      },
      "typeVersion": 1.1
    },
    {
      "id": "e8ae0197-d5c1-4b1d-b39d-d7a7283aa275",
      "name": "Firebase Article Saver 4",
      "type": "n8n-nodes-base.googleFirebaseCloudFirestore",
      "position": [
        1760,
        672
      ],
      "parameters": {
        "columns": "title19",
        "operation": "upsert",
        "projectId": "<FIREBASE_PROJECT_ID>",
        "updateKey": "id",
        "collection": "asma",
        "authentication": "serviceAccount"
      },
      "typeVersion": 1.1
    },
    {
      "id": "8710811e-4652-48e8-aef0-53490f3ae8bd",
      "name": "Firebase Article Saver 5",
      "type": "n8n-nodes-base.googleFirebaseCloudFirestore",
      "position": [
        1136,
        992
      ],
      "parameters": {
        "columns": "title10",
        "operation": "upsert",
        "projectId": "<FIREBASE_PROJECT_ID>",
        "updateKey": "id",
        "collection": "asma",
        "authentication": "serviceAccount"
      },
      "typeVersion": 1.1
    },
    {
      "id": "b81909bf-730c-4477-af35-dbbca56a65da",
      "name": "Firebase Article Saver 6",
      "type": "n8n-nodes-base.googleFirebaseCloudFirestore",
      "position": [
        1360,
        1184
      ],
      "parameters": {
        "columns": "title12",
        "operation": "upsert",
        "projectId": "<FIREBASE_PROJECT_ID>",
        "updateKey": "id",
        "collection": "asma",
        "authentication": "serviceAccount"
      },
      "typeVersion": 1.1
    },
    {
      "id": "7c3c5385-001f-42c1-a2da-d5aac6b1b42e",
      "name": "Firebase Article Saver 7",
      "type": "n8n-nodes-base.googleFirebaseCloudFirestore",
      "position": [
        1584,
        1376
      ],
      "parameters": {
        "columns": "title21",
        "operation": "upsert",
        "projectId": "<FIREBASE_PROJECT_ID>",
        "updateKey": "id",
        "collection": "asma",
        "authentication": "serviceAccount"
      },
      "typeVersion": 1.1
    },
    {
      "id": "14c1e001-56db-415c-9cdf-6eec62b2ad46",
      "name": "Firebase Article Saver 8",
      "type": "n8n-nodes-base.googleFirebaseCloudFirestore",
      "position": [
        1792,
        1536
      ],
      "parameters": {
        "columns": "title19",
        "operation": "upsert",
        "projectId": "<FIREBASE_PROJECT_ID>",
        "updateKey": "id",
        "collection": "asma",
        "authentication": "serviceAccount"
      },
      "typeVersion": 1.1
    },
    {
      "id": "58f23878-ec39-471a-bbe4-3d33b68a393d",
      "name": "Sticky Note19",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -16,
        880
      ],
      "parameters": {
        "color": 3,
        "width": 2064,
        "height": 848,
        "content": "**SAVING IN FIRESTOR**\n\n*We save posted news in Firestore to make sure we won't post it again*\n "
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "1cd492a9-2ca4-4c18-b89a-997c9d09cf27",
  "connections": {
    "set up": {
      "main": [
        [
          {
            "node": "Firebase Article Saver",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "API NEWS": {
      "main": [
        [
          {
            "node": "Collect Articles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "set up 2": {
      "main": [
        [
          {
            "node": "Firebase Article Saver 2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "set up 3": {
      "main": [
        [
          {
            "node": "Firebase Article Saver 3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "set up 4": {
      "main": [
        [
          {
            "node": "Firebase Article Saver 4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "set up 5": {
      "main": [
        [
          {
            "node": "Firebase Article Saver 5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "set up 6": {
      "main": [
        [
          {
            "node": "Firebase Article Saver 6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "set up 7": {
      "main": [
        [
          {
            "node": "Firebase Article Saver 7",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "set up 8": {
      "main": [
        [
          {
            "node": "Firebase Article Saver 8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Post setup": {
      "main": [
        [
          {
            "node": "Image Dowloader",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "URL checker": {
      "main": [
        [
          {
            "node": "Description Checker",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Collect Articles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Post setup 2": {
      "main": [
        [
          {
            "node": "Image Dowloader 2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "time checker": {
      "main": [
        [
          {
            "node": "set up",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "time checker 2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Hourly trigger": {
      "main": [
        [
          {
            "node": "Get Previous News Titles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory2": {
      "ai_memory": [
        [
          {
            "node": "LinkedIn post redaction",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory4": {
      "ai_memory": [
        [
          {
            "node": "LinkedIn post redaction 2",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "time checker 2": {
      "main": [
        [
          {
            "node": "set up 2",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "time checker 3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "time checker 3": {
      "main": [
        [
          {
            "node": "set up 3",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "time checker 4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "time checker 4": {
      "main": [
        [
          {
            "node": "set up 4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "time checker 5": {
      "main": [
        [
          {
            "node": "set up 5",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "time checker 6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "time checker 6": {
      "main": [
        [
          {
            "node": "set up 6",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "time checker 7",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "time checker 7": {
      "main": [
        [
          {
            "node": "set up 7",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "time checker 8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "time checker 8": {
      "main": [
        [
          {
            "node": "set up 8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Image Dowloader": {
      "main": [
        [
          {
            "node": "LinkedIn Publisher",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "LinkedIn Publisher 2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Select Articles": {
      "main": [
        [
          {
            "node": "URL checker",
            "type
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

What this workflow does

Source: https://n8n.io/workflows/9886/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

This workflow is for beauty salons who want consistent, high‑quality social media content without writing every post manually. It also suits agencies and automation builders who manage multiple beauty

Telegram, Google Sheets Trigger, Agent +26
AI & RAG

This workflow was born out of a very real problem.

Output Parser Structured, OpenAI Chat, Memory Buffer Window +11
AI & RAG

This workflow automates end-to-end sustainability lifecycle management for corporate sustainability teams, ESG governance officers, and circular economy programme leads. It addresses the challenge of

Form Trigger, Agent, OpenAI Chat +11
AI & RAG

This n8n workflow is designed for content creators, digital marketers, and social media managers who want to automate their entire content creation and publishing process across multiple platforms. It

Google Sheets, WordPress, Edit Image +13
AI & RAG

This n8n workflow automates the daily monitoring of trends across X (Twitter), newsletters, and websites. It runs on a schedule, fetches data from configured sources in Google Sheets, processes it usi

Google Sheets, Gmail, Airtop Tool +7