{"workflow":{"id":12748,"name":"Send 24-hour Hacker News trends to Telegram with OpenRouter AI translation","views":38,"recentViews":0,"totalViews":38,"createdAt":"2026-01-16T05:47:18.884Z","description":"Stay ahead of the curve with this smart Hacker News monitor. Unlike simple RSS feeds, this workflow uses a custom \"Gravity Score\" algorithm to identify rising trends and filter out noise, pushing a clean, summarized digest to your Telegram.\n\n## ✨ Key Features\n- 🧠 Smart Algorithms:\n\n\t- Gravity Score: Calculates popularity based on points, comments, and time (velocity), ensuring you see trending stories, not just old ones.\n\n\t- Noise Filtering: Automatically discards \"infancy\" posts (new posts with zero engagement) to keep your feed high-quality.\n\n- 🤖 Optional AI Translation: Includes an AI Agent (via OpenRouter/LLM) to translate titles and summaries into your local language (e.g., Chinese, Spanish, French).\n\n&gt; Don't need translation? Simply delete the `Translate` node and connect the `Filter` node directly to the `Combine message templates` node.\n\n- 📱 Beautiful Telegram Format: Delivers a clean HTML-formatted digest with clickable links, stats (Points/Comments), and story previews.\n\n## ⚙️ How It Works\n1. Schedule: Runs every 4 hours (configurable) to fetch data from the past 24 hours via the Algolia API.\n\n2. Analyze: Calculates the velocity score for each post and filters out low-quality entries.\n\n3. Translate (Optional): Uses an LLM to translate the content. You can customize the target language in the AI Agent's system prompt.\n\n4. Format & Send: Combines the data into a structured message and pushes it to your Telegram Chat/Channel.\n\n## 📝 Setup Instructions\n1. Telegram Credentials:\n\n- Create a bot via `@BotFather`.\n\n- Add the Bot Token to the Telegram node credentials.\n\n- Get Chat ID.\n\n2. AI Configuration (Optional):\n\n- Configure your LLM credentials (e.g., OpenRouter, OpenAI).\n\n- In the \"Translate\" (AI Agent) node, edit the System Prompt to change the target language (Default is set to translate to Chinese).\n\n## 👀 Output Example\n```html\n🚨 Hacker News 24H Trending Alert\n📉 Top stories captured: 5\n\n🔥 Ask HN: How can we solve the loneliness epidemic?\n📈 16.39 | 💬 796 | ⭐️ 482\n🕒 Posted 12.7 hours ago\n&gt; Countless voiceless people sit alone every day...\n\n🔥 Show HN: Gambit, an open-source agent harness\n📈 2.20 | 💬 11 | ⭐️ 58\n🕒 Posted 5.3 hours ago\n&gt; Wanted to show our open source agent harness...\n```","workflow":{"id":"n8PjlpfC2Fudq3QA","meta":{"instanceId":"6cacdb39bbda9f4209efb6f593398a0e8a631a4b8e447a94894664dae41c048f","templateCredsSetupCompleted":true},"name":"Hacker News 24H Trend to Telegram & AI Translator","tags":[{"id":"tQPxiOWM4dsxfpPF","name":"hacker news","createdAt":"2026-01-07T16:53:06.456Z","updatedAt":"2026-01-07T16:53:06.456Z"}],"nodes":[{"id":"57574ba6-49e8-4d19-b7d0-1ea4a7b747af","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[352,-224],"parameters":{"color":5,"width":592,"height":352,"content":"# Hacker News Trend Tracking\rTrack popular via https://hn.algolia.com/api\r\r## Sliding Window\rTimer (Trigger): Run every 4 hours. Lookback: Fetch data from the past 24 hours.\r\r- Define a rule—\"Posts published less than 1 hour ago and with extremely low interaction (<3 points) are considered noise and should be discarded directly.\"\r- If a post receives 20 likes in just 10 minutes (extremely explosive), we should keep it; but if it only gets 1 like after 10 minutes (normal situation), we temporarily ignore it and wait for the next scheduled task (e.g., 4 hours later) to evaluate it when it \"matures.\""},"typeVersion":1},{"id":"6a607aac-b15f-46d8-901c-a53d9099a08d","name":"Filter","type":"n8n-nodes-base.filter","position":[1200,176],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"f3c26f60-2368-4461-9f2e-3072acb1f7b1","operator":{"type":"number","operation":"gt"},"leftValue":"={{ $json.analysis.velocity_score }}","rightValue":1}]}},"typeVersion":2.3},{"id":"f0fbb4ac-164c-483c-b0eb-2bfedab2e2a0","name":"Schedule Trigger","type":"n8n-nodes-base.scheduleTrigger","position":[368,176],"parameters":{"rule":{"interval":[{"field":"hours","hoursInterval":4}]}},"typeVersion":1.3},{"id":"ba782266-418a-4d19-90bf-255f0f955cb9","name":"Send a text message","type":"n8n-nodes-base.telegram","position":[2096,176],"webhookId":"895493a9-d9aa-45fa-a820-fc4dbcd0b12f","parameters":{"text":"={{ $json.text }}","chatId":"YourChatID","additionalFields":{"parse_mode":"HTML"}},"credentials":{"telegramApi":{"id":"Vg9tqgB7zfuUTKOa","name":"Telegram-CryoZeroRssBot"}},"typeVersion":1.2},{"id":"fd96243b-229e-436d-91ea-b31438f175a8","name":"OpenRouter Chat Model1","type":"@n8n/n8n-nodes-langchain.lmChatOpenRouter","position":[1248,416],"parameters":{"model":"google/gemini-2.5-flash-lite","options":{}},"credentials":{"openRouterApi":{"id":"Vrxh3phbAgkNakcX","name":"OpenRouter-William"}},"typeVersion":1},{"id":"7eaefa3f-577d-4809-895b-49d03e23495a","name":"Algolia parameters","type":"n8n-nodes-base.code","position":[576,176],"parameters":{"jsCode":"// @see https://hn.algolia.com/api\n\nconst now = DateTime.now();\n// Observation window (past X hours)\nconst lookBackHours = 24;\nconst startTime = Math.floor(now.minus({hours: lookBackHours}).toSeconds())\n\nconst numericFilters = [\n  `created_at_i>${startTime}`,\n  // Filter out noise/spam (posts with zero engagement)\n  \"points>1\",\n];\n\nreturn [{\n  json: {\n    tags: \"(ask_hn,show_hn)\",\n    startTime: now.minus({hours: lookBackHours}),\n    numericFilters: numericFilters.join(\",\"),\n    // Fetch maximum allowed items per page\n    hitsPerPage: 1000\n  }\n}]"},"typeVersion":2},{"id":"b346f0d8-f5c1-4161-af9f-75059735f0f4","name":"Recalculate popularity score","type":"n8n-nodes-base.code","position":[992,176],"parameters":{"jsCode":"const hits = items[0].json.hits;\n\nconst now = DateTime.now();\n\nconst cleanData = hits.map(item => {\n  const postedTime = DateTime.fromISO(item.created_at);\n  // Calculate post age (in hours)\n  const ageInHours = now.diff(postedTime, 'hours').hours;\n  const points = item.points || 0;\n  const comments = item.num_comments || 0;\n\n  // --- Strategy 1: Infancy Filtering (The Buffer) ---\n  // If the post is less than 1 hour old and has fewer than 5 points, it is still \"baking\"\n  // and lacks analysis value for now. Skip it.\n  if (ageInHours < 1.0 && points < 5) {\n        return null; // Mark for removal\n  }\n\n  // --- Strategy 2: Recalculate Heat Score (Gravity Score) ---\n  const rawScore = points + (comments * 2);\n  const gravity = 1.8;\n  const normalizedScore = (rawScore - 1) / Math.pow(ageInHours + 2, gravity);\n\n  return {\n      ...item,\n      analysis: {\n          age_hours: parseFloat(ageInHours.toFixed(2)),\n          velocity_score: parseFloat(normalizedScore.toFixed(4)),\n      }\n  };\n})\n.filter(item => item !== null) // Filter out the new posts marked as null above\n.sort((a, b) => b.analysis.velocity_score - a.analysis.velocity_score);\n\nreturn cleanData.map(item => ({ json: item }));"},"typeVersion":2},{"id":"105d6b96-622a-4956-bf77-77c69b814ef0","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[1376,352],"parameters":{"color":6,"width":272,"content":"### 👆 Replace with your target language\nMust be Spanish, French, Chinese, Japanese..."},"typeVersion":1},{"id":"19c8577a-7191-45c5-b6b8-60a8be70ed5d","name":"Translate","type":"@n8n/n8n-nodes-langchain.agent","onError":"continueRegularOutput","position":[1376,176],"parameters":{"text":"=title: {{ JSON.stringify($json.title) }}\nstory_text: {{ JSON.stringify($json.story_text) }}","options":{"systemMessage":"You are a professional news media translation API.\n\nYour Task:\nTranslate the 'title' and 'story_text' into Chinese.\nIf 'story_text' is empty, keep the original text.\n\nHTML Handling:\n1. Remove all HTML tags.\n2. If an HTML tag is a link (<a href=\"...\">), convert it to Markdown format: [text](url).\n\nOutput Rules:\nReturn ONLY a valid JSON object. Do not include markdown formatting (like ```json) or any conversational text.\n\nExample:\nInput:\ntitle: \"hi\"\nstory_text: \"hello world\"\n\nOutput:\n{\n  \"title\": \"嗨\",\n  \"story_text\": \"你好世界\"\n}"},"promptType":"define"},"typeVersion":3.1},{"id":"aeefe4c7-1603-4e57-b7a0-d373dcddf67d","name":"Request Algolia","type":"n8n-nodes-base.httpRequest","position":[784,176],"parameters":{"url":"http://hn.algolia.com/api/v1/search_by_date","options":{},"sendQuery":true,"queryParameters":{"parameters":[{"name":"tags","value":"={{ $json.tags }}"},{"name":"numericFilters","value":"={{ $json.numericFilters }}"},{"name":"hitsPerPage","value":"={{ $json.hitsPerPage }}"}]}},"typeVersion":4.3},{"id":"48997584-e40b-4a2d-bcaa-f1de24a6ad6b","name":"Merge translation results","type":"n8n-nodes-base.code","position":[1680,176],"parameters":{"jsCode":"// Retrieve all original data from the 'Filter' node (since the AI Agent node replaces the original input data)\n// Note: Ensure the upstream node is named 'Filter'. If you renamed it, update the reference here accordingly.\nconst originalItems = $('Filter').all();\n\nreturn items.map((item, index) => {\n  // 1. Get the output text from the AI Agent\n  const aiOutputString = item.json.output || \"\";\n\n  // 2. Sanitize the data (remove Markdown formatting like ```json ... ``` if added by the AI)\n  const cleanJsonString = aiOutputString.replace(/```json/g, '').replace(/```/g, '').trim();\n\n  let translatedData = {};\n\n  // 3. Attempt to parse the JSON string\n  try {\n    translatedData = JSON.parse(cleanJsonString);\n  } catch (error) {\n    // If parsing fails, retain the raw text for debugging purposes\n    translatedData = {\n      translation_error: true,\n      raw_ai_response: aiOutputString\n    };\n  }\n\n  // 4. Merge original data with the translated data\n  const originalData = originalItems[index] ? originalItems[index].json : {};\n\n  return {\n    json: {\n      ...originalData,   // Preserve original fields (e.g., url, objectID)\n      ...translatedData  // Add new translated fields (e.g., title_cn, story_cn)\n    }\n  };\n});"},"typeVersion":2},{"id":"28dba153-23d5-4c12-a786-605cb236040d","name":"Combine message templates","type":"n8n-nodes-base.code","position":[1872,176],"parameters":{"jsCode":"const items = $input.all();\n\n// --- Helper Functions ---\n\n// HTML escape (prevents < > & errors)\nfunction escapeHtml(text) {\n    if (!text) return \"\";\n    return text\n        .replace(/&/g, \"&amp;\")\n        .replace(/</g, \"&lt;\")\n        .replace(/>/g, \"&gt;\");\n}\n\n// Clean and truncate text\nfunction cleanAndTruncate(story_text = \"\") {\n    if (!story_text) return \"\";\n    \n    // 1. Convert HTML tags to newlines or empty strings\n    let cleaned = story_text\n        .replace(/<p>/g, \"\\n\")      // p tag to newline\n        .replace(/<br>/g, \"\\n\")     // br tag to newline\n        .replace(/<[^>]+>/g, \"\")    // Remove all other HTML tags\n        .replace(/&quot;/g, '\"')\n        .replace(/&#x27;/g, \"'\")\n        .replace(/&amp;/g, \"&\");\n\n    // 2. Truncation logic (limit to 120 characters)\n    if (cleaned.length > 120) {\n        cleaned = cleaned.substring(0, 120) + \"...\";\n    }\n\n    // 3. Escape output\n    return escapeHtml(cleaned);\n}\n\n// --- Main Logic ---\n\nconst count = items.length;\nlet message = \"\";\n\n// 1. Header Information\nmessage += `<b>🚨 Hacker News 24H Trending Alert</b>\\n`;\nmessage += `📉 Top stories captured: <b>${count}</b>\\n`; \nmessage += `\\n`; // Extra empty line to separate the header\n\nconst contents = [];\n\nfor (const item of items) {\n    const data = item.json;\n    let content = \"\";\n\n    // A. Title (with link)\n    const safeTitle = escapeHtml(data.title);\n    const hnLink = `https://news.ycombinator.com/item?id=${data.objectID}`;\n    content += `🔥 <a href=\"${hnLink}\">${safeTitle}</a>\\n`;\n\n    // B. Data row (aligned using Code style)\n    const score = parseFloat(data.analysis.velocity_score || 0).toFixed(2);\n    const age = parseFloat(data.analysis.age_hours || 0).toFixed(1);\n    \n    content += `<code>📈 ${score} | 💬 ${data.num_comments} | ⭐️ ${data.points}</code>\\n`;\n    content += `🕒 Posted ${age} hours ago\\n`;\n\n    // C. Content preview (only shown if story_text exists and is not empty)\n    if (data.story_text && data.story_text.trim().length > 0) {\n        content += `<blockquote>${cleanAndTruncate(data.story_text)}</blockquote>`;\n    }\n    \n    contents.push(content);\n}\n\n// --- Combine Output ---\nconst separator = \"\\n\";\n\nreturn {\n    json: {\n        // If no stories, do not join, just output header\n        text: message + (contents.length > 0 ? contents.join(separator) : \"\")\n    }\n};"},"typeVersion":2},{"id":"ff3c82ac-4846-4744-96a3-0d70c20008be","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[2096,336],"parameters":{"color":6,"width":448,"height":208,"content":"### 👆 Replace this with your ChatID\n1. **Credentials**: Create a bot via @BotFather and save the Token in the credentials.\n2. **Chat ID**:\n   - For **Personal**: Search @userinfobot to get your ID.\n   - For **Channel**: Add your bot as an **Administrator** to the channel. The Chat ID is usually the channel link suffix (e.g., -100xxxxxxx).\n3. **Important**: Ensure the bot has permission to post messages!"},"typeVersion":1}],"active":false,"pinData":{},"settings":{"timezone":"Etc/UTC","callerPolicy":"workflowsFromSameOwner","timeSavedMode":"fixed","availableInMCP":false,"executionOrder":"v1"},"versionId":"44526615-7197-46a5-bbdf-91512e5059ee","connections":{"Filter":{"main":[[{"node":"Translate","type":"main","index":0}]]},"Translate":{"main":[[{"node":"Merge translation results","type":"main","index":0}]]},"Request Algolia":{"main":[[{"node":"Recalculate popularity score","type":"main","index":0}]]},"Schedule Trigger":{"main":[[{"node":"Algolia parameters","type":"main","index":0}]]},"Algolia parameters":{"main":[[{"node":"Request Algolia","type":"main","index":0}]]},"OpenRouter Chat Model1":{"ai_languageModel":[[{"node":"Translate","type":"ai_languageModel","index":0}]]},"Combine message templates":{"main":[[{"node":"Send a text message","type":"main","index":0}]]},"Merge translation results":{"main":[[{"node":"Combine message templates","type":"main","index":0}]]},"Recalculate popularity score":{"main":[[{"node":"Filter","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":13,"nodeTypes":{"n8n-nodes-base.code":{"count":4},"n8n-nodes-base.filter":{"count":1},"n8n-nodes-base.telegram":{"count":1},"n8n-nodes-base.stickyNote":{"count":3},"n8n-nodes-base.httpRequest":{"count":1},"@n8n/n8n-nodes-langchain.agent":{"count":1},"n8n-nodes-base.scheduleTrigger":{"count":1},"@n8n/n8n-nodes-langchain.lmChatOpenRouter":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"CryoZeroLabs","username":"cryozero","bio":"","verified":false,"links":["https://x.com/cryozerolabs"],"avatar":"https://gravatar.com/avatar/63b4f414e5e13e4117deba8d263fd56cdb8c9bed5139fbc51e3446d15b3e194e?r=pg&d=retro&size=200"},"nodes":[{"id":19,"icon":"file:httprequest.svg","name":"n8n-nodes-base.httpRequest","codex":{"data":{"alias":["API","Request","URL","Build","cURL"],"resources":{"generic":[{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/","icon":"✍️","label":"Learn how to automatically cross-post your content with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/","icon":" 🪢","label":"What are APIs and how to use them with no code"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/world-poetry-day-workflow/","icon":"📜","label":"Celebrating World Poetry Day with a daily poem in Telegram"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automate-designs-with-bannerbear-and-n8n/","icon":"🎨","label":"Automate Designs with Bannerbear and n8n"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/how-to-use-the-http-request-node-the-swiss-army-knife-for-workflow-automation/","icon":"🧰","label":"How to use the HTTP Request Node - The Swiss Army Knife for Workflow Automation"},{"url":"https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/","icon":"🦄","label":"Learn how to use webhooks with Mattermost slash commands"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"},{"url":"https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/","icon":"🤟","label":"Creating scheduled text affirmations with n8n"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"output\"]","defaults":{"name":"HTTP Request","color":"#0004F5"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCAyMEM0MCA4Ljk1MzE0IDMxLjA0NjkgMCAyMCAwQzguOTUzMTQgMCAwIDguOTUzMTQgMCAyMEMwIDMxLjA0NjkgOC45NTMxNCA0MCAyMCA0MEMzMS4wNDY5IDQwIDQwIDMxLjA0NjkgNDAgMjBaTTIwIDM2Ljk0NThDMTguODg1MiAzNi45NDU4IDE3LjEzNzggMzUuOTY3IDE1LjQ5OTggMzIuNjk4NUMxNC43OTY0IDMxLjI5MTggMTQuMTk2MSAyOS41NDMxIDEzLjc1MjYgMjcuNjg0N0gyNi4xODk4QzI1LjgwNDUgMjkuNTQwMyAyNS4yMDQ0IDMxLjI5MDEgMjQuNTAwMiAzMi42OTg1QzIyLjg2MjIgMzUuOTY3IDIxLjExNDggMzYuOTQ1OCAyMCAzNi45NDU4Wk0xMi45MDY0IDIwQzEyLjkwNjQgMjEuNjA5NyAxMy4wMDg3IDIzLjE2NCAxMy4yMDAzIDI0LjYzMDVIMjYuNzk5N0MyNi45OTEzIDIzLjE2NCAyNy4wOTM2IDIxLjYwOTcgMjcuMDkzNiAyMEMyNy4wOTM2IDE4LjM5MDMgMjYuOTkxMyAxNi44MzYgMjYuNzk5NyAxNS4zNjk1SDEzLjIwMDNDMTMuMDA4NyAxNi44MzYgMTIuOTA2NCAxOC4zOTAzIDEyLjkwNjQgMjBaTTIwIDMuMDU0MTlDMjEuMTE0OSAzLjA1NDE5IDIyLjg2MjIgNC4wMzA3OCAyNC41MDAxIDcuMzAwMzlDMjUuMjA2NiA4LjcxNDA4IDI1LjgwNzIgMTAuNDA2NyAyNi4xOTIgMTIuMzE1M0gxMy43NTAxQzE0LjE5MzMgMTAuNDA0NyAxNC43OTQyIDguNzEyNTQgMTUuNDk5OCA3LjMwMDY0QzE3LjEzNzcgNC4wMzA4MyAxOC44ODUxIDMuMDU0MTkgMjAgMy4wNTQxOVpNMzAuMTQ3OCAyMEMzMC4xNDc4IDE4LjQwOTkgMzAuMDU0MyAxNi44NjE3IDI5LjgyMjcgMTUuMzY5NUgzNi4zMDQyQzM2LjcyNTIgMTYuODQyIDM2Ljk0NTggMTguMzk2NCAzNi45NDU4IDIwQzM2Ljk0NTggMjEuNjAzNiAzNi43MjUyIDIzLjE1OCAzNi4zMDQyIDI0LjYzMDVIMjkuODIyN0MzMC4wNTQzIDIzLjEzODMgMzAuMTQ3OCAyMS41OTAxIDMwLjE0NzggMjBaTTI2LjI3NjcgNC4yNTUxMkMyNy42MzY1IDYuMzYwMTkgMjguNzExIDkuMTMyIDI5LjM3NzQgMTIuMzE1M0gzNS4xMDQ2QzMzLjI1MTEgOC42NjggMzAuMTA3IDUuNzgzNDYgMjYuMjc2NyA0LjI1NTEyWk0xMC42MjI2IDEyLjMxNTNINC44OTI5M0M2Ljc1MTQ3IDguNjY3ODQgOS44OTM1MSA1Ljc4MzQxIDEzLjcyMzIgNC4yNTUxM0MxMi4zNjM1IDYuMzYwMjEgMTEuMjg5IDkuMTMyMDEgMTAuNjIyNiAxMi4zMTUzWk0zLjA1NDE5IDIwQzMuMDU0MTkgMjEuNjAzIDMuMjc3NDMgMjMuMTU3NSAzLjY5NDg0IDI0LjYzMDVIMTAuMTIxN0M5Ljk0NjE5IDIzLjE0MiA5Ljg1MjIyIDIxLjU5NDMgOS44NTIyMiAyMEM5Ljg1MjIyIDE4LjQwNTcgOS45NDYxOSAxNi44NTggMTAuMTIxNyAxNS4zNjk1SDMuNjk0ODRDMy4yNzc0MyAxNi44NDI1IDMuMDU0MTkgMTguMzk3IDMuMDU0MTkgMjBaTTI2LjI3NjYgMzUuNzQyN0MyNy42MzY1IDMzLjYzOTMgMjguNzExIDMwLjg2OCAyOS4zNzc0IDI3LjY4NDdIMzUuMTA0NkMzMy4yNTEgMzEuMzMyMiAzMC4xMDY4IDM0LjIxNzkgMjYuMjc2NiAzNS43NDI3Wk0xMy43MjM0IDM1Ljc0MjdDOS44OTM2OSAzNC4yMTc5IDYuNzUxNTUgMzEuMzMyNCA0Ljg5MjkzIDI3LjY4NDdIMTAuNjIyNkMxMS4yODkgMzAuODY4IDEyLjM2MzUgMzMuNjM5MyAxMy43MjM0IDM1Ljc0MjdaIiBmaWxsPSIjM0E0MkU5Ii8+Cjwvc3ZnPgo="},"displayName":"HTTP Request","typeVersion":4,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":49,"icon":"file:telegram.svg","name":"n8n-nodes-base.telegram","codex":{"data":{"alias":["human","form","wait","hitl","approval"],"resources":{"generic":[{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/","icon":"🤬","label":"Create a toxic language detector for Telegram in 4 step"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/world-poetry-day-workflow/","icon":"📜","label":"Celebrating World Poetry Day with a daily poem in Telegram"},{"url":"https://n8n.io/blog/using-automation-to-boost-productivity-in-the-workplace/","icon":"💪","label":"Using Automation to Boost Productivity in the Workplace"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/","icon":"🤟","label":"Creating scheduled text affirmations with n8n"},{"url":"https://n8n.io/blog/creating-telegram-bots-with-n8n-a-no-code-platform/","icon":"💬","label":"Creating Telegram Bots with n8n, a No-Code Platform"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.telegram/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/telegram/"}]},"categories":["Communication","HITL"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"HITL":["Human in the Loop"]}}},"group":"[\"output\"]","defaults":{"name":"Telegram"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgNjYgNjYiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0ibm9uZSI+PHBhdGggZmlsbD0iIzM3YWVlMiIgZD0iTTAgMzJjMCAxNy42NzMgMTQuMzI3IDMyIDMyIDMyczMyLTE0LjMyNyAzMi0zMlM0OS42NzMgMCAzMiAwIDAgMTQuMzI3IDAgMzIiLz48cGF0aCBmaWxsPSIjYzhkYWVhIiBkPSJtMjEuNjYxIDM0LjMzOCAzLjc5NyAxMC41MDhzLjQ3NS45ODMuOTgzLjk4MyA4LjA2OC03Ljg2NCA4LjA2OC03Ljg2NGw4LjQwNy0xNi4yMzctMjEuMTE5IDkuODk4eiIvPjxwYXRoIGZpbGw9IiNhOWM2ZDgiIGQ9Im0yNi42OTUgMzcuMDM0LS43MjkgNy43NDZzLS4zMDUgMi4zNzMgMi4wNjggMGw0LjY0NC00LjIwMyIvPjxwYXRoIGQ9Im0yMS43MyAzNC43MTItNy44MDktMi41NDVzLS45MzItLjM3OC0uNjMzLTEuMjM3Yy4wNjItLjE3Ny4xODYtLjMyOC41NTktLjU4OCAxLjczMS0xLjIwNiAzMi4wMjgtMTIuMDk2IDMyLjAyOC0xMi4wOTZzLjg1Ni0uMjg4IDEuMzYxLS4wOTdjLjIzMS4wODguMzc4LjE4Ny41MDMuNTQ4LjA0NS4xMzIuMDcxLjQxMS4wNjguNjg5LS4wMDMuMjAxLS4wMjcuMzg2LS4wNDUuNjc4LS4xODQgMi45NzgtNS43MDYgMjUuMTk4LTUuNzA2IDI1LjE5OHMtLjMzIDEuMy0xLjUxNCAxLjM0NWMtLjQzMi4wMTYtLjk1Ni0uMDcxLTEuNTgyLS42MS0yLjMyMy0xLjk5OC0xMC4zNTItNy4zOTQtMTIuMTI2LTguNThhLjM0LjM0IDAgMCAxLS4xNDYtLjIzOWMtLjAyNS0uMTI1LjEwOC0uMjguMTA4LS4yOHMxMy45OC0xMi40MjcgMTQuMzUyLTEzLjczMWMuMDI5LS4xMDEtLjA3OS0uMTUxLS4yMjYtLjEwNy0uOTI5LjM0Mi0xNy4wMjUgMTAuNTA2LTE4LjgwMSAxMS42MjktLjEwNC4wNjYtLjM5NS4wMjMtLjM5NS4wMjMiLz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Telegram","typeVersion":1,"nodeCategories":[{"id":6,"name":"Communication"},{"id":28,"name":"HITL"}]},{"id":565,"icon":"fa:sticky-note","name":"n8n-nodes-base.stickyNote","codex":{"data":{"alias":["Comments","Notes","Sticky"],"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\"]","defaults":{"name":"Sticky Note","color":"#FFD233"},"iconData":{"icon":"sticky-note","type":"icon"},"displayName":"Sticky Note","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":834,"icon":"file:code.svg","name":"n8n-nodes-base.code","codex":{"data":{"alias":["cpde","Javascript","JS","Python","Script","Custom Code","Function"],"details":"The Code node allows you to execute JavaScript in your workflow.","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Code"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Code","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":839,"icon":"fa:clock","name":"n8n-nodes-base.scheduleTrigger","codex":{"data":{"alias":["Time","Scheduler","Polling","Cron","Interval"],"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\",\"schedule\"]","defaults":{"name":"Schedule Trigger","color":"#31C49F"},"iconData":{"icon":"clock","type":"icon"},"displayName":"Schedule Trigger","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":844,"icon":"fa:filter","name":"n8n-nodes-base.filter","codex":{"data":{"alias":["Router","Filter","Condition","Logic","Boolean","Branch"],"details":"The Filter node can be used to filter items based on a condition. If the condition is met, the item will be passed on to the next node. If the condition is not met, the item will be omitted. Conditions can be combined together by AND(meet all conditions), or OR(meet at least one condition).","resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.filter/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Filter","color":"#229eff"},"iconData":{"icon":"filter","type":"icon"},"displayName":"Filter","typeVersion":2,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":1119,"icon":"fa:robot","name":"@n8n/n8n-nodes-langchain.agent","codex":{"data":{"alias":["LangChain","Chat","Conversational","Plan and Execute","ReAct","Tools"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Agents","Root Nodes"]}}},"group":"[\"transform\"]","defaults":{"name":"AI Agent","color":"#404040"},"iconData":{"icon":"robot","type":"icon"},"displayName":"AI Agent","typeVersion":3,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]},{"id":1281,"icon":"file:openrouter.svg","name":"@n8n/n8n-nodes-langchain.lmChatOpenRouter","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.lmchatopenrouter/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Language Models","Root Nodes"],"Language Models":["Chat Models (Recommended)"]}}},"group":"[\"transform\"]","defaults":{"name":"OpenRouter Chat Model"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjOTRBM0I4IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgdmlld0JveD0iMCAwIDI0IDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjx0aXRsZT5PcGVuUm91dGVyPC90aXRsZT48cGF0aCBkPSJNMTYuODA0IDEuOTU3bDcuMjIgNC4xMDV2LjA4N0wxNi43MyAxMC4yMWwuMDE3LTIuMTE3LS44MjEtLjAzYy0xLjA1OS0uMDI4LTEuNjExLjAwMi0yLjI2OC4xMS0xLjA2NC4xNzUtMi4wMzguNTc3LTMuMTQ3IDEuMzUyTDguMzQ1IDExLjAzYy0uMjg0LjE5NS0uNDk1LjMzNi0uNjguNDU1bC0uNTE1LjMyMi0uMzk3LjIzNC4zODUuMjMuNTMuMzM4Yy40NzYuMzE0IDEuMTcuNzk2IDIuNzAxIDEuODY2IDEuMTEuNzc1IDIuMDgzIDEuMTc3IDMuMTQ3IDEuMzUybC4zLjA0NWMuNjk0LjA5MSAxLjM3NS4wOTQgMi44MjUuMDMzbC4wMjItMi4xNTkgNy4yMiA0LjEwNXYuMDg3TDE2LjU4OSAyMmwuMDE0LTEuODYyLS42MzUuMDIyYy0xLjM4Ni4wNDItMi4xMzcuMDAyLTMuMTM4LS4xNjItMS42OTQtLjI4LTMuMjYtLjkyNi00Ljg4MS0yLjA1OWwtMi4xNTgtMS41YTIxLjk5NyAyMS45OTcgMCAwMC0uNzU1LS40OThsLS40NjctLjI4YTU1LjkyNyA1NS45MjcgMCAwMC0uNzYtLjQzQzIuOTA4IDE0LjczLjU2MyAxNC4xMTYgMCAxNC4xMTZWOS44ODhsLjE0LjAwNGMuNTY0LS4wMDcgMi45MS0uNjIyIDMuODA5LTEuMTI0bDEuMDE2LS41OC40MzgtLjI3NGMuNDI4LS4yOCAxLjA3Mi0uNzI2IDIuNjg2LTEuODUzIDEuNjIxLTEuMTMzIDMuMTg2LTEuNzggNC44ODEtMi4wNTkgMS4xNTItLjE5IDEuOTc0LS4yMTMgMy44MTQtLjEzOGwuMDItMS45MDd6Ij48L3BhdGg+PC9zdmc+Cg=="},"displayName":"OpenRouter Chat Model","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]}],"categories":[{"id":32,"name":"Market Research"},{"id":49,"name":"AI Summarization"}],"image":[]}}