AutomationFlowsAI & RAG › Automate Morning Brew–style Reddit Digests and Publish to Dev Using AI

Automate Morning Brew–style Reddit Digests and Publish to Dev Using AI

ByAngel Menendez @djangelic on n8n.io

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

Cron / scheduled trigger★★★★☆ complexityAI-powered26 nodesRSS Feed Read@Brightdata/N8N Nodes BrightdataAgentOpenAI ChatGmailGoogle Gemini ChatHTTP Request
AI & RAG Trigger: Cron / scheduled Nodes: 26 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Agent → Gmail 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
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "7c36980c-0a71-4508-a4a6-af397d6b4d1d",
      "name": "RSS Read",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        240,
        152
      ],
      "parameters": {
        "url": "https://www.reddit.com/r/n8n.rss",
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "50ee913e-46bc-46e2-9416-97198faba1e3",
      "name": "Initiate batch extraction from URL",
      "type": "@brightdata/n8n-nodes-brightdata.brightData",
      "position": [
        912,
        152
      ],
      "parameters": {
        "urls": "={{ $json.data.toJsonString() }}",
        "resource": "webScrapper",
        "operation": "triggerCollectionByUrl",
        "dataset_id": {
          "__rl": true,
          "mode": "list",
          "value": "gd_lvz8ah06191smkebj4",
          "cachedResultName": "Reddit- Posts"
        },
        "requestOptions": {}
      },
      "credentials": {
        "brightdataApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "bd35cd68-270a-46eb-b05d-e698d344bf02",
      "name": "Extract URLs",
      "type": "n8n-nodes-base.set",
      "position": [
        464,
        152
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "11be4491-e850-4cec-8401-45592419e30f",
              "name": "url",
              "type": "string",
              "value": "={{ $json.link }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "42f27a49-f950-4759-b433-a13e765facea",
      "name": "Aggregate URLs to Single Object",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        688,
        152
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData"
      },
      "typeVersion": 1
    },
    {
      "id": "92ce2ec2-8f63-4dbf-85ed-c5be766d6710",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        1136,
        152
      ],
      "parameters": {
        "options": {
          "reset": true
        }
      },
      "typeVersion": 3
    },
    {
      "id": "08eee5cc-dc09-46f3-b71f-728307d0d44e",
      "name": "Check Snapshot Again for Success",
      "type": "n8n-nodes-base.noOp",
      "position": [
        1984,
        256
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "5056bdbc-6332-4121-8b9f-d4bca6d76a9e",
      "name": "Check the status of a batch extraction",
      "type": "@brightdata/n8n-nodes-brightdata.brightData",
      "position": [
        1360,
        160
      ],
      "parameters": {
        "resource": "webScrapper",
        "operation": "monitorProgressSnapshot",
        "snapshot_id": "={{ $json.snapshot_id }}",
        "requestOptions": {}
      },
      "credentials": {
        "brightdataApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "dc15490e-93cd-4e23-9531-0874b6a72630",
      "name": "Check if Batch Ready",
      "type": "n8n-nodes-base.if",
      "position": [
        1584,
        160
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "f5deab49-ea1c-456b-b61a-5458adf991a5",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "ready"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "4ed4650b-2fda-4f85-802c-9824f1e6572c",
      "name": "Wait 5 seconds",
      "type": "n8n-nodes-base.wait",
      "position": [
        1808,
        256
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "10df46b5-a8d3-4281-8771-37b01f717fc2",
      "name": "Download the snapshot content",
      "type": "@brightdata/n8n-nodes-brightdata.brightData",
      "position": [
        2224,
        144
      ],
      "parameters": {
        "resource": "webScrapper",
        "operation": "downloadSnapshot",
        "snapshot_id": "={{ $json.snapshot_id }}",
        "requestOptions": {}
      },
      "credentials": {
        "brightdataApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "87c4f679-17a4-4e08-a06b-be2fcb67a6fe",
      "name": "Extract Essential Data",
      "type": "n8n-nodes-base.set",
      "position": [
        2448,
        144
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "e30d65f3-a6be-4df2-8672-2f69633f9296",
              "name": "title",
              "type": "string",
              "value": "={{ $json.title }}"
            },
            {
              "id": "cc932518-35b3-42cc-9ed7-76b695c5607a",
              "name": "description",
              "type": "string",
              "value": "={{ $json.description }}"
            },
            {
              "id": "3cd26612-27f6-4d31-bfe0-7075d2c05a44",
              "name": "comments",
              "type": "array",
              "value": "={{ $json.comments }}"
            },
            {
              "id": "54b22b70-0c4c-4e68-975b-77fbf2112ede",
              "name": "post_id",
              "type": "string",
              "value": "={{ $json.post_id }}"
            },
            {
              "id": "189999eb-6f59-4810-be8f-dfd1f7f01ef5",
              "name": "url",
              "type": "string",
              "value": "={{ $json.url }}"
            },
            {
              "id": "332a53a2-4182-4490-adc3-1a87426c0ba1",
              "name": "num_upvotes",
              "type": "number",
              "value": "={{ $json.num_upvotes }}"
            },
            {
              "id": "2754e3a3-ee58-4c75-ae8c-296f4c1249a0",
              "name": "num_comments",
              "type": "number",
              "value": "={{ $json.num_comments }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "4e8af0c1-ebcb-4e2b-af25-46ba8800c946",
      "name": "Reduce Objects to 1",
      "type": "n8n-nodes-base.set",
      "position": [
        2672,
        144
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "00bbe5d7-c761-422c-a542-b32c0f59fd47",
              "name": "postdata",
              "type": "string",
              "value": "=Title: {{ $json.title }}\nDescription: {{ $json.description }}\nURL: {{ $json.url }}\nUpvotes: {{ $json.num_upvotes }}\nComment Count: {{ $json.num_comments }}\nComments: {{ $jmespath($json.comments, '[].{comment: comment, replies: replies[].reply}') \n   .map(item => ({\n     comment: item.comment || '',\n     replies: (item.replies || []).filter(r => r !== null)\n   })) \n   .toJsonString() }}\n"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "55eebf96-e009-4bb2-a1c2-d10666f5f8cb",
      "name": "Aggregate",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        2896,
        144
      ],
      "parameters": {
        "options": {},
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "postdata"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "9a8564aa-17d8-45ae-867b-5062df316301",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        3232,
        112
      ],
      "parameters": {
        "text": "={{ $json.postdata.join('\\n\\n') }}",
        "options": {
          "systemMessage": "You are an editorial AI that turns a daily bundle of Reddit posts into a Morning Brew\u2013style email newsletter in clean, inline-styled HTML (NO markdown, NO scripts, NO external CSS).\n\nGOAL\n- Produce a single HTML document, 600px max content width, mobile-friendly, with clearly labeled sections.\n- Voice: brisk, witty-but-professional, informative > clever. One smart joke per issue max.\n- Keep paragraphs short (1\u20133 sentences). Use bullets for scannability.\n\nINPUT\n- You receive `POSTS_JSON`: an array of objects. Each object has a single string field `postdata` that includes lines like:\n  - \"Title: \u2026\"\n  - \"Description: \u2026\"\n  - \"URL: \u2026\"\n  - \"Upvotes: \u2026\"\n  - \"Comment Count: \u2026\"\n  - \"Comments: \u2026\" where Comments may be empty, null, or a JSON string representing an array of `{comment: string, replies?: string[]}` OR an array of `{comment, replies}` already.\n- Treat missing/empty values as null/empty.\n- Strip boilerplate tokens like \"Read more\", \"View in app\".\n\nNORMALIZATION\n1) For each item, parse `postdata` into fields:\n   - title (string)\n   - description (string; trim whitespace; collapse repeated spaces)\n   - url (string; must be absolute)\n   - upvotes (integer; default 0)\n   - comment_count (integer; default 0)\n   - comments (array of strings). If Comments is:\n     - empty/missing \u2192 []\n     - JSON string \u2192 parse; flatten to strings: comment + all replies\n     - JSON array \u2192 flatten to strings: comment + replies\n2) Deduplicate by `url` (keep the highest (upvotes + comment_count) one).\n3) Score each post for ranking:\n   - score = upvotes*3 + comment_count*2\n   - Tie-breakers: longer, clearer descriptions win; then alphabetical by title.\n\nSECTIONS & COUNTS\n- Hero / Top Stories: top 3 by score (or fewer if <3 posts).\n- Quick Hits: next 5\u20138 items by score, single-sentence summaries.\n- Community Q&A: up to 3 items that are explicitly asking for help/feedback (detect with question marks, words like \u201chow\u201d, \u201chelp\u201d, \u201canyone\u201d, \u201cideas\u201d, \u201cwhat\u2019s the best\u201d, etc.).\n- Comment Spotlight: 3\u20135 notable comments (most informative/representative) across ALL posts, trimmed to \u2264200 chars each with ellipses if needed; include a source link to the parent post.\n- If a section has no items, omit the section entirely\u2014do not render empty headings.\n\nWRITING RULES\n- For Top Stories, each card includes:\n  - Title (linked)\n  - 1\u20132 sentence summary in your voice\n  - \"Why it matters\" (1\u20133 crisp bullets)\n  - \"By the numbers\" (optional; only if numeric facts exist)\n  - CTA link: \u201cDiscuss on r/n8n \u2192\u201d\n- For Quick Hits, 1 sentence + link.\n- For Community Q&A, surface the question in a bolded lead-in, then 1 sentence of context + link.\n- For Comment Spotlight, present the trimmed comment text in quotes plus a small source line with the post title linked.\n\nSTYLE & TONE\n- Morning Brew vibe: skimmable, concrete, conversational; avoid hype, avoid over-clever puns.\n- No first-person singular from the writer (\u201cI\u201d), use newsletter \u201cwe\u201d sparingly.\n- Avoid speculation; stick to what\u2019s in the source text.\n- Never fabricate links or numbers.\n\nHTML REQUIREMENTS\n- Output ONLY one complete HTML file. No JSON. No markdown.\n- Use a 100% width wrapper table and a centered 600px container table for email compatibility.\n- All styles must be inline; use system fonts.\n- Include a simple header with newsletter name and date, a nav row (Top Stories \u2022 Quick Hits \u2022 Community Q&A \u2022 Comment Spotlight) that anchors to sections if they exist.\n- Make links obvious and accessible (underline; target not set).\n- Sanitize all text: escape HTML special characters in titles/descriptions/comments.\n\nVARIABLES\n- If provided, use:\n  - {{newsletter_name}} (default: \"Automation Brew\")\n  - {{issue_date}} in America/Phoenix; format: \"Tuesday, August 19, 2025\"\n- If not provided, compute current date in America/Phoenix and format as above.\n\nTRIMMING & CLEANUP\n- Trim descriptions to ~50\u201380 words for Top Stories; ~25\u201335 words for Quick Hits.\n- Remove trailing boilerplate phrases (\u201cRead more\u201d, \u201cView in app\u201d, \u201cView in app Read more\u201d).\n- Collapse repeated whitespace/newlines in comments.\n- When comments exceed 200 chars in Spotlight, trim at a word boundary and append \u201c\u2026\u201d.\n\nACCESSIBILITY\n- Ensure sufficient contrast; include `alt` text on decorative dividers as empty `alt=\"\"`.\n- Use semantic headings (`<h1>`, `<h2>`) but keep inline styles for email.\n\nERROR/FALLBACK\n- If `POSTS_JSON` is empty or cannot be parsed, render a minimal HTML with the header and a single \u201cNo new posts today\u201d card and a link to r/n8n.\n\nOUTPUT TEMPLATE (fill with real content; remove any empty sections entirely)\n\n<!doctype html>\n<html>\n  <body style=\"margin:0;padding:0;background:#f6f7fb;\">\n    <table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"background:#f6f7fb;\">\n      <tr><td align=\"center\">\n        <table role=\"presentation\" width=\"600\" cellpadding=\"0\" cellspacing=\"0\" style=\"width:600px;max-width:600px;background:#ffffff;border-radius:8px;overflow:hidden;margin:24px 12px;\">\n          <!-- Header -->\n          <tr><td style=\"padding:20px 24px;border-bottom:1px solid #eee;\">\n            <h1 style=\"margin:0;font-family:Arial,Helvetica,sans-serif;font-size:22px;line-height:1.3;color:#111;\">\n              {{newsletter_name}}\n            </h1>\n            <div style=\"margin-top:4px;font-family:Arial,Helvetica,sans-serif;font-size:13px;color:#555;\">\n              {{issue_date}}\n            </div>\n          </td></tr>\n\n          <!-- Nav (render only if multiple sections present) -->\n          <tr><td style=\"padding:12px 24px;border-bottom:1px solid #eee;\">\n            <div style=\"font-family:Arial,Helvetica,sans-serif;font-size:13px;color:#333;\">\n              <!-- Conditionally include anchors that exist -->\n              <a href=\"#top-stories\" style=\"color:#1a73e8;text-decoration:underline;margin-right:12px;\">Top Stories</a>\n              <a href=\"#quick-hits\" style=\"color:#1a73e8;text-decoration:underline;margin-right:12px;\">Quick Hits</a>\n              <a href=\"#community-qa\" style=\"color:#1a73e8;text-decoration:underline;margin-right:12px;\">Community Q&A</a>\n              <a href=\"#comment-spotlight\" style=\"color:#1a73e8;text-decoration:underline;\">Comment Spotlight</a>\n            </div>\n          </td></tr>\n\n          <!-- Top Stories -->\n          <tr id=\"top-stories\"><td style=\"padding:16px 24px;\">\n            <h2 style=\"margin:8px 0 12px;font-family:Arial,Helvetica,sans-serif;font-size:18px;color:#111;\">Top Stories</h2>\n\n            <!-- Repeat for each top story -->\n            <!-- STORY CARD -->\n            <!--\n            <table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"margin-bottom:16px;border:1px solid #eee;border-radius:8px;\">\n              <tr><td style=\"padding:14px 16px;\">\n                <a href=\"POST_URL\" style=\"font-family:Arial,Helvetica,sans-serif;font-size:16px;color:#1a73e8;text-decoration:underline;font-weight:bold;\">POST_TITLE</a>\n                <div style=\"font-family:Arial,Helvetica,sans-serif;font-size:14px;color:#222;margin-top:6px;\">SUMMARY_SENTENCES</div>\n                <div style=\"font-family:Arial,Helvetica,sans-serif;font-size:13px;color:#111;margin-top:10px;font-weight:bold;\">Why it matters</div>\n                <ul style=\"padding-left:18px;margin:6px 0 0;font-family:Arial,Helvetica,sans-serif;font-size:13px;color:#333;\">\n                  <li>BULLET_1</li>\n                  <li>BULLET_2</li>\n                  <!-- Optional\n                  <li>BULLET_3</li> -->\n                </ul>\n                <!-- Optional By the numbers -->\n                <!-- <div style=\"font-family:Arial,Helvetica,sans-serif;font-size:13px;color:#111;margin-top:10px;font-weight:bold;\">By the numbers</div>\n                <ul style=\"padding-left:18px;margin:6px 0 0;font-family:Arial,Helvetica,sans-serif;font-size:13px;color:#333;\">\n                  <li>Upvotes: N \u2022 Comments: M</li>\n                </ul> -->\n                <div style=\"margin-top:10px;\">\n                  <a href=\"POST_URL\" style=\"font-family:Arial,Helvetica,sans-serif;font-size:13px;color:#1a73e8;text-decoration:underline;\">Discuss on r/n8n \u2192</a>\n                </div>\n              </td></tr>\n            </table>\n            -->\n          </td></tr>\n\n          <!-- Quick Hits -->\n          <tr id=\"quick-hits\"><td style=\"padding:8px 24px 16px;\">\n            <h2 style=\"margin:8px 0 12px;font-family:Arial,Helvetica,sans-serif;font-size:18px;color:#111;\">Quick Hits</h2>\n            <ul style=\"padding-left:18px;margin:0;font-family:Arial,Helvetica,sans-serif;font-size:14px;color:#222;\">\n              <!-- Repeat per item -->\n              <!-- <li>ONE_SENTENCE_SUMMARY <a href=\"POST_URL\" style=\"color:#1a73e8;text-decoration:underline;\">link</a></li> -->\n            </ul>\n          </td></tr>\n\n          <!-- Community Q&A -->\n          <tr id=\"community-qa\"><td style=\"padding:8px 24px 16px;\">\n            <h2 style=\"margin:8px 0 12px;font-family:Arial,Helvetica,sans-serif;font-size:18px;color:#111;\">Community Q&amp;A</h2>\n            <!-- Repeat per item -->\n            <!--\n            <div style=\"margin-bottom:12px;\">\n              <div style=\"font-family:Arial,Helvetica,sans-serif;font-size:14px;color:#111;font-weight:bold;\">QUESTION_HEADLINE</div>\n              <div style=\"font-family:Arial,Helvetica,sans-serif;font-size:14px;color:#222;margin-top:4px;\">ONE_SENTENCE_CONTEXT <a href=\"POST_URL\" style=\"color:#1a73e8;text-decoration:underline;\">Join the thread \u2192</a></div>\n            </div>\n            -->\n          </td></tr>\n\n          <!-- Comment Spotlight -->\n          <tr id=\"comment-spotlight\"><td style=\"padding:8px 24px 24px;\">\n            <h2 style=\"margin:8px 0 12px;font-family:Arial,Helvetica,sans-serif;font-size:18px;color:#111;\">Comment Spotlight</h2>\n            <!-- Repeat per comment -->\n            <!--\n            <div style=\"margin-bottom:10px;\">\n              <div style=\"font-family:Arial,Helvetica,sans-serif;font-size:14px;color:#222;\">\u201cTRIMMED_COMMENT_TEXT\u2026\u201d</div>\n              <div style=\"font-family:Arial,Helvetica,sans-serif;font-size:12px;color:#666;margin-top:2px;\">From <a href=\"POST_URL\" style=\"color:#1a73e8;text-decoration:underline;\">POST_TITLE</a></div>\n            </div>\n            -->\n          </td></tr>\n\n          <!-- Footer -->\n          <tr><td style=\"padding:18px 24px;border-top:1px solid #eee;background:#fafbff;\">\n            <div style=\"font-family:Arial,Helvetica,sans-serif;font-size:12px;color:#666;line-height:1.5;\">\n              You\u2019re receiving this because you subscribed to daily r/n8n highlights.\n              Content summarized from public Reddit posts. Links go to Reddit.\n            </div>\n          </td></tr>\n        </table>\n      </td></tr>\n    </table>\n  </body>\n</html>\n\nPROCESS\n1) Parse \u2192 normalize \u2192 dedupe \u2192 score.\n2) Select Top Stories (3), then Quick Hits (5\u20138), then Community Q&A (up to 3 based on question-ness).\n3) Build Comment Spotlight by scanning all comments for informative remarks (exclude reminders, bots, and \u201cplease share\u201d spam).\n4) Write summaries and bullets following the rules.\n5) Render the HTML template, omitting sections with no content.\n6) Output only the final HTML.\n"
        },
        "promptType": "define",
        "needsFallback": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "b982de15-e810-4790-ba9a-17ac85aa74ec",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        3184,
        336
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-5",
          "cachedResultName": "gpt-5"
        },
        "options": {
          "timeout": 30000
        }
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "b4d15d5e-0953-42cf-b693-80e9ed5a856d",
      "name": "Send a message",
      "type": "n8n-nodes-base.gmail",
      "position": [
        3712,
        96
      ],
      "parameters": {
        "sendTo": "user@example.com",
        "message": "={{ $json.output }}",
        "options": {},
        "subject": "Daily Digest "
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "0489905c-68c8-4aad-9871-3844fb20dfb6",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        3312,
        336
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "a23a7427-dcd5-446e-a6e5-df823dc4dc99",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        16,
        152
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "b4060c87-d977-4a04-8200-270724248ca6",
      "name": "Markdown",
      "type": "n8n-nodes-base.markdown",
      "position": [
        3712,
        320
      ],
      "parameters": {
        "html": "={{ $json.output }}",
        "options": {},
        "destinationKey": "markdown"
      },
      "typeVersion": 1
    },
    {
      "id": "8e6c8267-c2b4-4d23-8ee1-0e8728e84ef0",
      "name": "Publish to Dev.to",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3936,
        320
      ],
      "parameters": {
        "url": "https://dev.to/api/articles",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ (() => {\n  let s = $json.markdown ?? '';\n  if (typeof s !== 'string') s = String(s ?? '');\n\n  if (/\\\\[nrt`]/.test(s)) {\n    s = s.replace(/\\\\r\\\\n/g,'\\n').replace(/\\\\n/g,'\\n').replace(/\\\\t/g,'\\t').replace(/\\\\`/g,'`');\n  }\n\n  s = s.replace(/^\\s*(?:```[^\\n]*\\n|\\\\`\\\\`\\\\`[^\\n]*\\n)/, '');\n  s = s.replace(/(?:\\n)?(?:```+|\\\\`\\\\`\\\\`+)\\s*$/, '');\n  s = s.replace(/\\r\\n/g,'\\n');\n\n  s = s.replace(/^(?:\\s*\\|?\\s*[-:| ]+)+\\s*$/gm,'');\n  s = s.replace(/^\\s*\\|\\s?/gm,'');\n  s = s.replace(/\\s+\\|\\s+/g,' \u2022 ');\n\n  s = s.replace(/(^|\\n)\\s*(Top Stories|Quick Hits|Community Q&A|Comment Spotlight)\\s*(?=\\n|$)/g, '\\n## $2\\n');\n\n  s = s.replace(/(^|\\n)\\s*\\[([^\\]]+)\\]\\(([^)]+)\\)/g, '\\n### [$2]($3)\\n');\n\n  s = s.replace(/\\bWhy it matters\\b/g, '\\n\\n**Why it matters**\\n');\n  s = s.replace(/\\bBy the numbers\\b/g, '\\n\\n**By the numbers**\\n');\n\n  s = s.replace(/\\)\\s+(?=\\[)/g, ')\\n\\n[');\n  s = s.replace(/(^|\\n)(#{1,6}\\s+[^\\n]+)\\n(?!\\n)/g, '$1$2\\n\\n');\n  s = s.replace(/\\n{3,}/g,'\\n\\n').trim();\n\n  return {\n    article: {\n      title: `Reddit Daily Digest n8n Summary for ${$now.format('MM-dd-yyyy')} Workflow`,\n      body_markdown: s,\n      published: true,\n      description: 'A daily digest of n8n reddit posts for today.',\n      tags: ['n8n']\n    }\n  };\n})() }}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpCustomAuth",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-type",
              "value": "application/json"
            }
          ]
        }
      },
      "credentials": {
        "httpCustomAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "efbe61ff-2919-4abb-a16d-5ec7ec9194b9",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -16,
        0
      ],
      "parameters": {
        "color": 7,
        "width": 864,
        "height": 480,
        "content": "## Get most recent reddit posts"
      },
      "typeVersion": 1
    },
    {
      "id": "5282cddd-0290-460a-b428-d83bbf36f204",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        864,
        0
      ],
      "parameters": {
        "color": 7,
        "width": 1504,
        "height": 480,
        "content": "## Pass Posts to Bright Data to get comment and upvote data"
      },
      "typeVersion": 1
    },
    {
      "id": "6dd01817-fea1-4a81-85c7-6c6b6fe32aa3",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2384,
        0
      ],
      "parameters": {
        "color": 7,
        "width": 640,
        "height": 480,
        "content": "## Prep output for LLM"
      },
      "typeVersion": 1
    },
    {
      "id": "6b916ef9-aa05-4e70-8d46-d84fe839126f",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3040,
        0
      ],
      "parameters": {
        "color": 7,
        "width": 544,
        "height": 480,
        "content": "## Convert posts to summary"
      },
      "typeVersion": 1
    },
    {
      "id": "f1c9c7f9-c43d-4b7b-b890-33fdbfd59f84",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3600,
        0
      ],
      "parameters": {
        "color": 7,
        "width": 384,
        "height": 240,
        "content": "## Send HTML email newsletter"
      },
      "typeVersion": 1
    },
    {
      "id": "e7f15b40-9c0b-4ac0-bb46-b5739ae413cc",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3600,
        256
      ],
      "parameters": {
        "color": 7,
        "width": 560,
        "height": 224,
        "content": "## Convert and Post to Dev.to"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "AI Agent": {
      "main": [
        [
          {
            "node": "Send a message",
            "type": "main",
            "index": 0
          },
          {
            "node": "Markdown",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Markdown": {
      "main": [
        [
          {
            "node": "Publish to Dev.to",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "RSS Read": {
      "main": [
        [
          {
            "node": "Extract URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract URLs": {
      "main": [
        [
          {
            "node": "Aggregate URLs to Single Object",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 5 seconds": {
      "main": [
        [
          {
            "node": "Check Snapshot Again for Success",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [],
        [
          {
            "node": "Check the status of a batch extraction",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "RSS Read",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Reduce Objects to 1": {
      "main": [
        [
          {
            "node": "Aggregate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check if Batch Ready": {
      "main": [
        [
          {
            "node": "Download the snapshot content",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait 5 seconds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Essential Data": {
      "main": [
        [
          {
            "node": "Reduce Objects to 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 1
          }
        ]
      ]
    },
    "Download the snapshot content": {
      "main": [
        [
          {
            "node": "Extract Essential Data",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Aggregate URLs to Single Object": {
      "main": [
        [
          {
            "node": "Initiate batch extraction from URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Snapshot Again for Success": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Initiate batch extraction from URL": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check the status of a batch extraction": {
      "main": [
        [
          {
            "node": "Check if Batch Ready",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

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

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

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

AI powered workflow that scans HR news via RSS, checks which of your policies or contract templates might need updates, and sends a weekly internal newsletter as HTML.

RSS Feed Read, HTTP Request, Google Drive +5
AI & RAG

The Multi-Model Agency Content Engine is a high-performance editorial system designed for agencies. It solves the "blank page" problem by alternating between real-world social proof and strategic expe

Google Sheets, Gmail, Google Drive +6
AI & RAG

V2 (2026) available! An intelligent, fully automated news aggregation system that collects articles from multiple sources (RSS feeds + Google Search), uses AI to classify and summarize the most import

N8N Nodes Serpapi, Text Classifier, Output Parser Structured +6
AI & RAG

kisisel asistan. Uses toolWorkflow, toolHttpRequest, toolCalculator, toolThink. Scheduled trigger; 43 nodes.

Tool Workflow, Tool Http Request, Tool Calculator +15
AI & RAG

This workflow automates the process of generating, reviewing, and publishing blog posts across multiple platforms, now enhanced with support for RSS Feeds as a content source. It streamlines the manag

HTTP Request, Html Extract, RSS Feed Read +9