AutomationFlowsAI & RAG › Multi-platform Source Discovery with Serpapi, Duckduckgo, Github, Reddit &…

Multi-platform Source Discovery with Serpapi, Duckduckgo, Github, Reddit &…

Original n8n title: Multi-platform Source Discovery with Serpapi, Duckduckgo, Github, Reddit & Bluesky

ByHybroht @hybroht on n8n.io

Version : 1.0

Cron / scheduled trigger★★★★★ complexityAI-powered68 nodesN8N Nodes Duckduckgo SearchN8N Nodes Bluesky EnhancedN8N Nodes SerpapiN8N Nodes GlobalsHTTP RequestRedditRSS Feed ReadLm Chat Mistral Cloud
AI & RAG Trigger: Cron / scheduled Nodes: 68 Complexity: ★★★★★ AI nodes: yes Added:
Multi-platform Source Discovery with Serpapi, Duckduckgo, Github, Reddit &… — n8n workflow card showing N8N Nodes Duckduckgo Search, N8N Nodes Bluesky Enhanced, N8N Nodes Serpapi integration

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

This workflow follows the HTTP Request → Informationextractor 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": "l3q1m2TZDbwizwGn",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Source Discovery - Automatically Search More Up-to-Date Information Sources",
  "tags": [
    {
      "id": "7Ebg06QToXQ2UrOO",
      "name": "WHITE LABEL",
      "createdAt": "2025-07-17T18:04:33.197Z",
      "updatedAt": "2025-07-17T18:04:33.197Z"
    },
    {
      "id": "JK3I68rY6cIlUP5Z",
      "name": "V1.0",
      "createdAt": "2025-06-20T18:01:10.400Z",
      "updatedAt": "2025-06-20T18:01:10.400Z"
    },
    {
      "id": "QJOKfP6e64mUtezh",
      "name": "Source Discovery",
      "createdAt": "2025-07-11T23:43:47.597Z",
      "updatedAt": "2025-08-06T20:59:12.981Z"
    },
    {
      "id": "nEQ2nHALSQN4jgJ0",
      "name": "Free",
      "createdAt": "2025-06-25T21:55:38.353Z",
      "updatedAt": "2025-06-25T21:55:38.353Z"
    }
  ],
  "nodes": [
    {
      "id": "595e8cac-a963-4776-9d8d-e0fda9fadc73",
      "name": "Sticky Note17",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -496,
        -288
      ],
      "parameters": {
        "color": 5,
        "width": 1580,
        "height": 760,
        "content": "## Search Queries with DuckDuckGo & Bluesky\n\nThis step utilizes the DuckDuckGo and Bluesky custom nodes to identify potential sources based on the specified search themes.\n\n***Observations***:\n- The Bluesky Node maximum results are configured to 10.\n- DuckDuckGo's Safe Search is configured to \"Strict.\"\n- DuckDuckGo's maximum results are configured to 100."
      },
      "typeVersion": 1
    },
    {
      "id": "5d5fb335-068e-4262-8242-aedf5fd3d211",
      "name": "Filter Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        336,
        48
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "e2ffe594-180d-4e1d-b869-8056ac67015d",
              "name": "title",
              "type": "string",
              "value": "={{ $json.title }}"
            },
            {
              "id": "87c5a171-9ab9-4043-a72a-32aec218fe63",
              "name": "pubDate",
              "type": "string",
              "value": "={{ $json.date }}"
            },
            {
              "id": "978b05c9-6e6b-4a18-bc06-4de785b19413",
              "name": "link",
              "type": "string",
              "value": "={{ $json.url }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "52a92dde-ed73-4740-be96-1b09ba03c328",
      "name": "DuckDuckGo",
      "type": "n8n-nodes-duckduckgo-search.duckDuckGo",
      "position": [
        128,
        48
      ],
      "parameters": {
        "newsQuery": "={{ $json.search_themes }}",
        "operation": "searchNews",
        "cacheSettings": {
          "cacheTTL": 300,
          "enableCache": true
        },
        "proxySettings": {},
        "newsSearchOptions": {
          "region": "wt-wt",
          "maxResults": 100,
          "safeSearch": 0
        }
      },
      "typeVersion": 1
    },
    {
      "id": "f138753e-87a4-488f-b76c-0fca466b4402",
      "name": "Loop Over Items (Search)",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -32,
        -128
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "1c6dd5b2-5fde-4dd6-a0ce-9343a50dc51f",
      "name": "Split Out",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        -848,
        720
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "search_themes"
      },
      "typeVersion": 1
    },
    {
      "id": "5440ef06-7711-47cc-a758-24391be05585",
      "name": "Bluesky Search",
      "type": "n8n-nodes-bluesky-enhanced.bluesky",
      "position": [
        128,
        208
      ],
      "parameters": {
        "q": "={{ $json.search_themes }}",
        "limit": 10,
        "resource": "search",
        "operation": "searchPosts"
      },
      "credentials": {
        "blueskyApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "38c87790-9d0c-43eb-8f83-576bf2d5bd62",
      "name": "Edit Fields (Bluesky)",
      "type": "n8n-nodes-base.set",
      "position": [
        304,
        208
      ],
      "parameters": {
        "options": {
          "ignoreConversionErrors": true
        },
        "assignments": {
          "assignments": [
            {
              "id": "17a6bee3-c6f1-4e27-b170-31557516a29f",
              "name": "title",
              "type": "string",
              "value": "=Bluesky Search - {{ $json.author.displayName }} - {{ $json.embed.external.title }}"
            },
            {
              "id": "e0ee92e7-0dca-4b15-9570-4f0c599872b7",
              "name": "pubDate",
              "type": "string",
              "value": "={{ $json.indexedAt }}"
            },
            {
              "id": "f9f1da0c-79fe-4c59-9eca-9f058bf7128c",
              "name": "link",
              "type": "string",
              "value": "={{ $json.embed.external.uri }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "4fb13374-aa77-4d91-a1a3-c17259f4f515",
      "name": "Remove Elements with Empty Links",
      "type": "n8n-nodes-base.filter",
      "position": [
        480,
        240
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "30d4f694-9378-42b4-b1d5-cbc38fb3e7fe",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.link }}",
              "rightValue": "={{ $today.minus({ days: 0 }) }}"
            }
          ]
        }
      },
      "typeVersion": 2.2,
      "alwaysOutputData": true
    },
    {
      "id": "0a5c2591-6bca-4d42-9810-522c0457cc3a",
      "name": "Merge1",
      "type": "n8n-nodes-base.merge",
      "position": [
        704,
        256
      ],
      "parameters": {},
      "typeVersion": 3.2
    },
    {
      "id": "8c29882d-1613-4187-9bfc-f14e8a15bed2",
      "name": "Google_news search",
      "type": "n8n-nodes-serpapi.serpApi",
      "position": [
        240,
        864
      ],
      "parameters": {
        "q": "={{ $json.search_themes }}",
        "operation": "google_news",
        "requestOptions": {},
        "additionalFields": {}
      },
      "credentials": {
        "serpApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "eeb3a274-3690-4f26-94fd-99c6cc899d5e",
      "name": "Filter Fields for Loop",
      "type": "n8n-nodes-base.set",
      "position": [
        816,
        864
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "e2ffe594-180d-4e1d-b869-8056ac67015d",
              "name": "title",
              "type": "string",
              "value": "={{ $json.title }}"
            },
            {
              "id": "87c5a171-9ab9-4043-a72a-32aec218fe63",
              "name": "pubDate",
              "type": "string",
              "value": "={{ $json.date }}"
            },
            {
              "id": "978b05c9-6e6b-4a18-bc06-4de785b19413",
              "name": "link",
              "type": "string",
              "value": "={{ $json.link }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "283558c4-2779-4b3b-94b7-48f886a200cb",
      "name": "Split Out News Results",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        432,
        864
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "news_results"
      },
      "typeVersion": 1
    },
    {
      "id": "275508f1-ef16-40e3-a67f-5f568f65a5fa",
      "name": "Sticky Note27",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -496,
        512
      ],
      "parameters": {
        "color": 5,
        "width": 1580,
        "height": 720,
        "content": "## Search Queries with SerpAPI\n\nThis step utilizes the SerpAPI custom node to identify potential sources based on the specified search themes.\n\n***Observations***:\n- SerpAPI is configured to retrieve results from Google Search."
      },
      "typeVersion": 1
    },
    {
      "id": "3686c81a-a017-4f77-90a4-11c0b706bdeb",
      "name": "Schedule",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -2848,
        992
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                1,
                2,
                5,
                3,
                4
              ],
              "triggerAtHour": 12
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "3e18e79b-47f4-4fb4-8a73-a83243cb36ab",
      "name": "Sticky Note12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2016,
        -368
      ],
      "parameters": {
        "color": 7,
        "width": 1060,
        "height": 796,
        "content": "## Source Discovery - Automatically Search More Up-to-Date Information Sources\n\n\n\n**Version** : 1.0\n**Creator** : Hybroht\n**Website** : hybroht.com\n**Email**   : contact@hybroht.com\n\n\n\n\n\n\n**Description**: Are you tired of the tedious process of searching for new information sources? This workflow streamlines the task of discovering new sources of content that may be relevant to your inquiries.\n\n**How it Works**: The workflow searches for key terms across specific platforms to locate related URLs. It then cleans the data, checks against a list of known sources, verifies against a list of undesired sources, and performs a partial content check to assess relevance.\n\n**Use Cases**:\n\n- Resource Compilation for Academic and Educational Purposes\n- Journalism and Research\n- Content Marketing\n- Competitor Analysis\n\n\n**Requirements**:\n\n- The following custom nodes must be installed: SerpApi, Bluesky, and DuckDuckGo Search.\n- While the Global Variables Node is recommended, it is optional. You may use an Edit Fields (Set) Node as an alternative, named \"Configure Workflow Args (Manual)\" Node in this workflow.\n- Credentials are required for Bluesky Search and SerpApi. Although the GitHub Repo Search does not require credentials, it is recommended to avoid rate limits.\n\n\n**Observation:**\n\n- This is not a *Curator of News*. It is designed to find websites that are relevant and useful to your searches. If you are looking for relevant news, please check this [workflow](https://n8n.io/workflows/6157-multi-source-news-curator-with-mistral-ai-analysis-summaries-and-custom-channels/)."
      },
      "typeVersion": 1
    },
    {
      "id": "8e9216fd-ef99-454a-b51c-2f1907e387ec",
      "name": "Sticky Note30",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1200,
        -304
      ],
      "parameters": {
        "color": 7,
        "width": 150,
        "content": "![Hybroht](https://hybroht.com/assets/favicon.png \"Hybroht Logo\")"
      },
      "typeVersion": 1
    },
    {
      "id": "0897ce2a-b17a-4123-8a61-634ccd48731f",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        1728,
        768
      ],
      "parameters": {
        "numberInputs": 4
      },
      "typeVersion": 3.1
    },
    {
      "id": "75edbbce-fa43-49b8-b284-62e84c2b567d",
      "name": "Remove Duplicates",
      "type": "n8n-nodes-base.removeDuplicates",
      "position": [
        2240,
        784
      ],
      "parameters": {
        "compare": "allFieldsExcept",
        "options": {},
        "fieldsToExclude": "pubDate"
      },
      "typeVersion": 2
    },
    {
      "id": "5d35a167-b63f-4469-8cd9-47a4b5474525",
      "name": "Remove Empty",
      "type": "n8n-nodes-base.filter",
      "position": [
        2016,
        784
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "2df9ef75-ea55-4e5b-a78d-e37de85fe8ca",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.link }}",
              "rightValue": ""
            },
            {
              "id": "f74c0863-d9c3-465a-b6e9-f5616d25dec2",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.title }}",
              "rightValue": "^(?:\\s*\\S+\\s+){0,2}\\s*\\S+\\s*$"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "389bf473-c8a0-46b9-a63d-e3fd9544a9de",
      "name": "Remove Existing Content",
      "type": "n8n-nodes-base.filter",
      "position": [
        2720,
        784
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "30d4f694-9378-42b4-b1d5-cbc38fb3e7fe",
              "operator": {
                "type": "string",
                "operation": "notContains"
              },
              "leftValue": "={{ $('Configure Workflow Args (Prep)').item.json.existing_sources }}",
              "rightValue": "={{ $json.baseUrl }}"
            }
          ]
        },
        "looseTypeValidation": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "5a2b70aa-8e85-41e9-98b1-d075af479380",
      "name": "Get Base URL",
      "type": "n8n-nodes-base.code",
      "position": [
        2480,
        784
      ],
      "parameters": {
        "jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfunction getBaseUrl(url) {\n    const protocolEndIndex = url.indexOf(\"://\") + 3; // Find the end of the protocol\n    const pathStartIndex = url.indexOf(\"/\", protocolEndIndex); // Find the start of the path\n    return pathStartIndex === -1 ? url : url.substring(0, pathStartIndex); // Return base URL\n}\n\nfor (const item of $input.all()) {\n  const inputUrl = item.json.link;\n  const baseUrl = getBaseUrl(inputUrl);\n  item.json.baseUrl = baseUrl;\n}\n\nreturn $input.all();"
      },
      "typeVersion": 2
    },
    {
      "id": "290c077d-d5ff-40dd-9dae-8ad48a713d3d",
      "name": "Leave Remaining Sources",
      "type": "n8n-nodes-base.set",
      "notes": "If you don't want to use the Global Variables Node, you can use this one as a replacement.",
      "position": [
        2960,
        784
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "696da287-5535-4487-b69f-65d01bffeaa8",
              "name": "baseUrl",
              "type": "string",
              "value": "={{ $json.baseUrl }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "9cd4fa0d-493c-4b54-8467-e4ad05b31bab",
      "name": "Remove Duplicates Urls",
      "type": "n8n-nodes-base.removeDuplicates",
      "position": [
        3184,
        784
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 2
    },
    {
      "id": "029b2480-e2c7-4dd5-835e-6e7c65c9c4c9",
      "name": "Configure Workflow Args",
      "type": "n8n-nodes-globals.globalConstants",
      "notes": "This is useful to quickly setting variables for new workflow variants. Additionally:\n- It helps avoid leaving important information in a node when creating new templates to share.\n- Easier to add new variables.",
      "position": [
        -2608,
        992
      ],
      "parameters": {},
      "credentials": {
        "globalConstantsApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "a450289d-d558-4494-b356-6bd3a38f14d1",
      "name": "Edit Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        -2416,
        992
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "22f11d71-307d-4c6a-9594-7ffbfaac5ccb",
              "name": "rss_feeds",
              "type": "array",
              "value": "={{ $json.constants.rss_feeds }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "1ce72ec2-d1e6-485b-9e12-df1f68f73e81",
      "name": "Aggregate",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        -1584,
        992
      ],
      "parameters": {
        "options": {
          "mergeLists": false
        },
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "renameField": true,
              "outputFieldName": "existing_sources_to_add",
              "fieldToAggregate": "baseUrl"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "8845c095-5f3c-424b-8ff7-a7cd293d80a9",
      "name": "Get Base URL of Sources",
      "type": "n8n-nodes-base.code",
      "position": [
        -2016,
        992
      ],
      "parameters": {
        "jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfunction getBaseUrl(url) {\n    const protocolEndIndex = url.indexOf(\"://\") + 3; // Find the end of the protocol\n    const pathStartIndex = url.indexOf(\"/\", protocolEndIndex); // Find the start of the path\n    return pathStartIndex === -1 ? url : url.substring(0, pathStartIndex); // Return base URL\n}\n\nfor (const item of $input.all()) {\n  const inputUrl = item.json.link;\n  const baseUrl = getBaseUrl(inputUrl);\n  item.json.baseUrl = baseUrl;\n}\n\nreturn $input.all();"
      },
      "typeVersion": 2
    },
    {
      "id": "24d32321-760c-4ad3-b3eb-ab9cdc64f5c1",
      "name": "Split Out Feed List",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        -2224,
        992
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "rss_feeds"
      },
      "typeVersion": 1
    },
    {
      "id": "095564ab-1b05-42d7-9de7-d912b10a9894",
      "name": "Remove Duplicates Sources",
      "type": "n8n-nodes-base.removeDuplicates",
      "position": [
        -1792,
        992
      ],
      "parameters": {
        "compare": "selectedFields",
        "options": {},
        "fieldsToCompare": "baseUrl"
      },
      "typeVersion": 2
    },
    {
      "id": "917060f7-0fbd-490e-bfbd-1194161e924d",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -1680,
        576
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "29b46bc4-0a18-4e7a-99c3-3fdf5a3fde7c",
      "name": "Configure Workflow Args (Prep)",
      "type": "n8n-nodes-base.set",
      "notes": "If you don't want to use the Global Variables Node, you can use this one as a replacement.",
      "position": [
        -1072,
        720
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "696da287-5535-4487-b69f-65d01bffeaa8",
              "name": "search_themes",
              "type": "array",
              "value": "={{ $json.search_themes }}"
            },
            {
              "id": "f72affa2-1b85-4207-b245-fee0e47cd526",
              "name": "existing_sources",
              "type": "array",
              "value": "={{ $json.existing_sources }}"
            },
            {
              "id": "94eb38bc-2861-4292-96cd-e40c2661c501",
              "name": "sources_to_ignore",
              "type": "array",
              "value": "={{ $json.sources_to_ignore }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "fa48b9d1-79af-4fc8-b7e3-d9654f03e4c3",
      "name": "Configure Workflow Args (Manual)",
      "type": "n8n-nodes-base.set",
      "notes": "If you don't want to use the Global Variables Node, you can use this one as a replacement.",
      "position": [
        -1424,
        576
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "696da287-5535-4487-b69f-65d01bffeaa8",
              "name": "search_themes",
              "type": "array",
              "value": "=[\n\"technology\"\n]"
            },
            {
              "id": "f72affa2-1b85-4207-b245-fee0e47cd526",
              "name": "existing_sources",
              "type": "array",
              "value": "=[]"
            },
            {
              "id": "0867ad11-9a76-4398-a582-455c1ddf92b2",
              "name": "sources_to_ignore",
              "type": "array",
              "value": "[]"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "122a5da7-bdf6-4473-8e18-31fb7dbc82df",
      "name": "Add Other Fields",
      "type": "n8n-nodes-base.set",
      "notes": "If you don't want to use the Global Variables Node, you can use this one as a replacement.",
      "position": [
        -1360,
        992
      ],
      "parameters": {
        "options": {
          "ignoreConversionErrors": false
        },
        "assignments": {
          "assignments": [
            {
              "id": "696da287-5535-4487-b69f-65d01bffeaa8",
              "name": "search_themes",
              "type": "array",
              "value": "={{ $('Configure Workflow Args').item.json.constants.search_themes }}"
            },
            {
              "id": "f72affa2-1b85-4207-b245-fee0e47cd526",
              "name": "existing_sources",
              "type": "array",
              "value": "={{ $json.existing_sources_to_add.concat($('Configure Workflow Args').item.json.constants.existing_sources || []) }}"
            },
            {
              "id": "002f4fbe-810f-4384-9552-3a5eaac39ce1",
              "name": "sources_to_ignore",
              "type": "array",
              "value": "={{ $('Configure Workflow Args').item.json.constants.sources_to_ignore  || []  }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "1b3d4954-d6f3-426a-8c69-6561d711b3ad",
      "name": "HTTP Request",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -448,
        2256
      ],
      "parameters": {
        "url": "https://api.github.com/search/repositories",
        "options": {
          "response": {
            "response": {
              "fullResponse": true
            }
          },
          "pagination": {
            "pagination": {
              "parameters": {
                "parameters": [
                  {
                    "name": "q",
                    "value": "=awesome links for {{ $json.search_themes }}"
                  },
                  {
                    "name": "per_page",
                    "value": "10"
                  },
                  {
                    "name": "page",
                    "value": "0"
                  }
                ]
              },
              "maxRequests": 1,
              "requestInterval": 1000,
              "limitPagesFetched": true
            }
          }
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "8cf3f2e7-44e6-4362-ae80-434c95d7b83c",
      "name": "Grab READMEs",
      "type": "n8n-nodes-base.httpRequest",
      "onError": "continueRegularOutput",
      "position": [
        272,
        2256
      ],
      "parameters": {
        "url": "={{ $json.body.download_url }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "6a4c9a07-ab2b-4e30-a97b-c1b7a7d75e15",
      "name": "Split Out Repo List",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        -256,
        2480
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "body.items"
      },
      "typeVersion": 1
    },
    {
      "id": "785dc6c0-8c80-49a4-a5a3-024db6b4a52d",
      "name": "HTTP Request the READMEs",
      "type": "n8n-nodes-base.httpRequest",
      "onError": "continueRegularOutput",
      "position": [
        80,
        2464
      ],
      "parameters": {
        "url": "={{ $json.readme_url }}",
        "options": {
          "timeout": 10000,
          "response": {
            "response": {
              "fullResponse": true
            }
          }
        }
      },
      "typeVersion": 4.2,
      "alwaysOutputData": false
    },
    {
      "id": "34cc92b1-32f1-499f-92bb-6c27c3fd08cc",
      "name": "Add README field",
      "type": "n8n-nodes-base.set",
      "notes": "If you don't want to use the Global Variables Node, you can use this one as a replacement.",
      "position": [
        -80,
        2256
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "eeb1567e-1d5b-4939-bdf6-7470bac068e0",
              "name": "readme_url",
              "type": "string",
              "value": "={{ $json.url }}/readme"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "5e849da5-3c8b-4922-803e-679eea498f58",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -528,
        2032
      ],
      "parameters": {
        "color": 5,
        "width": 1996,
        "height": 720,
        "content": "## Search Queries with Github (Repos with Links)\n\nThis step utilizes GitHub repositories to identify potential sources based on the specified search themes. Many repositories aggregate useful websites and list them in their READMEs, and we will leverage this pattern to our benefit. This workflow allows for quick checks of these links.\n\n***Observations***\nWhile credentials are not required, they are highly recommended. Without them, you will be subject to a strict rate limit."
      },
      "typeVersion": 1
    },
    {
      "id": "5f29ba9d-b1ee-439d-91ad-c7ce7da11731",
      "name": "Remove Ignored Sources",
      "type": "n8n-nodes-base.filter",
      "position": [
        3408,
        784
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "30d4f694-9378-42b4-b1d5-cbc38fb3e7fe",
              "operator": {
                "type": "string",
                "operation": "notContains"
              },
              "leftValue": "={{ $('Configure Workflow Args (Prep)').item.json.sources_to_ignore }}",
              "rightValue": "={{ $json.baseUrl }}"
            }
          ]
        },
        "looseTypeValidation": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "be4e1de2-c8e3-4565-a6a1-355617aa9705",
      "name": "Get list of Subreddits",
      "type": "n8n-nodes-base.reddit",
      "position": [
        -432,
        1488
      ],
      "parameters": {
        "limit": 1,
        "filters": {
          "keyword": "={{ $json.search_themes }}",
          "trending": false
        },
        "resource": "subreddit",
        "operation": "getAll"
      },
      "typeVersion": 1
    },
    {
      "id": "fa4271b2-8117-470b-bc4a-34f2deaecebb",
      "name": "RSS Read",
      "type": "n8n-nodes-base.rssFeedRead",
      "onError": "continueErrorOutput",
      "position": [
        -16,
        1648
      ],
      "parameters": {
        "url": "={{ $json.reddit_rss }}",
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "48a46aef-477c-42c4-862b-90bec4c738f4",
      "name": "Prepare Reddit RSS",
      "type": "n8n-nodes-base.set",
      "notes": "If you don't want to use the Global Variables Node, you can use this one as a replacement.",
      "position": [
        -224,
        1648
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "eeb1567e-1d5b-4939-bdf6-7470bac068e0",
              "name": "reddit_rss",
              "type": "string",
              "value": "=https://www.reddit.com/r/{{ $json.name }}/.rss"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "af47dcec-2aa6-4af5-8bcb-a8e3d99f4c42",
      "name": "Grab Links from Threads",
      "type": "n8n-nodes-base.code",
      "position": [
        160,
        1520
      ],
      "parameters": {
        "jsCode": "function extractLinks(text) {\n    const urlPattern = /https?:\\/\\/[^\\s\"'>]+/g; // Regular expression to match URLs\n    return text.match(urlPattern) || []; // Return an array of matched URLs or an empty array\n}\n\n// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfor (const item of $input.all()) {\n  const inputString = item.json.content;\n  const links = extractLinks(inputString);\n  item.json.sources = links;\n}\n\nreturn $input.all();"
      },
      "typeVersion": 2
    },
    {
      "id": "cefb0d33-79fe-4275-8e0d-d96da2b1c82d",
      "name": "Get Base URL of Reddit Sources",
      "type": "n8n-nodes-base.code",
      "position": [
        528,
        1520
      ],
      "parameters": {
        "jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfunction getBaseUrl(url) {\n    const protocolEndIndex = url.indexOf(\"://\") + 3; // Find the end of the protocol\n    const pathStartIndex = url.indexOf(\"/\", protocolEndIndex); // Find the start of the path\n    return pathStartIndex === -1 ? url : url.substring(0, pathStartIndex); // Return base URL\n}\n\nfor (const item of $input.all()) {\n  const inputUrl = item.json.sources;\n  const baseUrl = getBaseUrl(inputUrl);\n  item.json.baseUrl = baseUrl;\n}\n\nreturn $input.all();"
      },
      "typeVersion": 2
    },
    {
      "id": "a22a8928-c9a6-47b0-88ba-602f3847008e",
      "name": "Remove Duplicates Reddit Sources",
      "type": "n8n-nodes-base.removeDuplicates",
      "position": [
        720,
        1520
      ],
      "parameters": {
        "compare": "selectedFields",
        "options": {},
        "fieldsToCompare": "baseUrl"
      },
      "typeVersion": 2
    },
    {
      "id": "c4c16192-2b42-446e-b2d4-0dbb6884c880",
      "name": "Prepare Reddit Source Results",
      "type": "n8n-nodes-base.set",
      "notes": "If you don't want to use the Global Variables Node, you can use this one as a replacement.",
      "position": [
        944,
        1360
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "eeb1567e-1d5b-4939-bdf6-7470bac068e0",
              "name": "title",
              "type": "string",
              "value": "={{ $json.sources }}"
            },
            {
              "id": "c7fa4b82-1c6c-4175-a95a-fb7331dc0ed3",
              "name": "pubDate",
              "type": "string",
              "value": "={{ $today }}"
            },
            {
              "id": "34d8eb5d-01d0-477c-bda0-8bd63dd262ec",
              "name": "link",
              "type": "string",
              "value": "={{ $json.baseUrl }}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "0fe69cac-6370-49fa-a33c-2caa51977495",
      "name": "Sticky Note28",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -496,
        1264
      ],
      "parameters": {
        "color": 5,
        "width": 1580,
        "height": 720,
        "content": "## Search Queries with Reddit\n\nThis step leverages RSS feeds from subreddits to identify potential sources relevant to the specified search themes.\n\n***Observations***:\n- Only the first subreddit returned will be considered, and the links mentioned in its posts will be treated as potential sources.\n- If this step encounters a 403 error, the workflow will continue by ignoring this substep."
      },
      "typeVersion": 1
    },
    {
      "id": "5e0beb0f-120d-41f8-9eb2-83fc49a2f68a",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1600,
        400
      ],
      "parameters": {
        "color": 5,
        "width": 2000,
        "height": 816,
        "content": "## Filtering Step for Existing and Undesired Sources\n\nYou likely have a few sources that you know and trust, as well as some that you may want to exclude. By adding them to the lists of known sources, this step will filter them out before they are sent for AI evaluation.\n\n**Get Base URL** extracts the main website URL portion from the provided links. We aim for general website links rather than specific URLs, which is especially useful for identifying potential duplicates.\n\n**Remove Existing Content** and **Remove Ignored Souces** are the primary filtering steps. These will compare the obtained URLs with those in the lists you provided, ensuring that any matches are removed."
      },
      "typeVersion": 1
    },
    {
      "id": "947716d4-6731-42ae-b1f5-79caf1a2f34d",
      "name": "Mistral Cloud Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatMistralCloud",
      "position": [
        4448,
        1056
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "mistralCloudApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "c3677e5d-5e14-47c6-96f0-f496787ed0d1",
      "name": "Limit",
      "type": "n8n-nodes-base.limit",
      "position": [
        3744,
        784
      ],
      "parameters": {
        "maxItems": 36
      },
      "typeVersion": 1
    },
    {
      "id": "ccbc3f13-20a9-465c-97a4-e607a80049de",
      "name": "HTTP Request to get URL Content",
      "type": "n8n-nodes-base.httpRequest",
      "onError": "continueRegularOutput",
      "position": [
        3968,
        784
      ],
      "parameters": {
        "url": "={{ $json.baseUrl }}",
        "options": {
          "timeout": 2100
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "21479b32-a984-48cc-93ae-301667edff76",
      "name": "Remove Errors",
      "type": "n8n-nodes-base.filter",
      "position": [
        464,
        2448
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "30d4f694-9378-42b4-b1d5-cbc38fb3e7fe",
              "operator": {
                "type": "string",
                "operation": "notExists",
                "singleValue": true
              },
              "leftValue": "={{ $json.error }}",
              "rightValue": "={{ $json.baseUrl }}"
            }
          ]
        },
        "looseTypeValidation": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "f837603e-a1d6-4785-9a22-1ab9f3a64721",
      "name": "Grab Links from README",
      "type": "n8n-nodes-base.code",
      "position": [
        656,
        2256
      ],
      "parameters": {
        "jsCode": "function extractLinks(text) {\n    const urlPattern = /https?:\\/\\/[^\\s\"'>)(]+/g; // Regular expression to match URLs\n    return text.match(urlPattern) || []; // Return an array of matched URLs or an empty array\n}\n\n// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfor (const item of $input.all()) {\n  const inputString = item.json.data;\n  const links = extractLinks(inputString);\n  item.json.sources = links;\n}\n\nreturn $input.all();"
      },
      "typeVersion": 2
    },
    {
      "id": "b17bdf65-36cb-4df3-802e-7af4e2316e6c",
      "name": "Split Out Sources",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        352,
        1520
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "sources"
      },
      "typeVersion": 1
    },
    {
      "id": "45b44c9a-e28b-42d6-a1b6-6cb34461408c",
      "name": "Split Out Github Sources",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        848,
        2448
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "sources"
      },
      "typeVersion": 1
    },
    {
      "id": "9f31d625-6952-4bfc-8e9f-3a014ddb7dce",
      "name": "Get Base URL of Github Sources",
      "type": "n8n-nodes-base.code",
      "position": [
        1040,
        2256
      ],
      "parameters": {
        "jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfunction getBaseUrl(url) {\n    const protocolEndIndex = url.indexOf(\"://\") + 3; // Find the end of the protocol\n    const pathStartIndex = url.indexOf(\"/\", protocolEndIndex); // Find the start of the path\n    return pathStartIndex === -1 ? url : url.substring(0, pathStartIndex); // Return base URL\n}\n\nfor (const item of $input.all()) {\n  const inputUrl = item.json.sources;\n  const baseUrl = getBaseUrl(inputUrl);\n  item.json.baseUrl = baseUrl;\n}\n\nreturn $input.all();"
      },
      "typeVersion": 2
    },
    {
      "id": "38a532cf-c6ae-4294-9f44-67c9bc90db0d",
      "name": "Prepare Github Source Results",
      "type": "n8n-nodes-base.set",
      "notes": "If you don't want to use the Global Variables Node, you can use this one as a replacement.",
      "position": [
        1264,
        2144
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "eeb1567e-1d5b-4939-bdf6-7470bac068e0",
              "name": "title",
              "type": "string",
              "value": "={{ $json.sources }}"
            },
            {
              "id": "c7fa4b82-1c6c-4175-a95a-fb7331dc0ed3",
              "name": "pubDate",
              "type": "string",
              "value": "={{ $today }}"
            },
            {
              "id": "34d8eb5d-01d0-477c-bda0-8bd63dd262ec",
              "name": "link",
              "type": "string",
              "value": "={{ $json.baseUrl }}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "cac06128-2f90-4999-b87e-f936412f229b",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3664,
        464
      ],
      "parameters": {
        "width": 1168,
        "height": 752,
        "content": "## Final Step: Source Selection\n\nIn this step, we will send the website content to an information extractor, which will evaluate the relevance and recency of the content concerning the specified search themes. While you can directly utilize the results, this step serves primarily to assist you in making informed decisions during your selection of the best sources. We recommend reviewing the results from the Information Extractor, as there may be valuable sources that it misclassifies as irrelevant, depending on your LLM model.\n\n***Observations:***\n- A limit node has been implemented to mitigate the risk of checking an excessive number of sources. You can adjust this limit if desired.\n- Additionally, a Code node has been included to restrict the GET content due to context window limitations.\n- This step is auxiliary in nature and may be prone to errors, such as the website blocking the GET method."
      },
      "typeVersion": 1
    },
    {
      "id": "9101a285-bf16-48ea-828e-1bae09adc92f",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2912,
        480
      ],
      "parameters": {
        "color": 4,
        "width": 2256,
        "height": 720,
        "content": "## Setup and Start\n\n**Execute workflow** is a manual alternative method for using the workflow without the Global Variables Node.\n\n**Schedule** is the standard method for operation. It will verify the credentials stored in the Global Variables Node for all necessary arguments."
      },
      "typeVersion": 1
    },
    {
      "id": "fc39ad99-56cf-4b2d-a7e4-bdcc858f1dfa",
      "name": "Information Extractor",
      "type": "@n8n/n8n-nodes-langchain.informationExtractor",
      "onError": "continueErrorOutput",
      "position": [
        4448,
        784
      ],
      "parameters": {
        "text": "=Check this link: {{ $('Limit').item.json.baseUrl }}.\nCheck its content: \"\"\"{{ $json.data }}\"\"\"\n\nFollow the provided JSON schema for your response.",
        "options": {
          "systemPromptTemplate": "You are an expert extraction algorithm.\nOnly extract relevant information from the text.\nIf you do not know the value of an attribute asked to extract, you may omit the attribute's value."
        },
        "schemaType": "manual",
        "inputSchema": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"data\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"url\": {\n              \"type\": \"string\",\n              \"description\": \"The link to the website.\"\n          },\n          \"relevance\": {\n              \"type\": \"boolean\",\n              \"description\": \"If the website content is relevant or not.\"\n          },\n          \"updated\": {\n              \"type\": \"string\",\n              \"description\": \"How recent are the updates in the website content.\"\n          },\n          \"accessible\": {\n              \"type\": \"boolean\",\n              \"description\": \"If it was possible to access the website content through the tool.\"\n          }\n        },\n        \"required\": [\"url\", \"relevance\", \"updated\", \"accessible\"],\n        \"additionalProperties\": false\n      }\n    }\n  },\n  \"required\": [\"data\"],\n  \"additionalProperties\": false\n}"
      },
      "typeVersion": 1.2
    },
    {
      "id": "be2fae8c-8636-4afe-b874-73b4396cb1c0",
      "name": "Sticky Note38",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2656,
        672
      ],
      "parameters": {
        "color": 7,
        "width": 736,
        "height": 260,
        "content": "**Configure Workflow Args**:\n\n- search_themes: Utilized by this workflow to identify sources relevant to the specified themes.\n\n- existing_sources: Employed by this workflow to filter out sources that are already known.\n\n- sources_to_ignore: Used by this workflow to exclude undesired sources.\n\n- rss_feeds: Applicable only in the Global Variables Node. This list can supplement the existing_sources list."
      },
      "typeVersion": 1
    },
    {
      "id": "e1498796-014a-4cad-9d65-01e643b30332",
      "name": "Sticky Note32",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2432,
        -368
      ],
      "parameters": {
        "color": 7,
        "width": 400,
        "height": 796,
        "content": "### Information - n8n setup Used\n\n\n\n\n- n8n Version\n1.105.3\n\n- n8n-nodes-serpapi\n0.1.6\n\n- n8n-nodes-bluesky-enhanced\n1.6.0\n\n- n8n-nodes-duckduckgo-search\n30.0.4\n\n- n8n-nodes-globals\n1.1.0\n\n- Running n8n via:\nPodman 4.3.1\n\n- Operating system:\nLinux\n\n- LLM Model:\nmistral-small-latest (API)\n\n\n\n\n- Date:\n2025-08-06\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "cb82e1aa-c564-4083-8ad5-c5b0d6abbaf5",
      "name": "Loop Over Items (Search) 2",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -144,
        736
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "d54066cf-ddd5-4982-a19c-50e99ae306d2",
      "name": "Remove Elements with Empty Links 2",
      "type": "n8n-nodes-base.filter",
      "notes": "This is happening to SerpAPI results for some reason.",
      "position": [
        624,
        864
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "30d4f694-9378-42b4-b1d5-cbc38fb3e7fe",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.link }}",
              "rightValue": "={{ $today.minus({ days: 0 }) }}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "300f2a46-8da8-4a9b-b8e6-68ff173cbcd3",
      "name": "Code (Limiting number of Chars)",
      "type": "n8n-nodes-base.code",
      "position": [
        4208,
        784
      ],
      "parameters": {
        "jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfor (const item of $input.all()) {\n  // Check if item.json.data exists and is a string\n  if (item.json.data && typeof item.json.data === 'string') {\n    item.json.data = item.json.data.substring(0, 1500);\n  } else {\n    // Optionally, you can set a default value or handle the case where data is undefined\n    item.json.data = ''; // or any default value you prefer\n  }\n}\n\nreturn $input.all();"
      },
      "typeVersion": 2
    },
    {
      "id": "dc195b6c-65f6-4c32-9ccb-63562b8312a0",
      "name": "Sticky Note31",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2112,
        1424
      ],
      "parameters": {
        "color": 3,
        "width": 680,
        "height": 528,
        "content": "## Workflow Args Example\n\n```json\n{\n      \"search_themes\": [\n        \"technology\",\n        \"scientific research\"\n      ],\n      \"existing_sources\": [\n        \"https://usefulinformation1.com\",\n        \"https://usefulinformation2.com\"\n      ],\n      \"sources_to_ignore\": [\n        \"https://falseinformation1.com\",\n        \"https://falseinformation2.com\"\n      ],\n      \"rss_feeds\": [\n        {\n          \"link\": \"link_to_feed_1\",\n          \"needs_content_search\": true\n        },\n        {\n          \"link\": \"link_to_feed_2\",\n          \"needs_content_search\": false\n        },\n      ]\n}\n```"
      },
      "typeVersion": 1
    },
    {
      "id": "79dd95d9-7890-4aa5-b1d6-2ae8294fb391",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1120,
        112
      ],
      "parameters": {
        "color": 7,
        "width": 440,
        "height": 344,
        "content": "### Notes\n\n\n- The loops enable better control over the searches.\n\n\n- More advanced methods for discovering new sources could include checking for newly registered websites. We may consider adding this functionality to the workflow in the future."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "5932dc5c-2b85-401d-9e79-c8311414d0b1",
  "connections": {
    "Limit": {
      "main": [
        [
          {
            "node": "HTTP Request to get URL Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Remove Empty",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge1": {
      "main": [
        [
          {
            "node": "Loop Over Items (Search)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "RSS Read": {
      "main": [
        [
          {
            "node": "Grab Links from Threads",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule": {
      "main": [
        [
          {
            "node": "Configure Workflow Args",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate": {
      "main": [
        [
          {
            "node": "Add Other Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out": {
      "main": [
        [
          {
            "node": "Loop Over Items (Search)",
            "type": "main",
            "index": 0
          },
          {
            "node": "Loop Over Items (Search) 2",
            "type": "main",
            "index": 0
          },
          {
            "node": "Get list of Subreddits",
            "type": "main",
            "index": 0
          },
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "DuckDuckGo": {
      "main": [
        [
          {
            "node": "Filter Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "Split Out Feed List",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Base URL": {
      "main": [
        [
          {
            "node": "Remove Existing Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Grab READMEs": {
      "main": [
        [
          {
            "node": "Remove Errors",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "Split Out Repo List",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Remove Empty": {
      "main": [
        [
          {
            "node": "Remove Duplicates",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Fields": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Remove Errors": {
      "main": [
        [
          {
            "node": "Grab Links from README",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Bluesky Search": {
      "main": [
        [
          {
            "node": "Edit Fields (Bluesky)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add Other Fields": {
      "main": [
        [
          {
            "node": "Configure Workflow Args (Prep)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add README field": {
      "main": [
        [
          {
            "node": "HTTP Request the READMEs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Remove Duplicates": {
      "main": [
        [
          {
            "node": "Get Base URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out Sources": {
      "main": [
        [
          {
            "node": "Get Base URL of Reddit Sources",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google_news search": {
      "main": [
        [
          {
            "node": "Split Out News Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Reddit RSS": {
      "main": [
        [
          {
            "node": "RSS Read",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out Feed List": {
      "main": [
        [
          {
            "node": "Get Base URL of Sources",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out Repo List": {
      "main": [
        [
          {
            "node": "Add README field",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields (Bluesky)": {
      "main": [
        [
          {
            "node": "Remove Elements with Empty Links",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Fields for Loop": {
      "main": [
        [
          {
            "node": "Loop Over Items (Search) 2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get list of Subreddits": {
      "main": [
        [
          {
            "node": "Prepare Reddit RSS",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Grab Links from README": {
      "main": [
        [
          {
            "node": "Split Out Github Sources",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Remove Duplicates Urls": {
      "main": [
        [
          {
            "node": "Remove Ignored Sources",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Remove Ignored Sources": {
      "main": [
        [
          {
            "node": "Limit",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out News Results": {
      "main": [
        [
          {
            "node": "Remove Elements with Empty Links 2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Configure Workflow Args": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Base URL of Sources": {
      "main": [
        [
          {
            "node": "Remove Duplicates Sources",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Grab Links from Threads": {
      "main": [
        [
          {
            "node": "Split Out Sources",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Leave Remaining Sources": {
      "main": [
        [
          {
            "node": "Remove Duplicates Urls",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Remove Existing Content": {
      "main": [
        [
          {
            "node": "Leave Remaining Sources",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request the READMEs": {
      "main": [
        [
          {
            "node": "Grab READMEs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items (Search)": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "DuckDuckGo",
            "type": "main",
            "index": 0
          },
          {
            "node": "Bluesky Search",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Mistral Cloud Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Information Extractor",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Split Out Github Sources": {
      "main": [
        [
          {
            "node": "Get Base URL of Github Sources",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Remove Duplicates Sources": {
      "main": [
        [
          {
            "node": "Aggregate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items (Search) 2": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ],
        [
          {
            "node": "Google_news search",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Github Source Results": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 3
          }
        ]
      ]
    },
    "Prepare Reddit Source Results": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Configure Workflow Args (Prep)": {
      "main": [
        [
          {
            "node": "Split Out",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Base URL of Github Sources": {
      "main": [
        [
          {
            "node": "Prepare Github Source Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Base URL of Reddit Sources": {
      "main": [
        [
          {
            "node": "Remove Duplicates Reddit Sources",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code (Limiting number of Chars)": {
      "main": [
        [
          {
            "node": "Information Extractor",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request to get URL Content": {
      "main": [
        [
          {
            "node": "Code (Limiting number of Chars)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Configure Workflow Args (Manual)": {
      "main": [
        [
          {
            "node": "Configure Workflow Args (Prep)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Remove Duplicates Reddit Sources": {
      "main": [
        [
          {
            "node": "Prepare Reddit Source Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Remove Elements with Empty Links": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Remove Elements with Empty Links 2": {
      "main": [
        [
          {
            "node": "Filter Fields for Loop",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Configure Workflow Args

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

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

About this workflow

Version : 1.0

Source: https://n8n.io/workflows/7074/ — 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

Using Mistral API, you can use this n8n workflow to automate the process of: collecting, filtering, analyzing, and summarizing news articles from multiple sources. The sources come from pre-built RSS

RSS Feed Read, Lm Chat Mistral Cloud, Agent +3
AI & RAG

This n8n template monitors specified GitHub repositories. When a new release is published, it automatically fetches the information, uses AI (Google Gemini by default) to summarize and translate it in

Slack, Information Extractor, Google Gemini Chat +2
AI & RAG

This workflow helps you monitor domain expiration dates and send automated reminders via Telegram when a domain is about to expire or has already expired, using WHOIS data and AI-powered information e

Google Sheets, Telegram, Ollama Chat +2
AI & RAG

Version : 1.0

Information Extractor, Model Selector, Lm Chat Mistral Cloud +5
AI & RAG

Who is this for? Event organizers, conference planners, and marketing teams fighting registration drop-off who want 4-field forms with LinkedIn-level attendee intelligence. What problem is this workfl

Data Table, HubSpot, Email Send +4