{
  "id": "bDQlTb3hD9Duq3Rc",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Multi-Angle Article-to-Carousel Publisher",
  "tags": [],
  "nodes": [
    {
      "id": "c4e3f660-eee6-44a4-9ef7-87180e5a20f4",
      "name": "RSS Feed Trigger",
      "type": "n8n-nodes-base.rssFeedReadTrigger",
      "position": [
        -1664,
        -288
      ],
      "parameters": {
        "feedUrl": "https://techcrunch.com/feed/",
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "5fdc04c9-06c3-40da-982d-6838045a0b2f",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -1344,
        -288
      ],
      "parameters": {
        "text": "=You are an expert content strategist.\n\nAnalyze this TechCrunch article.\n\nTitle:\n{{ $('RSS Feed Trigger').item.json.title }}\n\nContent:\n{{ $('RSS Feed Trigger').item.json.contentSnippet }}\n\nURL:\n{{ $('RSS Feed Trigger').item.json.link }}\n\nYour task is to identify 3 unique LinkedIn content angles.\n\nEach angle should target a different audience.\n\nPossible audiences:\n- Developers\n- Founders\n- Marketers\n- SaaS builders\n- AI enthusiasts\n\nReturn ONLY valid JSON.\n\n{\n  \"angles\": [\n    {\n      \"audience\": \"\",\n      \"angle\": \"\",\n      \"hook\": \"\"\n    }\n  ]\n}",
        "options": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3.1
    },
    {
      "id": "adb93799-9793-481d-aff2-54605a21ae8f",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -1168,
        -96
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"angles\": [\n    {\n      \"audience\": \"Developers\",\n      \"angle\": \"How autonomous vehicles are changing software engineering\",\n      \"hook\": \"Everyone is talking about AI replacing developers. The bigger shift is happening elsewhere.\"\n    },\n    {\n      \"audience\": \"Founders\",\n      \"angle\": \"What startups can learn from robotaxi competition\",\n      \"hook\": \"The next billion-dollar opportunity isn't another chatbot.\"\n    },\n    {\n      \"audience\": \"Marketers\",\n      \"angle\": \"How this news can become engaging LinkedIn content\",\n      \"hook\": \"Most people will share this news. Here's how to stand out instead.\"\n    }\n  ]\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "5d5369a8-0fc1-4122-ba29-a6cb6990a1ef",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        -1376,
        -96
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "1844a01c-e96d-49ee-8913-34a0fb02cb19",
      "name": "Split Out",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        -944,
        -288
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "output.angles"
      },
      "typeVersion": 1
    },
    {
      "id": "f4da0538-11a1-42e7-ba12-83bf7c5ca21f",
      "name": "Generate a post from an article URL with AI",
      "type": "@postnitro/n8n-nodes-postnitro-ai.postNitro",
      "onError": "continueErrorOutput",
      "position": [
        -528,
        -288
      ],
      "parameters": {
        "brandId": "cmi93qz66000wl504dtl0nloh",
        "presetId": "cmr96cp9i0001k1040wqqpip9",
        "operation": "aiFromArticle",
        "articleUrl": "={{ $('RSS Feed Trigger').item.json.link }}",
        "templateId": "cmrnc0pvm000ql504luhyx3at"
      },
      "credentials": {
        "postNitroApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "f4abd467-9967-4b5b-b0a8-4bd86c730e26",
      "name": "Limit",
      "type": "n8n-nodes-base.limit",
      "position": [
        -768,
        -288
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "49cae764-d733-440f-a340-053d32582272",
      "name": "scheduled post for instagram",
      "type": "@postnitro/n8n-nodes-postnitro-ai.postNitro",
      "position": [
        -256,
        -304
      ],
      "parameters": {
        "status": "DRAFT",
        "designId": "={{ $json.data.result.designId }}",
        "resource": "scheduledPost",
        "postContent": {
          "instagram": "={{ $('Split Out').item.json.hook }}"
        },
        "scheduledAt": "={{ $now.plus(1, 'day').toFormat('yyyy-MM-dd HH:mm:ss') }}",
        "platformSettings": {
          "instagramPostSettings": "{\n  \"postType\": \"carousel\",\n  \"postAsStory\": false\n}"
        },
        "selectedAccounts": [
          "cms5zbt61000ijw04kgql7mzx"
        ]
      },
      "credentials": {
        "postNitroApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "c34719ff-1812-4314-882f-c7375e7a8430",
      "name": "scheduled post for linkdin",
      "type": "@postnitro/n8n-nodes-postnitro-ai.postNitro",
      "position": [
        -256,
        -480
      ],
      "parameters": {
        "status": "DRAFT",
        "designId": "={{ $json.data.result.designId }}",
        "resource": "scheduledPost",
        "postContent": {
          "linkedin": "={{ $('Split Out').item.json.hook }}"
        },
        "scheduledAt": "={{ $now.plus(1, 'day').toFormat('yyyy-MM-dd HH:mm:ss') }}",
        "platformSettings": {
          "linkedinPostSettings": "{\n  \"postType\": \"document\",\n  \"postTitle\": null\n}"
        },
        "selectedAccounts": [
          "cmrabkwrp0001jp04tateajp3"
        ]
      },
      "credentials": {
        "postNitroApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "cbc43f64-2154-4d9d-9ebe-873910fd9050",
      "name": "Send a message",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -176,
        192
      ],
      "parameters": {
        "sendTo": "user@example.com",
        "message": "=Error: {{ $json.error }} Article: {{ $('RSS Feed Trigger').item.json.link }} Angle attempted: {{ $('Split Out').item.json.angle }}",
        "options": {},
        "subject": "=\u26a0\ufe0f Failed to generate post \u2014 {{ $('Split Out').item.json.angle }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "075f8147-4f1f-4a25-a50c-9d8c0a62ec0b",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        -16,
        -400
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "00cd78ec-b2b0-4c39-9563-36974a6c1c22",
      "name": "Send a message1",
      "type": "n8n-nodes-base.gmail",
      "position": [
        224,
        -400
      ],
      "parameters": {
        "sendTo": "user@example.com",
        "message": "=A new post was generated and scheduled as a draft on both platforms.  Angle: {{ $('Split Out').item.json.angle }} Audience: {{ $('Split Out').item.json.audience }}  LinkedIn: {{ $('scheduled post for linkdin').item.json.status }}    (scheduled {{ $('scheduled post for linkdin').item.json.scheduledFor }})  Instagram: {{ $('scheduled post for instagram').item.json.status }}    (scheduled {{ $('scheduled post for instagram').item.json.scheduledFor }})  Review both drafts in your PostNitro dashboard before publishing.",
        "options": {},
        "subject": "=\u2705 Post scheduled \u2014 {{ $('Split Out').item.json.audience }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "4863dde7-d523-44ce-acd3-9a69b277d9be",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2320,
        -704
      ],
      "parameters": {
        "color": "#FFBE6F",
        "width": 592,
        "height": 960,
        "content": "## Multi-Angle Article-to-Carousel Publisher\n\nWatches a TechCrunch RSS feed for new articles. An AI agent identifies \n3 distinct content angles (different audiences), and each angle is \nturned into its own carousel and scheduled as a draft on both LinkedIn \nand Instagram. Sends a confirmation or failure email per angle.\n\n### How it works\n1. **RSS Feed Trigger** polls TechCrunch for new articles.\n2. **AI Agent** (Gemini) analyzes the article and returns 3 angles, \n   each with an audience, angle description, and hook.\n3. **Split Out** turns the 3 angles into separate items.\n4. **PostNitro AI** generates a carousel design per angle, using the \n   article URL.\n5. Each angle branches into two parallel drafts:\n   - \u2705 **LinkedIn** draft (document post)\n   - \u2705 **Instagram** draft (carousel post)\n6. **Merge** syncs both platform results per angle.\n7. \u2705 Success \u2192 one email per angle confirming both drafts.\n8. \u274c Failure \u2192 error emailed with the article link and angle attempted.\n\n### Setup\n\u2610 Connect **PostNitro Embed** account (templateId, brandId, presetId)\n\u2610 Connect **Google Gemini** account (API key from aistudio.google.com)\n\u2610 Connect **Gmail** account\n\u2610 Confirm LinkedIn and Instagram account IDs in both scheduled-post nodes\n\u2610 Confirm the RSS feed URL (currently TechCrunch)\n\n### Customization\n- Swap `feedUrl` to monitor a different source\n- Change poll frequency (currently every minute)\n- Adjust `scheduledAt` offset (currently +1 day)"
      },
      "typeVersion": 1
    },
    {
      "id": "6dd16d42-7650-4263-a29d-0a2ab1795815",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1440,
        -528
      ],
      "parameters": {
        "width": 448,
        "height": 576,
        "content": "## 2. Identify content angles\nAI analyzes the article and returns 3 angles (audience, angle, hook) \nas structured JSON."
      },
      "typeVersion": 1
    },
    {
      "id": "cb6df8d2-c82d-4b24-8161-5cd8ba68dce4",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1696,
        -512
      ],
      "parameters": {
        "width": 224,
        "height": 352,
        "content": "## 1. Watch for new articles\nPolls the TechCrunch feed for new posts."
      },
      "typeVersion": 1
    },
    {
      "id": "5bc02cd1-0341-4e5e-98e2-f95e67671288",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -304,
        -704
      ],
      "parameters": {
        "width": 448,
        "height": 608,
        "content": "## 5. Success: draft on both platforms\nCreates a LinkedIn + Instagram draft per angle, then syncs both \nbefore notifying."
      },
      "typeVersion": 1
    },
    {
      "id": "9d117ea2-7265-4111-a19f-ebf948edf9c0",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -624,
        -528
      ],
      "parameters": {
        "width": 288,
        "height": 416,
        "content": "## 4. Generate carousel design\nBuilds a carousel from the article URL via PostNitro AI."
      },
      "typeVersion": 1
    },
    {
      "id": "17b88262-f1e8-481a-9ba3-73abd167ce31",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -976,
        -528
      ],
      "parameters": {
        "width": 336,
        "height": 416,
        "content": "## 3. Process angles individually\nSplits angles into separate items; Limit caps how many run per \nexecution."
      },
      "typeVersion": 1
    },
    {
      "id": "99eaeace-cac4-4a8a-b59b-f035b951bf0a",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -256,
        32
      ],
      "parameters": {
        "color": "#C64600",
        "width": 400,
        "height": 320,
        "content": "## 6. Failure: alert\nEmails the article link and angle if carousel generation fails."
      },
      "typeVersion": 1
    },
    {
      "id": "b918880d-4d5c-4af2-bfab-a9b7b608a6f7",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        160,
        -624
      ],
      "parameters": {
        "width": 352,
        "height": 416,
        "content": "## 7. Success: notify\nEmails a summary confirming both drafts were created."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "a670f390-9695-4211-8d3d-4246ecf7c549",
  "nodeGroups": [],
  "connections": {
    "Limit": {
      "main": [
        [
          {
            "node": "Generate a post from an article URL with AI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Send a message1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Split Out",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out": {
      "main": [
        [
          {
            "node": "Limit",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "RSS Feed Trigger": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "AI Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "scheduled post for linkdin": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "scheduled post for instagram": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Generate a post from an article URL with AI": {
      "main": [
        [
          {
            "node": "scheduled post for linkdin",
            "type": "main",
            "index": 0
          },
          {
            "node": "scheduled post for instagram",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send a message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}