{
  "id": "HWLgkUwnP5cE1PuO",
  "meta": {
    "site": "https://github.com/zengfr/n8n-workflow-all-templates",
    "name": "Summarize Japanese AI engineering articles from Qiita and note RSS to Slack",
    "wechat": "youandme10086",
    "id": 14980,
    "update_time": "2026-04-20"
  },
  "name": "\u516c\u8a8d\u8cc7\u683c\u30ef\u30fc\u30af\u30d5\u30ed\u30fc",
  "tags": [],
  "nodes": [
    {
      "id": "d84711ad-0cd4-41d4-9dbb-4cefc3c04063",
      "name": "Trigger: Schedule Workflow",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -5088,
        1040
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 7
            }
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "0f602639-b07e-4364-879c-9357dea046d0",
      "name": "Fetch RSS: Qiita Popular Feed",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        -4848,
        944
      ],
      "parameters": {
        "url": "https://qiita.com/popular-items/feed.atom",
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "807357c4-5e69-4607-849d-6b147047a4f4",
      "name": "Merge Feeds",
      "type": "n8n-nodes-base.merge",
      "position": [
        -4640,
        1040
      ],
      "parameters": {},
      "typeVersion": 3.2
    },
    {
      "id": "0ff27e82-30d7-4cbc-9514-861407e71664",
      "name": "AI: Score Articles (Top 10)",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        -3744,
        1040
      ],
      "parameters": {
        "text": "=\u3042\u306a\u305f\u306f\u521d\u7d1a\u30a8\u30f3\u30b8\u30cb\u30a2\u5411\u3051\u306e\u8a18\u4e8b\u8a55\u4fa1AI\u3067\u3059\u3002\n\n\u4ee5\u4e0b\u306e\u8a18\u4e8b\u4e00\u89a7\u3092\u8a55\u4fa1\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n\n\u3010\u8a55\u4fa1\u57fa\u6e96\u3011\n\n\u30fb\u5b9f\u52d9\u3067\u5f79\u7acb\u3064\u304b\n\u30fb\u521d\u5fc3\u8005\u3067\u3082\u7406\u89e3\u3067\u304d\u308b\u304b\n\u30fb\u6280\u8853\u7684\u4fa1\u5024\u304c\u3042\u308b\u304b\n\u30fb\u518d\u73fe\u53ef\u80fd\u306a\u5177\u4f53\u7684\u624b\u9806\u3084\u30b3\u30fc\u30c9\u304c\u542b\u307e\u308c\u3066\u3044\u308b\u304b\n\u30fb\u660e\u78ba\u306a\u554f\u984c\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5\u304c\u63d0\u793a\u3055\u308c\u3066\u3044\u308b\u304b\n\u30fb\u5185\u5bb9\u304c\u5177\u4f53\u7684\u3067\u62bd\u8c61\u7684\u3059\u304e\u306a\u3044\u304b\n\n\u3010\u30b9\u30b3\u30a2\u30eb\u30fc\u30eb\u3011\n\n\u30fb0\u301c100\u70b9\u306e\u6574\u6570\u3067\u8a55\u4fa1\u3059\u308b\u3053\u3068\n\u30fb50\u70b9\u304c\u5e73\u5747\u7684\u306a\u8a18\u4e8b\n\u30fb80\u70b9\u4ee5\u4e0a\u306f\u975e\u5e38\u306b\u6709\u76ca\n\u30fb90\u70b9\u4ee5\u4e0a\u306f\u5b9f\u52d9\u3067\u5f37\u304f\u5f79\u7acb\u3064\u512a\u826f\u8a18\u4e8b\n\u30fb30\u70b9\u4ee5\u4e0b\u306f\u4fa1\u5024\u304c\u4f4e\u3044\u8a18\u4e8b\n\n\u3010\u91cd\u8981\u3011\n\n\u30fbQiita\u304a\u3088\u3073Zenn\u306e\u8a18\u4e8b\u306e\u7279\u6027\uff08\u5b9f\u52d9\u7684\u30fb\u5b9f\u4f53\u9a13\u30d9\u30fc\u30b9\uff09\u3092\u8003\u616e\u3057\u3066\u8a55\u4fa1\u3059\u308b\u3053\u3068\n\u30fb\u62bd\u8c61\u7684\u306a\u307e\u3068\u3081\u8a18\u4e8b\u3084\u7d39\u4ecb\u3060\u3051\u306e\u8a18\u4e8b\u306f\u4f4e\u8a55\u4fa1\u306b\u3059\u308b\u3053\u3068\n\u30fb\u5b9f\u88c5\u30fb\u691c\u8a3c\u30fb\u5177\u4f53\u4f8b\u304c\u3042\u308b\u8a18\u4e8b\u3092\u9ad8\u8a55\u4fa1\u306b\u3059\u308b\u3053\u3068\n\n\u30fb\u5fc5\u305a\u6307\u5b9a\u3055\u308c\u305fJSON\u5f62\u5f0f\u3067\u8fd4\u3059\n\u30fb\u914d\u5217\u3067\u8fd4\u3059\n\u30fbtitle\u306f\u305d\u306e\u307e\u307e\u4f7f\u3046\n\u30fbscore\u306f\u5fc5\u305a0\u301c100\u306e\u6574\u6570\u3067\u51fa\u3059\n\u30fbscore\u304c\u9ad8\u3044\u8a18\u4e8b\u304b\u308910\u500b\u306e\u8a18\u4e8b\u3060\u3051\u8868\u793a\u3059\u308b\n\n\u3010\u51fa\u529b\u5f62\u5f0f\u3011\n\n[\n  {\n    \"title\": \"\u8a18\u4e8b\u30bf\u30a4\u30c8\u30eb\",\n    \"link\": \"URL\",\n    \"score\": 85,\n    \"reason\": \"\u7406\u7531\"\n  }\n]\n\n\u8a18\u4e8b\u4e00\u89a7:\n\n{{ JSON.stringify($json.articles) }}",
        "batching": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.9
    },
    {
      "id": "35e6de63-1ff7-4df7-b748-3cedee691dee",
      "name": "Model: Gemini",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        -3744,
        1264
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "cb735728-ca6e-4e94-86c1-04418368eba1",
      "name": "Parser: Structured JSON",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -3600,
        1264
      ],
      "parameters": {
        "jsonSchemaExample": "[\n  {\n    \"title\": \"\u8a18\u4e8b\u30bf\u30a4\u30c8\u30eb\",\n    \"link\": \"URL\",\n    \"score\": 85,\n    \"reason\": \"\u7406\u7531\"\n  }\n]"
      },
      "typeVersion": 1.3
    },
    {
      "id": "44766594-1007-4de8-931c-9f40b5bdbe60",
      "name": "Fetch: Article HTML",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -2960,
        1040
      ],
      "parameters": {
        "url": "={{ $json.link }}",
        "options": {
          "redirect": {
            "redirect": {}
          }
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "01ab76dc-b0df-4561-bfc2-09116faa7d50",
      "name": "Format: Slack Message",
      "type": "n8n-nodes-base.code",
      "position": [
        -2128,
        1040
      ],
      "parameters": {
        "jsCode": "return items.map((item, index) => {\n\n  let data;\n\n  try {\n    data = JSON.parse(item.json.output);\n  } catch (e) {\n    data = item.json;\n  }\n\n  const text = `\u25a0 ${index + 1}\n\n${data.link || '\u30ea\u30f3\u30af\u306a\u3057'}\n\n\u3010\u8981\u7d04\u3011\n${data.summary || '\u306a\u3057'}\n\n\u3010\u5bfe\u8c61\u3011\n${data.target || '\u306a\u3057'}\n\n\u3010\u6d3b\u7528\u4f8b\u3011\n${data.use_case || '\u306a\u3057'}\n\n\u3010\u30e1\u30ea\u30c3\u30c8\u3011\n${data.merit || '\u306a\u3057'}\n\n\u3010\u30c7\u30e1\u30ea\u30c3\u30c8\u3011\n${data.demerit || '\u306a\u3057'}\n`;\n\n  return {\n    json: {\n      text: text\n    }\n  };\n\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "18410103-77d8-4c89-b124-5b0c59829b55",
      "name": "Notify: Send to Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        -1936,
        1040
      ],
      "parameters": {
        "text": "={{ $json.text }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C0AFRAJ1RTM",
          "cachedResultName": "gmail\u30a2\u30e9\u30fc\u30c82"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.4
    },
    {
      "id": "690b1333-00e0-457f-a300-bca8d569e064",
      "name": "AI: Generate Summary",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -2512,
        1040
      ],
      "parameters": {
        "text": "=\u3042\u306a\u305f\u306f\u30c7\u30fc\u30bf\u6574\u5f62\u5c02\u7528AI\u3067\u3059\u3002\n\n\u4ee5\u4e0b\u306e\u5185\u5bb9\u3092\u5206\u6790\u3057\u3001\u5fc5\u305aJSON\u306e\u307f\u3092\u8fd4\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n\n\u3010\u7d76\u5bfe\u30eb\u30fc\u30eb\u3011\n\u30fbJSON\u4ee5\u5916\u306e\u6587\u5b57\u3092\u4e00\u5207\u66f8\u304b\u306a\u3044\n\u30fb\u8aac\u660e\u6587\u7981\u6b62\n\u30fb\u524d\u7f6e\u304d\u7981\u6b62\n\u30fb\u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u7981\u6b62\uff08```\u7981\u6b62\uff09\n\u30fb\u6539\u884cOK\n\u30fb\u5fc5\u305a1\u3064\u306eJSON\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3067\u8fd4\u3059\n\u30fbkey\u306f\u5fc5\u305a\u4ee5\u4e0b\u3068\u5b8c\u5168\u4e00\u81f4\n\n\u3010\u51fa\u529b\u5f62\u5f0f\u3011\n{\n \"summary\": \"\",\n \"target\": \"\",\n \"use_case\": \"\",\n \"merit\": \"\",\n \"demerit\": \"\",\n \"link\": \"\"\n}\n\n\u3010\u8ffd\u52a0\u30eb\u30fc\u30eb\uff08\u91cd\u8981\uff09\u3011\n\n\u30fbmerit\uff08\u30e1\u30ea\u30c3\u30c8\uff09\u306f200\u6587\u5b57\u4ee5\u4e0a400\u6587\u5b57\u4ee5\u4e0b\u3067\u66f8\u304f\u3053\u3068\n\u30fbdemerit\uff08\u30c7\u30e1\u30ea\u30c3\u30c8\uff09\u3082200\u6587\u5b57\u4ee5\u4e0a400\u6587\u5b57\u4ee5\u4e0b\u3067\u66f8\u304f\u3053\u3068\n\n\u3010\u5165\u529b\u3011\n\u30ea\u30f3\u30af:\n{{ $json.link }}\n\n\u672c\u6587:\n{{ $json.cleanText }}",
        "options": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3.1
    },
    {
      "id": "6e5fdb19-aec5-407a-9267-426bfaf237d9",
      "name": "Model: OpenAI",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -2512,
        1248
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-nano",
          "cachedResultName": "gpt-4.1-nano"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "90442cd5-d3d4-4a22-bc0c-d3c7706b1ba6",
      "name": "Filter: Last 24 Hours",
      "type": "n8n-nodes-base.code",
      "position": [
        -4416,
        1040
      ],
      "parameters": {
        "jsCode": "// ==============================\n// \u2460 \u73fe\u5728\u6642\u523b\u3092\u53d6\u5f97\n// ==============================\nconst now = new Date();\n\n// ==============================\n// \u2461 24\u6642\u9593\uff08\u30df\u30ea\u79d2\uff09\n// ==============================\nconst ONE_DAY = 24 * 60 * 60 * 1000;\n\n// ==============================\n// \u2462 \u30d5\u30a3\u30eb\u30bf\u51e6\u7406\n// ==============================\nreturn items.filter(item => {\n\n  // \u8a18\u4e8b\u306e\u65e5\u6642\u53d6\u5f97\uff08isoDate\u512a\u5148\uff09\n  const dateString = item.json.isoDate || item.json.pubDate;\n\n  // \u65e5\u4ed8\u304c\u306a\u3044\u5834\u5408\u306f\u9664\u5916\n  if (!dateString) return false;\n\n  const articleDate = new Date(dateString);\n\n  // \u6642\u9593\u5dee\u3092\u8a08\u7b97\n  const diff = now - articleDate;\n\n  // ==============================\n  // \u2463 24\u6642\u9593\u4ee5\u5185\u3060\u3051\u6b8b\u3059\n  // ==============================\n  return diff <= ONE_DAY;\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "99578cf5-02b8-491e-8c9c-7d925c39a3f8",
      "name": "Aggregate: Build Article List",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        -3968,
        1040
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData",
        "destinationFieldName": "articles"
      },
      "typeVersion": 1
    },
    {
      "id": "a2f9799d-4feb-4a28-aae1-87e66f5bc7b3",
      "name": "Split: Individual Articles",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        -3392,
        1040
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "output"
      },
      "typeVersion": 1
    },
    {
      "id": "35809e3f-cab7-4a06-9ddb-92e7d8c234dd",
      "name": "STEP1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -5152,
        784
      ],
      "parameters": {
        "color": 7,
        "width": 640,
        "height": 648,
        "content": "## STEP1: Data Collection\nFetch articles from Qiita and note RSS feeds and merge into one list"
      },
      "typeVersion": 1
    },
    {
      "id": "1fb14a5d-f907-4eef-8699-6b8c452f2dac",
      "name": "STEP2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4512,
        784
      ],
      "parameters": {
        "color": 7,
        "width": 708,
        "height": 648,
        "content": "## STEP2: Data Filtering & Structuring\nFilter articles within the last 24 hours and transform them into a structured format for AI processing"
      },
      "typeVersion": 1
    },
    {
      "id": "e81947b8-9452-4300-8db6-cda196b675e5",
      "name": "STEP3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3808,
        784
      ],
      "parameters": {
        "color": 7,
        "width": 560,
        "height": 648,
        "content": "## STEP3: AI-Based Article Scoring and Selection\nEvaluate each article using AI based on practical usefulness, readability for beginners, technical value, reproducibility, and problem-solving relevance.\nThe scored results are then split into individual articles, ranked, and filtered to select the top 10 actionable, experience-based articles."
      },
      "typeVersion": 1
    },
    {
      "id": "cd5baa4d-5f33-405d-92d8-7d74fff7919d",
      "name": "STEP4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3248,
        784
      ],
      "parameters": {
        "color": 7,
        "width": 656,
        "height": 648,
        "content": "## STEP4: Content Retrieval & Preparation\nPrepare article links, fetch each article HTML, and extract and clean the main text content for further processing"
      },
      "typeVersion": 1
    },
    {
      "id": "b02eeb2e-260f-47a6-88b1-f69134416ac9",
      "name": "STEP5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2592,
        784
      ],
      "parameters": {
        "color": 7,
        "width": 592,
        "height": 648,
        "content": "## STEP5: AI Article Summarization\nGenerate summary, target, use cases, merits, and demerits"
      },
      "typeVersion": 1
    },
    {
      "id": "78cdb569-2d18-476c-8c17-457c20c00c46",
      "name": "STEP6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2176,
        784
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 648,
        "content": "## STEP6: Notification\nFormat the result and send it to Slack"
      },
      "typeVersion": 1
    },
    {
      "id": "6e43790e-df40-4e8b-a027-2dea81a6b4fe",
      "name": "WORKFLOW OVERVIEW",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -5952,
        784
      ],
      "parameters": {
        "width": 800,
        "height": 888,
        "content": "## AUTOMATE AI AND ENGINEERING ARTICLE SUMMARIZATION FROM RSS TO SLACK\n\n## Who\u2019s it for\nJapanese engineers and learners who want to quickly stay updated with practical AI and engineering articles from Qiita and note.\n\n## What it does\nFetches articles from RSS feeds, filters those published within the past 24 hours, ranks them with AI, summarizes key content, and sends a daily digest to Slack.\n\n## How it works\n1. Scheduled trigger runs the workflow\n2. RSS feeds are fetched and merged\n3. Articles from the past 24 hours are filtered and structured\n4. AI ranks and selects top articles\n5. Article content is retrieved and cleaned\n6. AI generates summaries\n7. Results are formatted and sent to Slack\n\n## Requirements\n- Google Gemini API credentials\n- OpenAI API credentials\n- Slack OAuth2 credentials\n- A Slack channel for notifications\n\n## How to set up\nConfigure API keys, set Slack channel, and activate the workflow.\n\n## How to customize\n- Change RSS sources\n- Adjust filters or time range\n- Modify AI prompts\n- Customize Slack output"
      },
      "typeVersion": 1
    },
    {
      "id": "fb6727cf-0da7-4e06-a0c6-15982d133769",
      "name": "Prepare: Extract Article Link for HTTP",
      "type": "n8n-nodes-base.set",
      "position": [
        -3184,
        1040
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "9ca0c4fe-23bc-4e6c-adf5-672be949d2ae",
              "name": "link",
              "type": "string",
              "value": "={{ $json.link }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "d8c157e7-7ae4-4721-a26b-e2d5eba6aba4",
      "name": "Fetch RSS: note Engineer Hashtag Feed",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        -4848,
        1104
      ],
      "parameters": {
        "url": "https://note.com/hashtag/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2/rss",
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "9b37ad6f-6216-4f65-90d1-9debdad58915",
      "name": "Transform: Format RSS Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        -4192,
        1040
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "7d734121-23b4-43fe-88ef-6a3053d6a3ca",
              "name": "title",
              "type": "string",
              "value": "={{ $json.title }}"
            },
            {
              "id": "f6b9e622-0847-43a6-853e-122ecac79d9d",
              "name": "summary",
              "type": "string",
              "value": "={{ $json.content }}"
            },
            {
              "id": "93fbe759-8c1e-4a08-833c-70f52372da52",
              "name": "link",
              "type": "string",
              "value": "={{ $json.link }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "8519110c-5f0f-4ce9-ac87-098793a98cf6",
      "name": "Extract: Clean Text from HTML",
      "type": "n8n-nodes-base.code",
      "position": [
        -2736,
        1040
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "const html = $json.data || '';\n\nlet text = html\n  .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n  .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n  .replace(/<[^>]*>/g, '')\n  .replace(/[^\u3041-\u3093\u30a1-\u30f3\u4e00-\u9fa5a-zA-Z0-9\u3002\u3001\uff01\uff1f\\s]/g, '');\n\ntext = text\n  .split('\\n')\n  .map(line => line.trim())\n  .filter(line => line.length > 20)\n  .join('\\n');\n\ntext = text.replace(/\\s+/g, ' ').trim().slice(0, 3000);\n\nreturn {\n  json: {\n    link: $('Prepare: Extract Article Link for HTTP').item.json.link,\n    cleanText: text\n  }\n};"
      },
      "typeVersion": 2
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  },
  "versionId": "9564df24-464d-42c2-9d63-fe9a200ecc96",
  "connections": {
    "Merge Feeds": {
      "main": [
        [
          {
            "node": "Filter: Last 24 Hours",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Model: Gemini": {
      "ai_languageModel": [
        [
          {
            "node": "AI: Score Articles (Top 10)",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Model: OpenAI": {
      "ai_languageModel": [
        [
          {
            "node": "AI: Generate Summary",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Fetch: Article HTML": {
      "main": [
        [
          {
            "node": "Extract: Clean Text from HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI: Generate Summary": {
      "main": [
        [
          {
            "node": "Format: Slack Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter: Last 24 Hours": {
      "main": [
        [
          {
            "node": "Transform: Format RSS Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format: Slack Message": {
      "main": [
        [
          {
            "node": "Notify: Send to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parser: Structured JSON": {
      "ai_outputParser": [
        [
          {
            "node": "AI: Score Articles (Top 10)",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Split: Individual Articles": {
      "main": [
        [
          {
            "node": "Prepare: Extract Article Link for HTTP",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Trigger: Schedule Workflow": {
      "main": [
        [
          {
            "node": "Fetch RSS: Qiita Popular Feed",
            "type": "main",
            "index": 0
          },
          {
            "node": "Fetch RSS: note Engineer Hashtag Feed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI: Score Articles (Top 10)": {
      "main": [
        [
          {
            "node": "Split: Individual Articles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Transform: Format RSS Fields": {
      "main": [
        [
          {
            "node": "Aggregate: Build Article List",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate: Build Article List": {
      "main": [
        [
          {
            "node": "AI: Score Articles (Top 10)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract: Clean Text from HTML": {
      "main": [
        [
          {
            "node": "AI: Generate Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch RSS: Qiita Popular Feed": {
      "main": [
        [
          {
            "node": "Merge Feeds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch RSS: note Engineer Hashtag Feed": {
      "main": [
        [
          {
            "node": "Merge Feeds",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Prepare: Extract Article Link for HTTP": {
      "main": [
        [
          {
            "node": "Fetch: Article HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}