{
  "name": "Summarize AI news from RSS, Reddit and HN with Claude to Discord and Slack",
  "nodes": [
    {
      "id": "15d9d02a-f5b2-41c3-a02f-718d31cf3fe4",
      "name": "Initialize run timestamp",
      "type": "n8n-nodes-base.code",
      "position": [
        1168,
        784
      ]
    },
    {
      "id": "00e58581-a2bb-489d-8064-6c3ff13d6c91",
      "name": "Create run record",
      "type": "n8n-nodes-base.postgres",
      "position": [
        1456,
        784
      ]
    },
    {
      "id": "b59ce09a-69aa-4468-afb9-e00b66510ab1",
      "name": "Build feed source list",
      "type": "n8n-nodes-base.code",
      "position": [
        1728,
        784
      ]
    },
    {
      "id": "b757855c-1658-41dd-b7ea-fc741ca2de47",
      "name": "Fetch feed content",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2000,
        784
      ]
    },
    {
      "id": "d19d6bfb-14ff-4906-8b23-74e7e79dd3ff",
      "name": "Parse articles from feeds",
      "type": "n8n-nodes-base.code",
      "position": [
        2288,
        784
      ]
    },
    {
      "id": "2a4aeb63-b347-49cd-a976-76ddee8fd72b",
      "name": "Any articles found?",
      "type": "n8n-nodes-base.if",
      "position": [
        2560,
        784
      ]
    },
    {
      "id": "a33cf456-8543-4018-97a4-68a1fa8a71c8",
      "name": "Mark run as empty",
      "type": "n8n-nodes-base.postgres",
      "position": [
        2848,
        576
      ]
    },
    {
      "id": "a4996912-f948-4cb7-8fe6-59ee3f33671f",
      "name": "Deduplicate by URL and title",
      "type": "n8n-nodes-base.code",
      "position": [
        2848,
        784
      ]
    },
    {
      "id": "6c6c84cf-6795-4427-bca7-a6b96a72e77c",
      "name": "Check database for recent duplicates",
      "type": "n8n-nodes-base.postgres",
      "position": [
        3120,
        784
      ]
    },
    {
      "id": "d18869bc-2d20-4236-9dc9-ac0a3d288f07",
      "name": "Remove already-seen articles",
      "type": "n8n-nodes-base.code",
      "position": [
        3408,
        784
      ]
    },
    {
      "id": "eac5f273-fd2f-4695-aa5e-6c226d538fc7",
      "name": "Select top articles for extraction",
      "type": "n8n-nodes-base.code",
      "position": [
        3680,
        784
      ]
    },
    {
      "id": "d01169be-bcf1-41dd-9b3a-cb1708505e31",
      "name": "Extract full text via Jina",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3968,
        784
      ]
    },
    {
      "id": "ef32355d-2617-4692-9506-3e7fce611019",
      "name": "Assemble extracted content",
      "type": "n8n-nodes-base.code",
      "position": [
        4240,
        784
      ]
    },
    {
      "id": "f824391b-0d86-4cfc-8b99-cdb1b934a238",
      "name": "Prepare analysis prompts",
      "type": "n8n-nodes-base.code",
      "position": [
        4528,
        784
      ]
    },
    {
      "id": "d6e50e51-2678-4eb1-a4ec-6147c93569e5",
      "name": "Analyze article with Claude",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        4800,
        784
      ]
    },
    {
      "id": "8da6dc3e-8d64-4596-b0a9-199b11a6ccb1",
      "name": "Score and rank articles",
      "type": "n8n-nodes-base.code",
      "position": [
        5088,
        784
      ]
    },
    {
      "id": "ab298c48-0aa1-494a-a884-67a2c33a4f07",
      "name": "Select articles for digest",
      "type": "n8n-nodes-base.code",
      "position": [
        5360,
        784
      ]
    },
    {
      "id": "443ea580-1b92-49d9-a27d-136e1f3e914d",
      "name": "Claude Sonnet (compiler)",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "position": [
        5344,
        1040
      ]
    },
    {
      "id": "a5f54991-eb5c-4ecf-9782-a6e5612990ee",
      "name": "Compile digest with Claude",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        5648,
        784
      ]
    },
    {
      "id": "33120460-8e96-404c-a3ec-89c7d1e8143c",
      "name": "Format multi-channel outputs",
      "type": "n8n-nodes-base.code",
      "position": [
        5920,
        784
      ]
    },
    {
      "id": "f7793af1-2496-4fbd-b9fd-9e80f4cae36f",
      "name": "Send digest to Discord",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        6208,
        608
      ]
    },
    {
      "id": "41cf330d-7627-498c-99d0-c1de256afc06",
      "name": "Send digest to Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        6208,
        784
      ]
    },
    {
      "id": "072a0613-8ada-4707-b056-aafb641431c2",
      "name": "Build article save query",
      "type": "n8n-nodes-base.code",
      "position": [
        6208,
        976
      ]
    },
    {
      "id": "7e5072f5-ab02-4009-adc6-2aaf6e14e435",
      "name": "Save articles to database",
      "type": "n8n-nodes-base.postgres",
      "position": [
        6480,
        976
      ]
    },
    {
      "id": "6a5864ab-dcac-48a5-9a40-d88470440c5e",
      "name": "Mark run as completed",
      "type": "n8n-nodes-base.postgres",
      "position": [
        6736,
        976
      ]
    },
    {
      "id": "5e659dc8-9dff-4e71-aa92-574d6d48f430",
      "name": "Run daily at 6 AM",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        608,
        784
      ]
    },
    {
      "id": "8fed8e62-681d-4eb2-8373-a1948983d503",
      "name": "Claude Haiku (analyzer)",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "position": [
        5024,
        1056
      ]
    },
    {
      "id": "ae1b7fe1-3933-4ce8-8471-d7216e61f499",
      "name": "⚙️ Configure digest settings",
      "type": "n8n-nodes-base.set",
      "position": [
        880,
        784
      ]
    },
    {
      "id": "3c774194-45a4-4f0a-b443-9585691b78d3",
      "name": "Overview — AI News Digest",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        96
      ],
      "parameters": {
        "width": 560,
        "height": 880,
        "content": "# AI News Digest\n\nAutomated daily digest that monitors RSS/API sources, extracts full article text, analyzes each with Claude AI, scores by importance, and delivers a formatted briefing to Discord, Sl"
      }
    },
    {
      "id": "df43ca14-d5df-4610-aa6e-aab8f63c3f46",
      "name": "Section — Configuration",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        576,
        528
      ],
      "parameters": {
        "width": 496,
        "height": 452,
        "content": "##  Configuration\nAll user settings in one place. Edit this node to set your webhook URLs, channel IDs, processing limits, and the `use_postgres` toggle.\n\n[Discord webhook setup](https://support.disco"
      }
    },
    {
      "id": "6ba9dcbd-b802-4050-a610-0d105dc54fa7",
      "name": "Section — Run Tracking",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1120,
        528
      ],
      "parameters": {
        "width": 480,
        "height": 452,
        "content": "##  Run Tracking\nCreates a timestamped database record to track progress, article counts, and API costs per run.\n\n(Optional)\nPostgreSQL enables run tracking, article history, and cross-day dedup. Set "
      }
    },
    {
      "id": "c8b57b6f-5d75-4e7c-bb74-6fed24b99d28",
      "name": "Section — Feed Collection",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1664,
        528
      ],
      "parameters": {
        "width": 776,
        "height": 452,
        "content": "##  Feed Collection\nFetches and parses articles from RSS, Atom, Reddit JSON, and Hacker News API. Handles all feed formats automatically."
      }
    },
    {
      "id": "4922558c-4424-4bc9-99dd-31474e2b0649",
      "name": "Section — Deduplication",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2496,
        432
      ],
      "parameters": {
        "width": 1080,
        "height": 548,
        "content": "##  Deduplication\nThree layers: URL hash matching, fuzzy title comparison (Levenshtein distance), and database lookback to skip recently-covered stories.\n\nDatabase dedup is automatic when Postgres is "
      }
    },
    {
      "id": "35dc639a-7bbd-44d4-9bf2-a63963b325a3",
      "name": "Section — Content Extraction",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3632,
        528
      ],
      "parameters": {
        "width": 744,
        "height": 452,
        "content": "##  Content Extraction\nPulls full article text via [Jina Reader API](https://jina.ai/reader/) for deeper AI analysis beyond just titles and excerpts. Free tier handles most daily digest volumes."
      }
    },
    {
      "id": "2da857f5-2fb9-43fe-84d3-b3e002b8227f",
      "name": "Section — AI Analysis",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4464,
        528
      ],
      "parameters": {
        "width": 792,
        "height": 452,
        "content": "##  AI Analysis\nClaude Haiku scores each article 1-10 for importance, assigns categories, detects sentiment, and writes a practical \"why it matters\" for each."
      }
    },
    {
      "id": "d39a1269-00a8-42c5-a164-14ec88ea9797",
      "name": "Section — Digest Compilation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5312,
        528
      ],
      "parameters": {
        "width": 728,
        "height": 452,
        "content": "##  Digest Compilation\nClaude Sonnet compiles top articles into a structured digest: lead story with analysis, top stories, quick hits, and trend detection."
      }
    },
    {
      "id": "4f971704-db51-4830-bb8a-af215aaee8c6",
      "name": "Section — Delivery and Storage",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        6144,
        448
      ],
      "parameters": {
        "width": 744,
        "height": 716,
        "content": "##  Delivery & Storage\nSends formatted digest to Discord (embeds) and Slack (blocks). When Postgres is enabled, saves all analyzed articles and logs run completion stats.\n\nWithout Postgres, delivery w"
      }
    },
    {
      "id": "0d60f0c8-aead-4180-b649-5a5b813558ac",
      "name": "Warning — Anthropic API Cost",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4992,
        1008
      ],
      "parameters": {
        "width": 464,
        "height": 328,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n⚠️ **Requires Anthropic API key**\nAdd your key via n8n Credentials → Anthropic.\n\nQuick setup: [console.anthropic.com](https://console.anthropic.com) → API Keys → Create Key\nFull guide:"
      }
    },
    {
      "id": "077bd980-e9fc-464e-a343-94b6f5a97168",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        992
      ],
      "parameters": {
        "width": 784,
        "height": 864,
        "content": "## Optional: PostgreSQL\n\n  Set `use_postgres` to **true** in the config node to enable run tracking, article storage, and cross-day deduplication. The workflow runs fully without a database -- all fiv"
      }
    }
  ],
  "connections": {
    "Create run record": {
      "main": [
        [
          {
            "node": "Build feed source list",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Run daily at 6 AM": {
      "main": [
        [
          {
            "node": "⚙️ Configure digest settings",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch feed content": {
      "main": [
        [
          {
            "node": "Parse articles from feeds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Any articles found?": {
      "main": [
        [
          {
            "node": "Deduplicate by URL and title",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Mark run as empty",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build feed source list": {
      "main": [
        [
          {
            "node": "Fetch feed content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude Haiku (analyzer)": {
      "ai_languageModel": [
        [
          {
            "node": "Analyze article with Claude",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Score and rank articles": {
      "main": [
        [
          {
            "node": "Select articles for digest",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build article save query": {
      "main": [
        [
          {
            "node": "Save articles to database",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude Sonnet (compiler)": {
      "ai_languageModel": [
        [
          {
            "node": "Compile digest with Claude",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Initialize run timestamp": {
      "main": [
        [
          {
            "node": "Create run record",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare analysis prompts": {
      "main": [
        [
          {
            "node": "Analyze article with Claude",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse articles from feeds": {
      "main": [
        [
          {
            "node": "Any articles found?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Save articles to database": {
      "main": [
        [
          {
            "node": "Mark run as completed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Assemble extracted content": {
      "main": [
        [
          {
            "node": "Prepare analysis prompts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Compile digest with Claude": {
      "main": [
        [
          {
            "node": "Format multi-channel outputs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract full text via Jina": {
      "main": [
        [
          {
            "node": "Assemble extracted content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Select articles for digest": {
      "main": [
        [
          {
            "node": "Compile digest with Claude",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze article with Claude": {
      "main": [
        [
          {
            "node": "Score and rank articles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Deduplicate by URL and title": {
      "main": [
        [
          {
            "node": "Check database for recent duplicates",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format multi-channel outputs": {
      "main": [
        [
          {
            "node": "Send digest to Discord",
            "type": "main",
            "index": 0
          },
          {
            "node": "Send digest to Slack",
            "type": "main",
            "index": 0
          },
          {
            "node": "Build article save query",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Remove already-seen articles": {
      "main": [
        [
          {
            "node": "Select top articles for extraction",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "⚙️ Configure digest settings": {
      "main": [
        [
          {
            "node": "Initialize run timestamp",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Select top articles for extraction": {
      "main": [
        [
          {
            "node": "Extract full text via Jina",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check database for recent duplicates": {
      "main": [
        [
          {
            "node": "Remove already-seen articles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}