{
  "name": "AI Tech Watcher: Personalized News Curator-p",
  "nodes": [
    {
      "parameters": {
        "content": "## \ud83d\uddde\ufe0f AI Tech Watcher\n\n**Your Personal News Curator.**\nFetches RSS feeds, filters them with **Gemini**, and notifies you of *only* the important news on Slack.\n\n**How it works**\n1. **Trigger:** Runs every morning at 8:00 AM (or Manually).\n2. **Fetch:** Gets latest articles from RSS feeds (e.g., n8n, TechCrunch).\n3. **De-Dupe:** JavaScript Logic filters out old articles.\n4. **Analyze:** Loops through items and uses **Gemini** reads the title/snippet and decides if it's relevant to you.\n   - *Criteria: AI, Automation, No-Code.*\n5. **Notify:** Sends a summary to **Slack**.\n\n**Setup steps**\n1. **Credentials:** Connect Gemini, Slack.\n2. **Config:** Open **\"Config\"** to set RSS URLs & Slack Channel.\n3. **Test:** Click \"Execute Workflow\".",
        "height": 380,
        "width": 500,
        "color": 3
      },
      "id": "7125f3a1-1a81-4c6e-beee-edca5b263738",
      "name": "Sticky Note - Main",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -320,
        -16
      ]
    },
    {
      "parameters": {
        "content": "## \u2699\ufe0f Configuration\nSet RSS Feeds & Slack.",
        "height": 140,
        "width": 288,
        "color": 6
      },
      "id": "71647d94-7e1c-466c-988d-fd7577eccd99",
      "name": "Sticky Note - Config",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        256,
        0
      ]
    },
    {
      "parameters": {
        "content": "## \ud83d\udce1 Fetch & Filter\nGet RSS & Remove Old Items.",
        "height": 300,
        "width": 540,
        "color": 6
      },
      "id": "fae97481-33b1-40e9-91b0-59587f59dae2",
      "name": "Sticky Note - Input",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        608,
        0
      ]
    },
    {
      "parameters": {
        "content": "## \ud83e\udde0 AI Curator\nGemini rates & summarizes.",
        "height": 140,
        "width": 440,
        "color": 6
      },
      "id": "6b2852c5-8c59-4956-9176-b59a5063ad1f",
      "name": "Sticky Note - AI",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        1200,
        0
      ]
    },
    {
      "parameters": {
        "content": "## \ud83d\udce4 Notify\nSend to Slack.",
        "height": 140,
        "width": 340,
        "color": 6
      },
      "id": "d5e5f9a0-da11-49ca-8193-dea0e5759f88",
      "name": "Sticky Note - Output",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        1680,
        0
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "id-1",
              "name": "RSS_URLS",
              "value": "https://n8n.io/blog/rss/, https://techcrunch.com/category/artificial-intelligence/feed/",
              "type": "string"
            },
            {
              "id": "id-2",
              "name": "SLACK_CHANNEL",
              "value": "news-feed",
              "type": "string"
            }
          ]
        },
        "includeOtherFields": true,
        "options": {}
      },
      "id": "abda3921-7258-4cd8-a233-911bf8f24dfe",
      "name": "Config",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        368,
        96
      ]
    },
    {
      "parameters": {
        "triggerTimes": {
          "item": [
            {
              "hour": 8
            }
          ]
        }
      },
      "id": "4e8ace19-bcbc-4b41-b924-f9b7fefa222a",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.cron",
      "typeVersion": 1,
      "position": [
        192,
        96
      ]
    },
    {
      "parameters": {},
      "id": "48e85b81-2dad-46c1-9ef8-003408ab3447",
      "name": "Manual Trigger",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        192,
        288
      ]
    },
    {
      "parameters": {
        "jsCode": "// Split RSS URLs\nconst urls = $('Config').first().json.RSS_URLS.split(',').map(u => u.trim());\nreturn urls.map(url => ({ json: { url } }));"
      },
      "id": "cb31cd0f-bd70-4e5e-9bdf-fe2bcb7ed566",
      "name": "Split URLs",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        528,
        112
      ]
    },
    {
      "parameters": {
        "url": "={{ $json.url }}",
        "options": {}
      },
      "id": "b9e4f8ac-64f5-4868-91ca-4e1acc6369fc",
      "name": "RSS Feed Read",
      "type": "n8n-nodes-base.rssFeedRead",
      "typeVersion": 1.1,
      "position": [
        688,
        112
      ]
    },
    {
      "parameters": {
        "modelId": {
          "__rl": true,
          "value": "models/gemini-2.0-flash",
          "mode": "list",
          "cachedResultName": "models/gemini-2.0-flash"
        },
        "messages": {
          "values": [
            {
              "content": "=Act as a Tech News Curator.\nAnalyze this article for a No-Code Automation Engineer.\n\n[Article]\nTitle: {{ $json.title }}\nSummary: {{ $json.contentSnippet || $json.content }}\n\n[Instructions]\n1. **Rate Relevance (1-5):** How relevant is this to AI automation, n8n, or productivity?\n2. **Summarize:** Write a 3-bullet point summary in Japanese.\n3. **Output JSON ONLY:**\n{\n  \"relevance\": 5,\n  \"summary_jp\": \"- ...\\n- ...\"\n}"
            }
          ]
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "typeVersion": 1,
      "position": [
        1216,
        96
      ],
      "id": "a737fd3a-02b1-425f-a08b-f9dde77554d0",
      "name": "Gemini: Curate",
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// Parse JSON\nconst text = $input.first().json.content.parts[0].text;\nlet result = {};\ntry {\n  const cleanText = text.replace(/```json/g, '').replace(/```/g, '').trim();\n  result = JSON.parse(cleanText);\n} catch (e) {\n  result = { relevance: 0, summary_jp: \"Error parsing.\" };\n}\nreturn { json: result };"
      },
      "id": "768b06b0-f914-4f9a-86d6-a3cdc38e01e4",
      "name": "Parse JSON",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1488,
        96
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict"
          },
          "conditions": [
            {
              "id": "is_relevant",
              "leftValue": "={{ $json.relevance }}",
              "rightValue": 4,
              "operator": {
                "type": "number",
                "operation": "gte"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "3b0246d0-5ed5-4910-bde4-ef774795931b",
      "name": "Is Relevant?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        1632,
        96
      ]
    },
    {
      "parameters": {
        "authentication": "oAuth2",
        "select": "user",
        "user": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "text": "=\ud83d\uddde\ufe0f **News: {{ $('Deduplication').item.json.title }}**\n\n{{ $json.summary_jp }}\n\n\ud83d\udd17 {{ $('Deduplication').item.json.link }}",
        "otherOptions": {}
      },
      "id": "ea1724b3-2d5a-4ede-b763-6770f453bff3",
      "name": "Notify Slack",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.4,
      "position": [
        1856,
        64
      ],
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// \u91cd\u8907\u6392\u9664\uff08Deduplication\uff09\u30ed\u30b8\u30c3\u30af\n// \u904e\u53bb\u306b\u51e6\u7406\u3057\u305f\u8a18\u4e8bID\u3092\u8a18\u61b6\u3057\u3001\u65b0\u7740\u306e\u307f\u3092\u901a\u3057\u307e\u3059\n\nconst staticData = $getWorkflowStaticData('node');\n// \u904e\u53bb\u306b\u51e6\u7406\u3057\u305fID\u30ea\u30b9\u30c8\u3092\u53d6\u5f97\nconst processedIds = staticData.processedIds || [];\nconst newItems = [];\nconst newIds = [];\n\n// \u5165\u529b\u3055\u308c\u305f\u8a18\u4e8b\u3092\u4e00\u3064\u305a\u3064\u30c1\u30a7\u30c3\u30af\nfor (const item of $input.all()) {\n  // \u8a18\u4e8b\u306eID(guid) \u307e\u305f\u306f \u30ea\u30f3\u30af(link) \u3092\u53d6\u5f97\n  const id = item.json.guid || item.json.link;\n  \n  // ID\u304c\u3042\u308a\u3001\u304b\u3064\u904e\u53bb\u30ea\u30b9\u30c8\u306b\u306a\u3051\u308c\u3070\u300c\u65b0\u898f\u300d\u3068\u3057\u3066\u63a1\u7528\n  if (id && !processedIds.includes(id)) {\n    newItems.push(item);\n    newIds.push(id);\n  }\n}\n\n// \u51e6\u7406\u6e08\u307f\u30ea\u30b9\u30c8\u3092\u66f4\u65b0\uff08\u6700\u65b0500\u4ef6\u307e\u3067\u4fdd\u6301\u3057\u3066\u5bb9\u91cf\u7206\u767a\u3092\u9632\u3050\uff09\nstaticData.processedIds = [...newIds, ...processedIds].slice(0, 500);\n\nreturn newItems;"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        880,
        112
      ],
      "id": "c22981e8-fa14-4130-9434-56f8cd12824f",
      "name": "Code in JavaScript"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 3,
      "position": [
        1040,
        112
      ],
      "id": "70eb0c0f-fbc5-4643-8347-f1d1aa26fb82",
      "name": "Loop Over Items"
    }
  ],
  "connections": {
    "Config": {
      "main": [
        [
          {
            "node": "Split URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Config",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Manual Trigger": {
      "main": [
        [
          {
            "node": "Config",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split URLs": {
      "main": [
        [
          {
            "node": "RSS Feed Read",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gemini: Curate": {
      "main": [
        [
          {
            "node": "Parse JSON",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse JSON": {
      "main": [
        [
          {
            "node": "Is Relevant?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Is Relevant?": {
      "main": [
        [
          {
            "node": "Notify Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "RSS Feed Read": {
      "main": [
        [
          {
            "node": "Code in JavaScript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [
          {
            "node": "Gemini: Curate",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "availableInMCP": false,
    "timeSavedMode": "fixed",
    "callerPolicy": "workflowsFromSameOwner"
  },
  "versionId": "21624e48-6b77-4473-8574-e1b9dcb3970a",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "Oyk4OjTr8sAYKMw6",
  "tags": []
}