{
  "id": "5hD2Nfc0PApsSOKs",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Hacker News Launch Tracker & Asana Task Manager (Show HN Intelligence)",
  "tags": [],
  "nodes": [
    {
      "id": "9b8e7771-8b95-45a6-b4ca-dbad5793f094",
      "name": "Create Asana Task for Detected Product Launch",
      "type": "n8n-nodes-base.asana",
      "position": [
        528,
        -240
      ],
      "parameters": {
        "name": "={{ $json.source }}",
        "workspace": "1212551193156936",
        "authentication": "oAuth2",
        "otherProperties": {
          "notes": "=\ud83d\ude80 New Launch Detected on Hacker News (Show HN)\n\n\ud83e\udde9 Product: {{ $json.product_name }}\n\ud83d\udc64 Author: {{ $json.author }}\n\ud83d\udcc5 Posted on: {{ $json.created_at }}\n\n\ud83d\udd25 Signal Strength: {{ $json.launch_signal_strength }}\n\u2b50 Points: {{ $json.points }}\n\ud83d\udcac Comments: {{ $json.num_comments }}\n\n\ud83d\udd17 Product URL:\n{{ $json.url }}\n\n\ud83e\uddf5 Hacker News Discussion:\n{{ $json.hn_item_url }}\n\n\ud83d\udcdd Description:\n{{ $json.description }}\n",
          "due_on": "={{ $now.plus({ days: 1 }).toISODate() }}\n",
          "projects": [
            "1212565062132347"
          ]
        }
      },
      "credentials": {
        "asanaOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4b207088-55a4-44a7-ae8e-9f9c893ab23a",
      "name": "Fetch Recent Show HN Posts from Hacker News1",
      "type": "n8n-nodes-base.hackerNews",
      "position": [
        -432,
        48
      ],
      "parameters": {
        "limit": 30,
        "resource": "all",
        "additionalFields": {
          "tags": [
            "show_hn"
          ],
          "keyword": ""
        }
      },
      "typeVersion": 1
    },
    {
      "id": "79b5bf34-b98d-4566-ab4d-cf4a36017ba7",
      "name": "Trigger Daily Show HN Launch Scan",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -688,
        48
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "837d7980-98c5-49c0-9149-c08ac8cdd442",
      "name": "Filter Likely Product Launch Announcements1",
      "type": "n8n-nodes-base.code",
      "position": [
        -160,
        48
      ],
      "parameters": {
        "jsCode": "const LAUNCH_HINTS = [\n  \"launch\",\n  \"released\",\n  \"soft launch\",\n  \"beta\",\n  \"v1\",\n  \"platform\",\n  \"tool\",\n  \"server\",\n  \"api\"\n];\n\nreturn items.filter(item => {\n  const title = (item.json.title || \"\").toLowerCase();\n  const text = (item.json.story_text || \"\").toLowerCase();\n\n  return LAUNCH_HINTS.some(k => (title + \" \" + text).includes(k));\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "7e1f7c40-9bb6-42b6-bd1e-ba3644c4592c",
      "name": "Normalize Launch Metadata and Score Signal Strength",
      "type": "n8n-nodes-base.code",
      "position": [
        144,
        48
      ],
      "parameters": {
        "jsCode": "return items.map(item => {\n  const title = item.json.title || \"\";\n  const text = item.json.story_text || \"\";\n\n  // Extract product name (basic heuristic)\n  const productName = title\n    .replace(/^Show HN:\\s*/i, \"\")\n    .split(\"\u2013\")[0]\n    .split(\"-\")[0]\n    .trim();\n\n  // Build HN discussion URL\n  const hnUrl = item.json.objectID\n    ? `https://news.ycombinator.com/item?id=${item.json.objectID}`\n    : \"\";\n\n  // Launch strength logic\n  let launchStrength = \"medium\";\n  if (item.json.points > 1500) launchStrength = \"high\";\n  if (text.toLowerCase().includes(\"soft launch\")) launchStrength = \"low\";\n\n  return {\n    json: {\n      source: \"Hacker News\",\n      launch_type: \"Show HN\",\n\n      title: title,\n      product_name: productName,\n\n      description: text\n        ? text.replace(/<[^>]+>/g, \"\").slice(0, 300)\n        : \"\",\n\n      url: item.json.url || \"\",\n      hn_item_url: hnUrl,\n\n      author: item.json.author,\n      created_at: item.json.created_at,\n\n      points: item.json.points,\n      num_comments: item.json.num_comments,\n\n      launch_signal_strength: launchStrength,\n      detected_at: new Date().toISOString()\n    }\n  };\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "2da6691f-b504-4c0d-8a89-e2754140612a",
      "name": "Aggregate Launch Items for Digest Generation",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        528,
        48
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData"
      },
      "typeVersion": 1
    },
    {
      "id": "b5e13d46-4f1a-4135-8770-2f54ad8bcce1",
      "name": "Generate Daily Founder Launch Digest (AI)",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        880,
        48
      ],
      "parameters": {
        "text": "=You are given an array of Hacker News launch items.\n\nEach item contains:\n- title\n- product_name\n- description\n- url\n- hn_item_url\n- points\n- num_comments\n- launch_signal_strength\n\nTASK:\n\n1. Create a Slack message with:\n   - Header: \"\ud83d\ude80 Daily Hacker News Launch Digest\"\n   - Bullet list of launches\n   - Each bullet must include:\n     \u2022 Product name\n     \u2022 Short one-line description (max 12 words)\n     \u2022 Signal strength (High / Medium / Low)\n     \u2022 Hacker News link\n   - Keep Slack output compact and skimmable\n\n2. Create an EMAIL DIGEST that is CLEAN and EMAIL-READY.\n\nEMAIL FORMAT RULES (STRICT):\n- Use clear section headers:\n  \ud83d\udd34 High Signal Launches\n  \ud83d\udfe1 Medium Signal Launches\n  \ud83d\udd35 Low Signal Launches\n- Add a blank line between every product\n- Each product MUST follow this structure exactly:\n\nProduct Name:\nWhat it is:\nWhy it matters:\nProduct Link:\nHacker News Link:\n\n- Keep each field to 1\u20132 short lines\n- Do NOT combine products into a paragraph\n- Do NOT remove line breaks\n\nOUTPUT RULES:\n- Return ONLY valid JSON\n- No explanations\n- No markdown fences\n\nReturn JSON in this exact structure:\n{\n  \"slack_message\": \"...\",\n  \"email_digest\": \"...\"\n}\n\nHere is the input data:\n{{ JSON.stringify($input.all().map(i => i.json), null, 2) }}\n",
        "options": {
          "systemMessage": "=You are a founder-communications assistant.\n\nYou specialize in creating clean, well-formatted Slack messages and\nexecutive-ready email digests.\n\nFormatting rules:\n- Use clear section headers\n- Use line breaks between sections\n- Never write long paragraphs\n- Optimize for readability in email clients\n- Output must look good in Gmail and Slack\n- Avoid wall-of-text formatting\n"
        },
        "promptType": "define"
      },
      "typeVersion": 2
    },
    {
      "id": "4bd77dfb-7698-4e6c-9979-b2eea755f8d7",
      "name": "LLM Reasoning Engine for Launch Digest",
      "type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
      "position": [
        880,
        304
      ],
      "parameters": {
        "model": "gpt-4o-mini",
        "options": {}
      },
      "credentials": {
        "azureOpenAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "826ad052-675f-45a5-a805-b7e573381b28",
      "name": "Parse Digest Output into Slack and Email Payloads",
      "type": "n8n-nodes-base.code",
      "position": [
        1392,
        48
      ],
      "parameters": {
        "jsCode": "const raw = items[0].json.output;\n\n// Parse the AI JSON string\nconst parsed = JSON.parse(raw);\n\nreturn [\n  {\n    json: {\n      slack_message: parsed.slack_message,\n      email_digest: parsed.email_digest\n    }\n  }\n];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "1a3c259e-4f11-4c7c-a9b9-131c88313a1b",
      "name": "Send Daily Founder Launch Digest to Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        1680,
        -160
      ],
      "parameters": {
        "text": "={{ $json.slack_message }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C09GNB90TED",
          "cachedResultName": "general-information"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "9b0037ac-4227-4c38-9806-ed434349cdde",
      "name": "Send Daily Founder Launch Digest via Email",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1680,
        224
      ],
      "parameters": {
        "sendTo": "user@example.com",
        "message": "={{ $json.email_digest.replace(/\\n/g, '<br>') }}",
        "options": {},
        "subject": "Daily Hacker News Launch Digest"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "c379ed05-8e6c-4e59-af9e-96d3650b3291",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1216,
        -816
      ],
      "parameters": {
        "width": 720,
        "height": 416,
        "content": "## \ud83d\ude80 Hacker News Launch Tracker & Asana Task Manager (Show HN Intelligence)\n\nThis workflow automatically scans Hacker News \u201cShow HN\u201d posts every day\nto detect new product launches, evaluate their launch strength, and\nconvert them into actionable founder insights.\n\nThe automation fetches recent Show HN posts, filters for real launch\nsignals, enriches each item with structured metadata, and scores the\nlaunch based on engagement signals like points and comments.\n\nEach detected launch is immediately logged as an Asana task for tracking,\nwhile all launches are aggregated into a clean daily digest. An AI engine\nthen generates a Slack-ready summary and a structured email digest,\nallowing founders and teams to stay updated on emerging products without\nmanually monitoring Hacker News.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "b0d4d37b-b134-4fb3-bd5e-abee98d84a2b",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -784,
        -192
      ],
      "parameters": {
        "color": 7,
        "width": 528,
        "height": 480,
        "content": "## \u23f0 Daily Show HN Monitoring\nControls when and how new launch data is collected.\n\n\u2022 Trigger Daily Show HN Launch Scan  \n  Runs the workflow automatically on a daily schedule.\n\n\u2022 Fetch Recent Show HN Posts from Hacker News  \n  Pulls the latest \u201cShow HN\u201d posts directly from Hacker News\n  using native HN data.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "b68f9db3-5bbf-4b64-895c-c3a51057b804",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -224,
        -208
      ],
      "parameters": {
        "color": 7,
        "width": 512,
        "height": 496,
        "content": "## \ud83d\udd0d Launch Signal Detection\nIdentifies which posts represent real product launches.\n\n\u2022 Filter Likely Product Launch Announcements  \n  Scans titles and descriptions for launch-related keywords\n  (launch, beta, v1, API, platform, tool).\n\n\u2022 Normalize Launch Metadata and Score Signal Strength  \n  Extracts product name, description, links, author, and engagement.\n  Assigns a launch signal strength (High / Medium / Low).\n"
      },
      "typeVersion": 1
    },
    {
      "id": "d9a14f79-5390-4f19-b228-97e244eacc52",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        336,
        -560
      ],
      "parameters": {
        "color": 7,
        "width": 464,
        "height": 832,
        "content": "## \ud83d\udccb Launch Tracking & Aggregation\nTracks launches and prepares data for digest creation.\n\n\u2022 Create Asana Task for Detected Product Launch  \n  Creates a follow-up task with full launch context\n  (product, author, links, engagement, signal strength).\n\n\u2022 Aggregate Launch Items for Digest Generation  \n  Combines all detected launches into a single dataset\n  for daily digest generation.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "f1f20713-1a99-48d6-96cc-f748511513a6",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        832,
        -288
      ],
      "parameters": {
        "color": 7,
        "width": 464,
        "height": 768,
        "content": "## \ud83e\udde0 Founder Digest Generation\nTransforms raw launch data into founder-friendly insights.\n\n\u2022 Generate Daily Founder Launch Digest (AI)  \n  Creates:\n  - A compact Slack launch digest\n  - A clean, structured email digest\n  - Grouped by launch signal strength\n\n\u2022 LLM Reasoning Engine for Launch Digest  \n  Provides the AI reasoning model that ensures\n  clarity, structure, and readability.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "e18a20c3-9e95-446a-984f-a722b4eb390a",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1312,
        -416
      ],
      "parameters": {
        "color": 7,
        "width": 592,
        "height": 848,
        "content": "## \ud83d\udce3 Digest Distribution\nDelivers insights to founders and teams.\n\n\u2022 Parse Digest Output into Slack and Email Payloads  \n  Separates AI output into Slack and email-ready formats.\n\n\u2022 Send Daily Founder Launch Digest to Slack  \n  Posts the daily launch summary directly to Slack.\n\n\u2022 Send Daily Founder Launch Digest via Email  \n  Delivers an email-friendly version for inbox consumption.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "f6d5845d-4a18-47de-a561-2b71b03ac0c3",
      "name": "Error Handler Trigger",
      "type": "n8n-nodes-base.errorTrigger",
      "position": [
        -640,
        720
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "55b98373-4d76-427c-86e7-cee864f597c8",
      "name": "Slack: Send Error Alert",
      "type": "n8n-nodes-base.slack",
      "position": [
        -272,
        720
      ],
      "parameters": {
        "text": "=\u274c *Error in API Error Catalog Workflow* *Node:* {{ $json.node.name }} *Message:* {{ $json.error.message }} *Time:* {{ $json.timestamp }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C09GNB90TED",
          "cachedResultName": "general-information"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "8c410bc3-cfac-45b4-968f-3ac5d919aa28",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -736,
        560
      ],
      "parameters": {
        "color": 7,
        "width": 672,
        "height": 336,
        "content": "## \ud83d\udea8 Error Handling \n\n \nCatches any workflow failure and posts an alert to Slack.  \nIncludes node name, error message, and timestamp for quick debugging.\n"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "83996971-10dd-4bc3-a3eb-f113040189a9",
  "connections": {
    "Error Handler Trigger": {
      "main": [
        [
          {
            "node": "Slack: Send Error Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Trigger Daily Show HN Launch Scan": {
      "main": [
        [
          {
            "node": "Fetch Recent Show HN Posts from Hacker News1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "LLM Reasoning Engine for Launch Digest": {
      "ai_languageModel": [
        [
          {
            "node": "Generate Daily Founder Launch Digest (AI)",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Generate Daily Founder Launch Digest (AI)": {
      "main": [
        [
          {
            "node": "Parse Digest Output into Slack and Email Payloads",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Likely Product Launch Announcements1": {
      "main": [
        [
          {
            "node": "Normalize Launch Metadata and Score Signal Strength",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate Launch Items for Digest Generation": {
      "main": [
        [
          {
            "node": "Generate Daily Founder Launch Digest (AI)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Recent Show HN Posts from Hacker News1": {
      "main": [
        [
          {
            "node": "Filter Likely Product Launch Announcements1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Digest Output into Slack and Email Payloads": {
      "main": [
        [
          {
            "node": "Send Daily Founder Launch Digest to Slack",
            "type": "main",
            "index": 0
          },
          {
            "node": "Send Daily Founder Launch Digest via Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize Launch Metadata and Score Signal Strength": {
      "main": [
        [
          {
            "node": "Create Asana Task for Detected Product Launch",
            "type": "main",
            "index": 0
          },
          {
            "node": "Aggregate Launch Items for Digest Generation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}