AutomationFlowsAI & RAG › Generate Linkedin Carousel Images From Text with Mistral AI & S3 Storage

Generate Linkedin Carousel Images From Text with Mistral AI & S3 Storage

ByDIGITAL BIZ TECH @dbt on n8n.io

This workflow is a caption-only carousel text generator built in n8n. It turns any raw LinkedIn post or text input into 3 short, slide-ready title + subtext captions and renders those captions onto image templates. Output is a single aggregated response with markdown image…

Chat trigger trigger★★★★★ complexityAI-powered37 nodesLm Chat Mistral CloudS3AgentOutput Parser StructuredEdit ImageChat TriggerGoogle Drive
AI & RAG Trigger: Chat trigger Nodes: 37 Complexity: ★★★★★ AI nodes: yes Added:

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

This workflow follows the Agent → Chat Trigger 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
{
  "nodes": [
    {
      "id": "dfc8e928-9d00-488a-95a4-053f9162e121",
      "name": "Mistral Cloud Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatMistralCloud",
      "position": [
        -688,
        560
      ],
      "parameters": {
        "model": "mistral-small-latest",
        "options": {}
      },
      "credentials": {
        "mistralCloudApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "092210eb-16ab-4170-9b71-c4e583a154cb",
      "name": "S32",
      "type": "n8n-nodes-base.s3",
      "position": [
        672,
        0
      ],
      "parameters": {
        "fileName": "={{ $json.safeName }}",
        "operation": "upload",
        "bucketName": "<bucketname >",
        "additionalFields": {}
      },
      "credentials": {
        "s3": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "dc6e5379-94bb-401e-bfff-2a811ee74c92",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -528,
        240
      ],
      "parameters": {
        "options": {
          "systemMessage": "=##Role\nYou are an assistant with the role of data formatter and banner caption creator.\n\n##Instructions\n1. For any given user query or post, remove only formatting issues such as \\n, **. The output should be clean, grammatically correct, and naturally readable. Important: don't remove emojis.\n2. Based on the cleaned input, create a catchy, relevant, and impactful carousel style text.\n   -If the title should be text is 5 words or less, it will be a single line. all should be different and interesting its should be like carousel style text post in LinkedIn\n   - followed by 1 or 2   sentence of subtext that intersinting and knowledge able also provide value to user ,quotes even steps format you need do this 3 times \n   ### important title and subtext should be max 5 or 7 words,that one sentence of lines\n3. Respond ONLY with a JSON object.\n\n\nExample Input:\n\"This is a **really** awesome new product launch! Get ready for innovation!\\n\ud83d\ude80\"\n\nExample Output:\n```json\n{\n  \"postclean\": \"This is a really awesome new product launch!  ready innovation! \",\n  \"banner_text\": {\n    \"title1\": \"title1 \"\n    \"subtext1\":\"sentence \"\n     \"title2\": \"\"\n    \"subtext2\":\"\"\n      \"title3\": \"\"\n    \"subtext3\":\"\"\n  }\n}"
        },
        "hasOutputParser": true
      },
      "typeVersion": 2
    },
    {
      "id": "3d38c797-3e57-4f7c-b058-4d79feda76f7",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -384,
        624
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"postclean\": \"\",\n  \"title1\":\"\",\n  \"subtext1\":\"\",\n    \"title2\":\"\",\n  \"subtext2\":\"\",\n    \"title3\":\"\",\n  \"subtext3\":\"\"\n}"
      },
      "typeVersion": 1.2
    },
    {
      "id": "bb457a7a-12db-4aa5-9eb2-fb3b4c283ea7",
      "name": "S3",
      "type": "n8n-nodes-base.s3",
      "position": [
        688,
        272
      ],
      "parameters": {
        "fileName": "={{ $json.safeName }}",
        "operation": "upload",
        "bucketName": "<bucketname >",
        "additionalFields": {}
      },
      "credentials": {
        "s3": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "265c513e-7676-4888-9dfe-3c89105728bb",
      "name": "S34",
      "type": "n8n-nodes-base.s3",
      "position": [
        688,
        848
      ],
      "parameters": {
        "fileName": "={{ $json.safeName }}",
        "operation": "upload",
        "bucketName": "<bucketname>",
        "additionalFields": {}
      },
      "credentials": {
        "s3": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "0f887d69-5511-4940-82ea-4986a568500e",
      "name": "S35",
      "type": "n8n-nodes-base.s3",
      "position": [
        688,
        544
      ],
      "parameters": {
        "fileName": "={{ $json.safeName }}",
        "operation": "upload",
        "bucketName": "<bucketname >",
        "additionalFields": {}
      },
      "credentials": {
        "s3": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4499b279-35d4-441d-b861-a4fc82b2ff65",
      "name": "Edit Image3",
      "type": "n8n-nodes-base.editImage",
      "position": [
        480,
        544
      ],
      "parameters": {
        "options": {},
        "operation": "multiStep",
        "operations": {
          "operations": [
            {
              "font": "/usr/YOUR_AWS_SECRET_KEY_HERE_Bold.ttf",
              "text": "={{ $json.title }}",
              "fontSize": 45,
              "fontColor": "#F3EFEF",
              "operation": "text",
              "positionY": 550,
              "lineLength": 35
            },
            {
              "font": "/usr/YOUR_AWS_SECRET_KEY_HERE.ttf",
              "text": "={{ $json.subtext }}",
              "fontSize": 35,
              "fontColor": "#F3DFDF",
              "operation": "text",
              "positionY": 700,
              "lineLength": 60
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "82e24636-fdbd-423d-9ae2-ca929950001f",
      "name": "When chat message received",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "position": [
        -720,
        240
      ],
      "parameters": {
        "public": true,
        "options": {
          "title": "carousel generator",
          "subtitle": "Start a chat. ",
          "customCss": ":root {\n  /* Colors */\n  --chat--color-primary: #e74266;\n  --chat--color-primary-shade-50: #db4061;\n  --chat--color-primary-shade-100: #cf3c5c;\n  --chat--color-secondary: #20b69e;\n  --chat--color-secondary-shade-50: #1ca08a;\n  --chat--color-white: #ffffff;\n  --chat--color-light: #f2f4f8;\n  --chat--color-light-shade-50: #e6e9f1;\n  --chat--color-light-shade-100: #c2c5cc;\n  --chat--color-medium: #d2d4d9;\n  --chat--color-dark: #101330;\n  --chat--color-disabled: #777980;\n  --chat--color-typing: #404040;\n\n  /* Base Layout */\n  --chat--spacing: 1rem;\n  --chat--border-radius: 0.25rem;\n  --chat--transition-duration: 0.15s;\n  --chat--font-family: (\n    -apple-system,\n    BlinkMacSystemFont,\n    'Segoe UI',\n    Roboto,\n    Oxygen-Sans,\n    Ubuntu,\n    Cantarell,\n    'Helvetica Neue',\n    sans-serif\n  );\n\n  /* Window Dimensions */\n  --chat--window--width: 400px;\n  --chat--window--height: 600px;\n  --chat--window--bottom: var(--chat--spacing);\n  --chat--window--right: var(--chat--spacing);\n  --chat--window--z-index: 9999;\n  --chat--window--border: 1px solid var(--chat--color-light-shade-50);\n  --chat--window--border-radius: var(--chat--border-radius);\n  --chat--window--margin-bottom: var(--chat--spacing);\n\n  /* Header Styles */\n  --chat--header--padding: 0.75rem;                    /* 50% less height */\n  --chat--header--background: var(--chat--color-primary-shade-100); /* deeper blue */\n  --chat--header--color: var(--chat--color-white);\n  --chat--heading--font-size: 1.8em;\n  --chat--subtitle--font-size: 1rem;\n  --chat--subtitle--line-height: 1.5;\n  /* Message Styles */\n  --chat--message--font-size: 1rem;\n  --chat--message--padding: var(--chat--spacing);\n  --chat--message--border-radius: var(--chat--border-radius);\n  --chat--message-line-height: 1.5;\n  --chat--message--margin-bottom: calc(var(--chat--spacing) * 1);\n  --chat--message--bot--background: var(--chat--color-white);\n  --chat--message--bot--color: var(--chat--color-dark);\n  --chat--message--bot--border: none;\n  --chat--message--user--background: var(--chat--color-secondary);\n  --chat--message--user--color: var(--chat--color-white);\n  --chat--message--user--border: none;\n  --chat--message--pre--background: rgba(0, 0, 0, 0.05);\n  --chat--messages-list--padding: var(--chat--spacing);\n\n  /* Toggle Button */\n  --chat--toggle--size: 64px;\n  --chat--toggle--width: var(--chat--toggle--size);\n  --chat--toggle--height: var(--chat--toggle--size);\n  --chat--toggle--border-radius: 50%;\n  --chat--toggle--background: var(--chat--color-primary);\n  --chat--toggle--hover--background: var(--chat--color-primary-shade-50);\n  --chat--toggle--active--background: var(--chat--color-primary-shade-100);\n  --chat--toggle--color: var(--chat--color-white);\n\n  /* Input Area */\n  --chat--textarea--height: 50px;\n  --chat--textarea--max-height: 30rem;\n  --chat--input--font-size: inherit;\n  --chat--input--border: 0;\n  --chat--input--border-radius: 0;\n  --chat--input--padding: 0.8rem;\n  --chat--input--background: var(--chat--color-white);\n  --chat--input--text-color: initial;\n  --chat--input--line-height: 1.5;\n  --chat--input--placeholder--font-size: var(--chat--input--font-size);\n  --chat--input--border-active: 0;\n  --chat--input--left--panel--width: 2rem;\n\n  /* Button Styles */\n  --chat--button--color: var(--chat--color-light);\n  --chat--button--background: var(--chat--color-primary);\n  --chat--button--padding: calc(var(--chat--spacing) * 1 / 2) var(--chat--spacing);\n  --chat--button--border-radius: var(--chat--border-radius);\n  --chat--button--hover--color: var(--chat--color-light);\n  --chat--button--hover--background: var(--chat--color-primary-shade-50);\n  --chat--close--button--color-hover: var(--chat--color-primary);\n\n  /* Send and File Buttons */\n  --chat--input--send--button--background: var(--chat--color-white);\n  --chat--input--send--button--color: var(--chat--color-light);\n  --chat--input--send--button--background-hover: var(--chat--color-primary-shade-50);\n  --chat--input--send--button--color-hover: var(--chat--color-secondary-shade-50);\n  --chat--input--file--button--background: var(--chat--color-white);\n  --chat--input--file--button--color: var(--chat--color-secondary);\n  --chat--input--file--button--background-hover: var(--chat--input--file--button--background);\n  --chat--input--file--button--color-hover: var(--chat--color-secondary-shade-50);\n  --chat--files-spacing: 0.25rem;\n\n  /* Body and Footer */\n  --chat--body--background: var(--chat--color-light);\n  --chat--footer--background: var(--chat--color-light);\n  --chat--footer--color: var(--chat--color-dark);\n}\n\n\n/* You can override any class styles, too. Right-click inspect in Chat UI to find class to override. */\n.chat-message {\n\tmax-width: 50%;\n  \n}\n\n.chat-message-markdown img {\n  display: block;\n  margin: 0.4rem auto;\n  width: 70% !important;        /* doubled from 35% */\n  max-width: 420px !important;  /* doubled approximate cap */\n  max-height: 380px !important; /* doubled height cap */\n  height: auto;\n  border-radius: var(--chat--border-radius);\n}"
        },
        "initialMessages": "hi paste your post"
      },
      "typeVersion": 1.3
    },
    {
      "id": "eb1ffe83-86f8-445f-8800-542f8647ebcb",
      "name": "Aggregate",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        1376,
        432
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData"
      },
      "typeVersion": 1
    },
    {
      "id": "3c914108-6208-4227-bafb-aa734758462f",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1680,
        320
      ],
      "parameters": {
        "color": 7,
        "height": 288,
        "content": "## format for output"
      },
      "typeVersion": 1
    },
    {
      "id": "10f73d89-cb0b-4dc3-8e22-947e11865320",
      "name": "Sticky Note17",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1088,
        240
      ],
      "parameters": {
        "color": 7,
        "width": 528,
        "height": 400,
        "content": "## Merge & Aggregate (Output)\nMerge collects all uploaded images. Aggregate builds the final message with markdown image embeds and download links. Final node returns one combined response to the user.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "66402c28-11b1-45d9-95b1-2c8bf4a78860",
      "name": "Sticky Note18",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        640,
        -240
      ],
      "parameters": {
        "color": 7,
        "width": 176,
        "height": 1296,
        "content": "## S3 Uploads\nUploads final images to `bucketname` bucket. Confirm public access or signed URLs. Filenames use `safeName` to avoid collisions.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "7d89a875-4669-4c7a-8bab-9695b88dfaf8",
      "name": "Sticky Note19",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        416,
        -240
      ],
      "parameters": {
        "color": 7,
        "width": 208,
        "height": 1024,
        "content": " ## Edit Image nodes\nRender title and subtext on templates using multiStep operations. Font size and position are set per template. Test with long and short titles to confirm line breaks.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "ea65b155-8dbc-4181-a9e1-065b5247b9a3",
      "name": "Sticky Note20",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        160,
        -240
      ],
      "parameters": {
        "color": 7,
        "height": 1312,
        "content": "## Image Templates (Google Drive)\nGoogle Drive nodes provide background templates. Replace cached fileIds with your template PNGs. Use 4 templates for 4 cards. Keep templates high-res and consistent aspect ratio.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "be169d36-c428-4f68-afbf-bd46463ab8ee",
      "name": "Sticky Note21",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -832,
        80
      ],
      "parameters": {
        "color": 7,
        "height": 320,
        "content": "## Chat Trigger (Input)\nReceives user post. Custom CSS configures UI and allows file/template selection."
      },
      "typeVersion": 1
    },
    {
      "id": "9f3627df-f50f-465f-9052-430676606cfe",
      "name": "Sticky Note22",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -576,
        80
      ],
      "parameters": {
        "color": 7,
        "width": 368,
        "height": 320,
        "content": "## AI Agent (Core)\nCleans input and returns three banner items as JSON: title1/subtext1, title2/subtext2, title3/subtext3. Titles must be short (\u22645 words). Agent MUST return valid JSON for the output parser.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "62ae92f2-bae7-4b93-8630-ff988fb2803c",
      "name": "Sticky Note23",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1376,
        48
      ],
      "parameters": {
        "width": 400,
        "height": 576,
        "content": "# Carousel Image Generator \u2014 Overview\n\n## How it works\nThis workflow turns a user post into a 3\u20134 slide carousel. The chat trigger accepts text. The AI Agent cleans input and returns 3 short title+subtext pairs. The Structured Output Parser enforces JSON output. Each title/subtext is rendered onto a chosen template image via Edit Image nodes. Generated images are uploaded to S3 and aggregated into one downloadable response.\n\n## Setup steps\n1. Add Mistral API credential.  \n2. Set S3 credentials and bucket name.  \n3. Replace Google Drive template IDs with your image templates.  \n4. Test once with the chat UI.  \n5. Verify titles are \u22645 words and subtext \u22641\u20132 sentences.  \nRun and confirm S3 links in the final aggregated message.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "d4967366-709d-4849-a751-6fefe828d616",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -464,
        496
      ],
      "parameters": {
        "color": 7,
        "height": 256,
        "content": "## Structured Output Parser\nValidates AI JSON. If parser fails the agent will not produce safe fields."
      },
      "typeVersion": 1
    },
    {
      "id": "325e40e0-a502-476a-9a2d-a95b2d9543b3",
      "name": "normalize title,name 1",
      "type": "n8n-nodes-base.set",
      "position": [
        0,
        0
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "ee05a8b8-0010-4f6a-ae59-9acd4cda9c5c",
              "name": "title",
              "type": "string",
              "value": "={{ $json.output.title1 }}"
            },
            {
              "id": "d7579879-3c87-47bf-904e-fd984265631a",
              "name": "safeName",
              "type": "string",
              "value": "={{ $('AI Agent').item.json.output.title1.split(' ')[0].replace(/[^a-zA-Z0-9]/g, '') + '_' + new Date().toISOString().slice(0,10).replace(/-/g, '') }}1"
            },
            {
              "id": "9d254a6b-e6eb-4df4-a771-e03a829ac4d8",
              "name": "subtext",
              "type": "string",
              "value": "={{ $json.output.subtext1 }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "aa06261d-79a8-4ffe-bf61-d5cc0052dae6",
      "name": "normalize title,name 2",
      "type": "n8n-nodes-base.set",
      "position": [
        -16,
        272
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "ee05a8b8-0010-4f6a-ae59-9acd4cda9c5c",
              "name": "title",
              "type": "string",
              "value": "={{ $json.output.title2 }}"
            },
            {
              "id": "d7579879-3c87-47bf-904e-fd984265631a",
              "name": "safeName",
              "type": "string",
              "value": "={{ $('AI Agent').item.json.output.title2.split(' ')[0].replace(/[^a-zA-Z0-9]/g, '') + '_' + new Date().toISOString().slice(0,10).replace(/-/g, '') }}2"
            },
            {
              "id": "9d254a6b-e6eb-4df4-a771-e03a829ac4d8",
              "name": "subtext",
              "type": "string",
              "value": "={{ $json.output.subtext2 }}\n"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "df23c6ac-41db-4351-9512-e0242af3be7a",
      "name": "normalize title,name 3",
      "type": "n8n-nodes-base.set",
      "position": [
        -16,
        544
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "ee05a8b8-0010-4f6a-ae59-9acd4cda9c5c",
              "name": "title",
              "type": "string",
              "value": "={{ $json.output.title3 }}"
            },
            {
              "id": "d7579879-3c87-47bf-904e-fd984265631a",
              "name": "safeName",
              "type": "string",
              "value": "={{ $('AI Agent').item.json.output.title2.split(' ')[0].replace(/[^a-zA-Z0-9]/g, '') + '_' + new Date().toISOString().slice(0,10).replace(/-/g, '') }}3"
            },
            {
              "id": "9d254a6b-e6eb-4df4-a771-e03a829ac4d8",
              "name": "subtext",
              "type": "string",
              "value": "={{ $json.output.subtext3 }}\n"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "bfe2487f-4f47-41a5-a308-625845617d9b",
      "name": "normalize title,name 4",
      "type": "n8n-nodes-base.set",
      "position": [
        0,
        848
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d7579879-3c87-47bf-904e-fd984265631a",
              "name": "safeName",
              "type": "string",
              "value": "={{ $('AI Agent').item.json.output.title1.split(' ')[0].replace(/[^a-zA-Z0-9]/g, '') + '_' + new Date().toISOString().slice(0,10).replace(/-/g, '') }}4"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "b2a0231c-d8d6-4ce2-952c-e623b90c5ad7",
      "name": "Google Drive get image 1",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        224,
        0
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "url",
          "value": "=<image1url>"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "af5f51f0-30e4-45e8-9dfc-581f24da40cb",
      "name": "Google Drive (get image template)",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        224,
        272
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "url",
          "value": "=<image2url>"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "a42e63e1-305f-405e-a7f4-a822589e867e",
      "name": "Google Drive (get image template)3",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        224,
        544
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "url",
          "value": "=<image3url>"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "79c1618c-f84b-4ac3-8702-a45c95763375",
      "name": "Google Drive (get image template)4",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        224,
        848
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "url",
          "value": "=<image4url>"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "f8de24bd-bbcb-4044-8be5-7f34f46515ce",
      "name": "Edit Image 1",
      "type": "n8n-nodes-base.editImage",
      "position": [
        464,
        0
      ],
      "parameters": {
        "options": {},
        "operation": "multiStep",
        "operations": {
          "operations": [
            {
              "font": "/usr/YOUR_AWS_SECRET_KEY_HERE_Bold.ttf",
              "text": "={{ $json.title }}",
              "fontSize": 45,
              "fontColor": "#F3EFEF",
              "operation": "text",
              "positionY": 550,
              "lineLength": 30
            },
            {
              "font": "/usr/YOUR_AWS_SECRET_KEY_HERE.ttf",
              "text": "={{ $json.subtext }}",
              "fontSize": 35,
              "fontColor": "#F3DFDF",
              "operation": "text",
              "positionY": 700,
              "lineLength": 60
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "6f02870b-4c92-47cc-894c-dbedfe3fe802",
      "name": "Edit Image2",
      "type": "n8n-nodes-base.editImage",
      "position": [
        480,
        272
      ],
      "parameters": {
        "options": {},
        "operation": "multiStep",
        "operations": {
          "operations": [
            {
              "font": "/usr/YOUR_AWS_SECRET_KEY_HERE_Bold.ttf",
              "text": "={{ $json.title }}",
              "fontSize": 45,
              "fontColor": "#F3EFEF",
              "operation": "text",
              "positionY": 550,
              "lineLength": 35
            },
            {
              "font": "/usr/YOUR_AWS_SECRET_KEY_HERE.ttf",
              "text": "={{ $json.subtext }}",
              "fontSize": 35,
              "fontColor": "#F3DFDF",
              "operation": "text",
              "positionY": 700,
              "lineLength": 60
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ab4e817b-aa6d-477d-baec-d0128c61caee",
      "name": "get s3 url image 1",
      "type": "n8n-nodes-base.set",
      "position": [
        880,
        0
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "e2489da8-e91b-4513-a423-2aea1238e67c",
              "name": "image1",
              "type": "string",
              "value": "=![image1](https:s3url/{{ $('normalize title,name 1').item.json.safeName }})"
            },
            {
              "id": "b5b9cb99-ae50-494c-b13c-8fbf2ba809b3",
              "name": "",
              "type": "string",
              "value": "https://qpmrmtlfwlixlplwpllz.supabase.co/storage/v1/object/public/dbtdigi/3"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "a606ef60-6bdf-4580-8be6-215e530a77a3",
      "name": "get s3 url image 2",
      "type": "n8n-nodes-base.set",
      "position": [
        880,
        272
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "e2489da8-e91b-4513-a423-2aea1238e67c",
              "name": "image2",
              "type": "string",
              "value": "=![image2](s3url/{{ $('normalize title,name 2').item.json.safeName }})"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "b74c88e4-5c90-4c8b-86a8-81498bc03da0",
      "name": "get s3 url image 3",
      "type": "n8n-nodes-base.set",
      "position": [
        896,
        544
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "e2489da8-e91b-4513-a423-2aea1238e67c",
              "name": "image3",
              "type": "string",
              "value": "=![image2](httpss3url/{{ $('normalize title,name 3').item.json.safeName }})"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "c8c8c909-cd5d-41c4-9cdd-b60a6e381bd6",
      "name": "get s3 url image 4",
      "type": "n8n-nodes-base.set",
      "position": [
        880,
        848
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "e2489da8-e91b-4513-a423-2aea1238e67c",
              "name": "image4",
              "type": "string",
              "value": "=![image4](https:s3url/{{ $('normalize title,name 4').item.json.safeName }})"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "f5d6b6bb-eb65-448e-b3e8-3e687458989b",
      "name": "Merge1",
      "type": "n8n-nodes-base.merge",
      "position": [
        1184,
        400
      ],
      "parameters": {
        "numberInputs": 4
      },
      "typeVersion": 3.2
    },
    {
      "id": "692e7421-1470-4b37-b32d-c09505ad4a21",
      "name": "output format",
      "type": "n8n-nodes-base.set",
      "position": [
        1760,
        432
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "0b6bf5a8-001b-4f78-9cbf-13eb0a731dc2",
              "name": "message",
              "type": "string",
              "value": "=image 1 : {{ $json.data[0].image1 }}\ndownload link: [Click here to download]({{ $json.data[0].image1.match(/\\((.*?)\\)/)[1] }}?download={{ $json.data[0].image1.match(/\\((.*?)\\)/)[1].split('/').pop() }}.png)\n\n\nimage 2 : {{ $json.data[1].image2 }}\ndownload link: [Click here to download]({{ $json.data[1].image2.match(/\\((.*?)\\)/)[1] }}?download={{ $json.data[1].image2.match(/\\((.*?)\\)/)[1].split('/').pop() }}.png)\n\n\n\n\nimage 3 : {{ $json.data[2].image3 }}\ndownload link: [Click here to download]({{ $json.data[2].image3.match(/\\((.*?)\\)/)[1] }}?download={{ $json.data[2].image3.match(/\\((.*?)\\)/)[1].split('/').pop() }}.png)\n\n\nimage 4 : {{ $json.data[3].image4 }}\ndownload link: [Click here to download]({{ $json.data[3].image4.match(/\\((.*?)\\)/)[1] }}?download={{ $json.data[3].image4.match(/\\((.*?)\\)/)[1].split('/').pop() }}.png)\n"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "d8155ed5-d9e7-4c5b-84d2-6e1478c922fc",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -912,
        864
      ],
      "parameters": {
        "color": 7,
        "height": 400,
        "content": "![image](https://qpmrmtlfwlixlplwpllz.supabase.co/storage/v1/object/public/dbtdigi/Dbtnew4.png)\n\n\ntemplate example"
      },
      "typeVersion": 1
    },
    {
      "id": "0f445086-97aa-4f70-92ca-739175ff773e",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -640,
        864
      ],
      "parameters": {
        "color": 7,
        "height": 400,
        "content": "![image](https://qpmrmtlfwlixlplwpllz.supabase.co/storage/v1/object/public/dbtdigi/Dbtnew2.png)\n\n\ntemplate example"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "S3": {
      "main": [
        [
          {
            "node": "get s3 url image 2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "S32": {
      "main": [
        [
          {
            "node": "get s3 url image 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "S34": {
      "main": [
        [
          {
            "node": "get s3 url image 4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "S35": {
      "main": [
        [
          {
            "node": "get s3 url image 3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge1": {
      "main": [
        [
          {
            "node": "Aggregate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "normalize title,name 1",
            "type": "main",
            "index": 0
          },
          {
            "node": "normalize title,name 2",
            "type": "main",
            "index": 0
          },
          {
            "node": "normalize title,name 4",
            "type": "main",
            "index": 0
          },
          {
            "node": "normalize title,name 3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate": {
      "main": [
        [
          {
            "node": "output format",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Image2": {
      "main": [
        [
          {
            "node": "S3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Image3": {
      "main": [
        [
          {
            "node": "S35",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Image 1": {
      "main": [
        [
          {
            "node": "S32",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "get s3 url image 1": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "get s3 url image 2": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "get s3 url image 3": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "get s3 url image 4": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 3
          }
        ]
      ]
    },
    "normalize title,name 1": {
      "main": [
        [
          {
            "node": "Google Drive get image 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "normalize title,name 2": {
      "main": [
        [
          {
            "node": "Google Drive (get image template)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "normalize title,name 3": {
      "main": [
        [
          {
            "node": "Google Drive (get image template)3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "normalize title,name 4": {
      "main": [
        [
          {
            "node": "Google Drive (get image template)4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Drive get image 1": {
      "main": [
        [
          {
            "node": "Edit Image 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Mistral Cloud 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
          }
        ]
      ]
    },
    "When chat message received": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Drive (get image template)": {
      "main": [
        [
          {
            "node": "Edit Image2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Drive (get image template)3": {
      "main": [
        [
          {
            "node": "Edit Image3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Drive (get image template)4": {
      "main": [
        [
          {
            "node": "S34",
            "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 is a caption-only carousel text generator built in n8n. It turns any raw LinkedIn post or text input into 3 short, slide-ready title + subtext captions and renders those captions onto image templates. Output is a single aggregated response with markdown image…

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

This n8n workflow streamlines AI-powered post creation with image banners, includes manual approval steps, and publishes to LinkedIn — all dynamically.

Chat Trigger, Lm Chat Mistral Cloud, Gmail +5
AI & RAG

This comprehensive workflow automates the complete financial document processing pipeline using AI. Upload invoices via chat, drop expense receipts into a folder, or add bank statements - the system a

Chat Trigger, HTTP Request, Google Sheets +8
AI & RAG

This template attempts to create an AI-powered content assistant for WordPress sites using Mistral AI, enabling article recommendations, content summarization, and contextual Q&A capabilities.

Chat Trigger, Output Parser Structured, Agent +10
AI & RAG

Who’s it for Creators who want to create faceless videos automatically, while keeping human oversight and quality control.

Read Write File, Agent, OpenAI Chat +7
AI & RAG

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

Google Gemini Chat, HTTP Request Tool, Chat Trigger +8