{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "b8c2ed8a-3ef6-403b-a608-a734e5e80e24",
      "name": "Webhook - Receive Form",
      "type": "n8n-nodes-base.webhook",
      "position": [
        2704,
        464
      ],
      "parameters": {
        "path": "Linkedin-update",
        "options": {
          "rawBody": true
        },
        "httpMethod": "POST",
        "responseMode": "lastNode"
      },
      "typeVersion": 1.1
    },
    {
      "id": "e290f1b0-ebb8-4758-a86c-2c7d266374ee",
      "name": "Webhook-LinkedIn-post",
      "type": "n8n-nodes-base.webhook",
      "position": [
        2720,
        1056
      ],
      "parameters": {
        "path": "d01e0a95-5a60-4c9f-9f4e-3e6ef694f402",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 2.1
    },
    {
      "id": "3516b540-1740-4906-86a8-f23ac8081cde",
      "name": "Respond to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        3168,
        1056
      ],
      "parameters": {
        "options": {
          "responseCode": 200,
          "responseHeaders": {
            "entries": [
              {
                "name": "Access-Control-Allow-Origin",
                "value": "*"
              },
              {
                "name": "Access-Control-Allow-Methods",
                "value": "POST, OPTIONS"
              },
              {
                "name": "Access-Control-Allow-Headers",
                "value": "Content-Type"
              },
              {
                "name": "Content-Type",
                "value": "application/json"
              }
            ]
          }
        },
        "respondWith": "json",
        "responseBody": "{\n  \"success\": true,\n  \"message\": \"Post received and posted to LinkedIn\"\n}"
      },
      "typeVersion": 1.4
    },
    {
      "id": "29bef038-9cbc-441f-a1e0-170133028784",
      "name": "Respond to Webhook2",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        3504,
        336
      ],
      "parameters": {
        "options": {
          "responseHeaders": {
            "entries": [
              {
                "name": "Content-Type",
                "value": "application/json"
              },
              {
                "name": "Access-Control-Allow-Origin",
                "value": "*"
              }
            ]
          }
        },
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json) }}"
      },
      "typeVersion": 1
    },
    {
      "id": "c4b56266-794a-4ea7-9b0a-ec2657135d0b",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        2928,
        736
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "b4243d36-854a-47d4-8085-1d0232317cc4",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2000,
        192
      ],
      "parameters": {
        "width": 592,
        "height": 1040,
        "content": "## Upload your quote and generate a LinkedIn AI post design with captions\n\n## Watch this tutorial\n@[youtube](T3zXQvoFB6A)\n\n## How it works\n- Upload your quote on the website\n- The webhook reads the data and generates an image and caption using Gemini AI\n- Respond to webhook sends the response to the website, and it's displayed on the page\n- Edit caption to taste and post to LinkedIn\n\n## Setup\n1. Set up HTML website - will attach below\n2. Replace the 2 webhooks in the HTML\n3. Add [Gemini](https://aistudio.google.com/) credential\n4. Add [LinkedIn](https://developer.linkedin.com/) credential\n\n## [Click to get the HTML website](https://drive.google.com/file/d/1JvViq-oNAdZosNOr7S5PfrxgbYcpK1Te/view) \n"
      },
      "typeVersion": 1
    },
    {
      "id": "e1d7070a-4f4d-4f12-9a53-8a44094820bc",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2608,
        208
      ],
      "parameters": {
        "color": 7,
        "width": 1152,
        "height": 720,
        "content": "## 1. Retrieve the data from the website, generate a post image and caption, then send back the results to display on the website"
      },
      "typeVersion": 1
    },
    {
      "id": "4331f83b-742b-40fb-9af7-bc122b00f9ca",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2608,
        944
      ],
      "parameters": {
        "color": 7,
        "width": 832,
        "height": 288,
        "content": "## 2. Webhook reads the data and posts to LinkedIn"
      },
      "typeVersion": 1
    },
    {
      "id": "ee3370a5-71e2-4bce-8314-27e0f04af017",
      "name": "Generate post caption",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2928,
        576
      ],
      "parameters": {
        "text": "=Write a LinkedIn post caption based on this text \"{{ $json.body.quote }}\", making it educative, informative, and engaging while keeping it concise at about 120 to 180 words. Use clear, professional, and natural language with a strong opening sentence that sparks curiosity, briefly explain why the idea matters in a business or professional context, and include one practical insight or takeaway. Avoid em dashes completely, do not use jargon, fluff, or overly technical explanations, maintain a confident but approachable tone, structure the caption in short paragraphs for readability, and end with a thoughtful closing line that encourages reflection without asking multiple questions. Output only the final caption with no extra commentary.",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 3.1
    },
    {
      "id": "c036d9f0-8527-4c53-a4ed-f3616c4a737d",
      "name": "Generate post image",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "position": [
        2976,
        304
      ],
      "parameters": {
        "prompt": "=Create a modern, minimal but visually fuller illustration inspired by this quote \"{{ $json.body.quote }}\". Generate a unique background color for every output, using rich but professional tones that are not overly bright. Design a concept-driven scene that clearly symbolizes the core message of the quote, with more visual depth through layered elements, soft shapes, subtle gradients, and balanced composition while avoiding clutter. Include a short, impactful quote derived from the text placed prominently in the design using Poppins font only, with clean, bold typography that is easy to read. Maintain a polished, high-quality flat design style suitable for LinkedIn, with strong visual hierarchy, good spacing, and a professional business aesthetic.",
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "models/gemini-2.5-flash-image",
          "cachedResultName": "models/gemini-2.5-flash-image (Nano Banana)"
        },
        "options": {},
        "resource": "image"
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "4a7b177f-6fd2-4db8-8fca-472afc55114e",
      "name": "Convert binary to base64",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        3264,
        304
      ],
      "parameters": {
        "options": {},
        "operation": "binaryToPropery",
        "destinationKey": "image"
      },
      "typeVersion": 1.1
    },
    {
      "id": "4efa8966-62d4-4159-b3f8-f8d4d5983bbb",
      "name": "Combine the branches",
      "type": "n8n-nodes-base.merge",
      "position": [
        3296,
        560
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "3c96ba5e-426f-4d2d-816e-6ec928da2df9",
      "name": "Set prompt and image",
      "type": "n8n-nodes-base.set",
      "position": [
        3536,
        560
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "9cf7827d-55cd-439a-9d29-c471df686d01",
              "name": "image",
              "type": "string",
              "value": "={{ $json.image }}"
            },
            {
              "id": "9a354897-5632-4fa0-9e35-af9557c8c8b6",
              "name": "output",
              "type": "string",
              "value": "={{ $json.output }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "fb33329b-486f-472c-8d35-6b5e5dcc855c",
      "name": "Create Linkedin post",
      "type": "n8n-nodes-base.linkedIn",
      "position": [
        2944,
        1056
      ],
      "parameters": {
        "postAs": "organization",
        "additionalFields": {}
      },
      "credentials": {
        "linkedInOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Generate post image": {
      "main": [
        [
          {
            "node": "Convert binary to base64",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Combine the branches": {
      "main": [
        [
          {
            "node": "Set prompt and image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Linkedin post": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set prompt and image": {
      "main": [
        [
          {
            "node": "Respond to Webhook2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate post caption": {
      "main": [
        [
          {
            "node": "Combine the branches",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Webhook-LinkedIn-post": {
      "main": [
        [
          {
            "node": "Create Linkedin post",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook - Receive Form": {
      "main": [
        [
          {
            "node": "Generate post image",
            "type": "main",
            "index": 0
          },
          {
            "node": "Generate post caption",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Convert binary to base64": {
      "main": [
        [
          {
            "node": "Combine the branches",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Generate post caption",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    }
  }
}