{
  "id": "h4WpFeL0h9sTncuh",
  "name": "Automated Industry Trend Scraper & Outline Creator",
  "tags": [],
  "nodes": [
    {
      "id": "9b77ff1c-97de-4e2e-8db2-8f9ce1fab2d1",
      "name": "Structured Output",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -480,
        448
      ],
      "parameters": {
        "autoFix": true,
        "jsonSchemaExample": "[\n  {\n    \"header\": \"---\",\n    \"body\": \"---\"\n  },\n  {\n    \"header\": \"---\",\n    \"body\": \"---\"\n  }\n]"
      },
      "typeVersion": 1.3
    },
    {
      "id": "7dca1ae1-667f-497b-9e2a-e5879564b6eb",
      "name": "OpenRouter",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        -624,
        448
      ],
      "parameters": {
        "model": "anthropic/claude-sonnet-4.5",
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "316a1bba-f2af-4910-a556-7f2665dd3316",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        640,
        240
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "30b52f1e-4bc2-409a-b55b-7c0bd5062e0d",
      "name": "Analyzer & Script writer",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -624,
        256
      ],
      "parameters": {
        "text": "={{ $json.output.string }}",
        "options": {
          "systemMessage": "You are an advanced Content Intelligence Engine. You specialize in analyzing raw JSON feeds of Medium articles, filtering out noise, identifying duplicates, and restructuring the data into a high-signal digest.\n\nInput Data: You will receive a standard JSON string representing an array of article objects. Each object contains title, author, and summary.\n\nWorkflow & Logic:\n\n1. Data Cleaning & De-Duplication\n\nIdentify Duplicates: Scan for articles with identical or near-identical titles. Merge them into a single entry.\n\nSpam Detection: Aggressively identify low-value content.\n\nKeywords to flag: \"Invitation Code\", \"Discount\", \"VPN\", \"Cheap\", \"Save Money\", repetitive tool promotion.\n\nAction: Discard these entirely or relegate them to a final \"Low Signal\" bucket. Do not mix them with high-quality insights.\n\n2. Synthesis & Categorization Analyze the high-quality articles and assign them to one of these buckets:\n\n\ud83d\udc8e Must Reads: The top 3 most intellectually significant or viral stories.\n\n\ud83e\udd16 The AI Paradigm: AI's impact on work, society, and specific models (LLMs, Transformers).\n\n\ud83d\udcbb Engineering & Code: Technical tutorials, language wars, architecture, and dev careers.\n\n\ud83d\udcb0 Wealth & Markets: Finance, crypto, stock market.\n\n\ud83c\udfa8 Design & Culture: UX/UI, media, and personal essays.\n\n3. Output Formatting Rules (STRICT) You must output the final result as a single JSON Array containing objects.\n\nSchema: Every object must strictly use only the keys \"header\" and \"body\".\n\nConstraint - No Newlines (\\n): You are strictly forbidden from using newline characters inside any value. If you need to separate thoughts, list items, or articles, you must create a new object in the array.\n\nConstraint - Granularity: Do not group multiple articles into a single string. Each article must be its own independent object in the JSON array.\n\n4. Required Output Structure:\n\nItem 1: The Digest Overview (Mandatory First Object)\n\nThe very first object in the array must be the cover of the digest.\n\n\"header\": A creative title for the entire feed (e.g., \"Daily Tech Digest: [Current Date]\").\n\n\"body\": A 2-3 sentence executive summary of the entire collection of articles (e.g., \"Today's feed is dominated by the release of GPT-5 and skepticism regarding the crypto market...\").\n\nItem 2+: Category Sections\n\nCategory Header: When starting a new category, create an object with the Category Name in the \"header\" and a brief 1-sentence intro in the \"body\".\n\nArticle Items: For every article within that category, create a separate object.\n\n\"header\": Leave empty \"\" (unless it is a sub-section title).\n\n\"body\": Format as: \"Title\" by Author. [Punchy, rewritten summary].\"\n\nExample of Desired Output Format:\n\n\n[\n  {\n    \"header\": \"Daily Content Digest: October 24, 2025\",\n    \"body\": \"Today's feed highlights a major shift in AI architecture debates and a controversial take on the German developer market. Spam levels are low, with high engagement in engineering tutorials.\"\n  },\n  {\n    \"header\": \"\ud83d\udc8e Top 3 Must-Reads\",\n    \"body\": \"Our algorithm selected these stories based on intellectual significance and viral potential.\"\n  },\n  {\n    \"header\": \"\",\n    \"body\": \"1. 'The Lie At The Heart Of The AI Revolution' by Will Lockett. A critical look at the 'nuclear age' comparison in AI narratives.\"\n  },\n  {\n    \"header\": \"\",\n    \"body\": \"2. 'Programming In Germany Is Dead' by Jan Kammerath. A viral, controversial autopsy of the German developer market.\"\n  },\n  {\n    \"header\": \"\ud83e\udd16 The AI Paradigm\",\n    \"body\": \"Several authors are questioning the actual utility versus the hype.\"\n  },\n  {\n    \"header\": \"\",\n    \"body\": \"'Why AI Gives Wrong Answers' by Sarah J. A practical guide to hallucination in 2025.\"\n  },\n  {\n    \"header\": \"\",\n    \"body\": \"'Transformers Are Dead' by Google Research. Google's new architecture might finally replace the transformer model.\"\n  },\n  {\n    \"header\": \"\ud83d\udcbb Engineering & Code\",\n    \"body\": \"Technical deep dives and framework updates.\"\n  },\n  {\n    \"header\": \"\",\n    \"body\": \"'Rails 8.1 Just Dropped' by DHH. A look at the developer-first upgrades in the new release.\"\n  }\n]"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3
    },
    {
      "id": "6a521c5f-f533-4046-83fe-170b1aa73619",
      "name": "Add Spacer",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        1200,
        -160
      ],
      "parameters": {
        "simple": false,
        "actionsUi": {
          "actionFields": [
            {
              "text": "=\n",
              "action": "insert"
            }
          ]
        },
        "operation": "update",
        "documentURL": "={{ $('Create a Document for Outlines').first().json.id }}"
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "c61ed05e-a466-4d55-bad6-d00dd8ecfc1a",
      "name": "Add Header & Body",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        1472,
        -160
      ],
      "parameters": {
        "simple": false,
        "actionsUi": {
          "actionFields": [
            {
              "text": "={{ $json.header }}\n",
              "action": "insert"
            },
            {
              "text": "={{ $json.body }}",
              "action": "insert"
            }
          ]
        },
        "operation": "update",
        "documentURL": "={{ $('Create a Document for Outlines').first().json.id }}\n"
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "2d1bab1f-6ffa-43e8-bd08-7915560b295f",
      "name": "Add Body",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        1472,
        32
      ],
      "parameters": {
        "simple": false,
        "actionsUi": {
          "actionFields": [
            {
              "text": "={{ $json.body }}",
              "action": "insert"
            }
          ]
        },
        "operation": "update",
        "documentURL": "={{ $('Create a Document for Outlines').first().json.id }}"
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "55dedd48-0617-4789-bda9-6fad19c07d81",
      "name": "Documentation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1904,
        -320
      ],
      "parameters": {
        "width": 420,
        "height": 444,
        "content": "## \u26a1 Workflow Overview & Setup\n\n**Summary:** This automation periodically scrapes Medium for industry trends, uses AI to filter spam and categorize insights, and compiles a formatted digest into a Google Doc.\n\n### Requirements\n* **Credentials:** BrowserAct, OpenRouter (Claude), Google Docs, Slack.\n* **Mandatory:** BrowserAct API (Template: **Automated Industry Trend Scraper & Outline Creator**)\n\n### How to Use\n1. **Credentials:** Configure all required credentials in the n8n settings.\n2. **BrowserAct Template:** Ensure you have the **Automated Industry Trend Scraper & Outline Creator** template saved in your BrowserAct account.\n3. **Configuration:** Update the **Target Page** node to point to the specific Medium tag or archive you wish to analyze.\n\n### Need Help?\n[How to Find Your BrowserAct API Key & Workflow ID](https://docs.browseract.com)\n[How to Connect n8n to BrowserAct](https://docs.browseract.com)\n[How to Use & Customize BrowserAct Templates](https://docs.browseract.com)"
      },
      "typeVersion": 1
    },
    {
      "id": "d041b38a-ec5e-4d81-98ed-be477d29d355",
      "name": "Step 1 Explanation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1456,
        96
      ],
      "parameters": {
        "color": 7,
        "width": 588,
        "height": 112,
        "content": "### \u23f0 Step 1: Schedule & Extract\n\nThe workflow triggers on a set schedule and targets a specific Medium tag URL. It then initiates a BrowserAct automation to scrape article data from the target page for analysis."
      },
      "typeVersion": 1
    },
    {
      "id": "806ed69f-6711-4dc4-b70a-a6a3c8619131",
      "name": "Step 2 Explanation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -672,
        -64
      ],
      "parameters": {
        "color": 7,
        "width": 1084,
        "height": 144,
        "content": "### \ud83e\udde0 Step 2: AI Intelligence\n\nAn AI agent analyzes the raw scraped data to remove duplicates and spam. It then categorizes valid articles into specific industry segments (e.g., \"Must Reads,\" \"Engineering\") and formats them into a structured digest."
      },
      "typeVersion": 1
    },
    {
      "id": "f7572f49-3bbb-4496-831d-efa37f5e767d",
      "name": "Step 3 Explanation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        576,
        -336
      ],
      "parameters": {
        "color": 7,
        "width": 1052,
        "height": 144,
        "content": "### \ud83d\udcc4 Step 3: Digest Generation\n\nThe system creates a new Google Doc and iterates through the structured AI output. It dynamically appends headers and article summaries to the document, inserting spacers between sections for readability."
      },
      "typeVersion": 1
    },
    {
      "id": "200809bb-f8c2-46c9-98bb-6a0d417a0337",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1472,
        -320
      ],
      "parameters": {
        "color": 6,
        "width": 576,
        "height": 336,
        "content": "@[youtube](XUpmdpucNzg)"
      },
      "typeVersion": 1
    },
    {
      "id": "05835aab-ba99-4a52-afda-bd2995b17aeb",
      "name": "Target Page Link",
      "type": "n8n-nodes-base.set",
      "position": [
        -1264,
        256
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "8dfdc51d-0d3d-441f-984a-9adbf0098216",
              "name": "Target_Medium_Link",
              "type": "string",
              "value": "https://medium.com/tag/artificial-intelligence/archive"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "8a4df843-5970-4418-93de-85d72d5c9f67",
      "name": "Every Day",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -1472,
        256
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "cfa3b7b7-a838-43cd-a90e-be1975ba6c8f",
      "name": "Scrape Headlines",
      "type": "n8n-nodes-browseract.browserAct",
      "position": [
        -1024,
        256
      ],
      "parameters": {
        "type": "WORKFLOW",
        "workflowId": "70169279773867251",
        "workflowConfig": {
          "value": {
            "input-Medium": "={{ $json.Target_Medium_Link }}"
          },
          "schema": [
            {
              "id": "input-Medium",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "description": "If left blank, the default value defined in BrowserAct will be used.",
              "displayName": "Medium",
              "defaultMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "input-Medium"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "open_incognito_mode": false
      },
      "credentials": {
        "browserActApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "dc6c75ed-caf4-4440-bbb1-63dac47f427e",
      "name": "Waiting for Inputs",
      "type": "n8n-nodes-base.merge",
      "position": [
        80,
        240
      ],
      "parameters": {
        "mode": "chooseBranch",
        "useDataOfInput": 2
      },
      "typeVersion": 3.2
    },
    {
      "id": "a894a274-892f-49ab-bd33-b25c732c5f5a",
      "name": "Slack Team Notification",
      "type": "n8n-nodes-base.slack",
      "position": [
        832,
        336
      ],
      "parameters": {
        "text": "The 'Automated Industry Trend Scraper & Outline Creator' workflow has been completed.",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C09KLV9DJSX",
          "cachedResultName": "all-browseract-workflow-test"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "executeOnce": true,
      "typeVersion": 2.4
    },
    {
      "id": "e521b76b-c584-4252-b233-d680cc2cead3",
      "name": "Check for Header",
      "type": "n8n-nodes-base.if",
      "position": [
        1200,
        80
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "500400e1-4830-41fa-873c-a30714d803dd",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.header }}",
              "rightValue": "="
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "c4e6a2f6-133c-441c-b2b8-0acc4855b61c",
      "name": "Rate Limit Mitigation",
      "type": "n8n-nodes-base.wait",
      "position": [
        960,
        80
      ],
      "parameters": {
        "amount": 10
      },
      "typeVersion": 1.1
    },
    {
      "id": "474c4852-d637-4fac-986f-a190d75249b6",
      "name": "Split the AI-generated data",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        304,
        240
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "output"
      },
      "typeVersion": 1
    },
    {
      "id": "15ae5ed5-81f3-4da4-a2c1-3daedb640aa2",
      "name": "Create a Document for Outlines",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        -192,
        144
      ],
      "parameters": {
        "title": "={{ $json.output[0].header }}",
        "folderId": "default"
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2,
      "alwaysOutputData": true
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "0fb3c7d2-5b86-4a91-ae00-4ae109d9a8b8",
  "connections": {
    "Add Body": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Every Day": {
      "main": [
        [
          {
            "node": "Target Page Link",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter": {
      "ai_languageModel": [
        [
          {
            "node": "Analyzer & Script writer",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Structured Output",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [
          {
            "node": "Slack Team Notification",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Rate Limit Mitigation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check for Header": {
      "main": [
        [
          {
            "node": "Add Header & Body",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Add Body",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scrape Headlines": {
      "main": [
        [
          {
            "node": "Analyzer & Script writer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Target Page Link": {
      "main": [
        [
          {
            "node": "Scrape Headlines",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add Header & Body": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output": {
      "ai_outputParser": [
        [
          {
            "node": "Analyzer & Script writer",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Waiting for Inputs": {
      "main": [
        [
          {
            "node": "Split the AI-generated data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Rate Limit Mitigation": {
      "main": [
        [
          {
            "node": "Check for Header",
            "type": "main",
            "index": 0
          },
          {
            "node": "Add Spacer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyzer & Script writer": {
      "main": [
        [
          {
            "node": "Create a Document for Outlines",
            "type": "main",
            "index": 0
          },
          {
            "node": "Waiting for Inputs",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Split the AI-generated data": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create a Document for Outlines": {
      "main": [
        [
          {
            "node": "Waiting for Inputs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}