{
  "id": "aa1VOs8YB7XKLYnp",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "AI landing page generator",
  "tags": [],
  "nodes": [
    {
      "id": "eb43b2ce-6e7a-4b95-bef2-eeac1e30cefd",
      "name": "Generate an image1",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "position": [
        -1360,
        384
      ],
      "parameters": {
        "prompt": "={{ $json.message.content }}",
        "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
    },
    {
      "id": "a19ec0ab-0d78-4329-988a-760762dd1d47",
      "name": "Generate HTML (OpenAI)",
      "type": "n8n-nodes-base.openAi",
      "position": [
        224,
        384
      ],
      "parameters": {
        "model": "gpt-4o-mini",
        "prompt": {
          "messages": [
            {
              "role": "system",
              "content": "You are an expert web designer generating HTML websites. You always follow Apple's style of design."
            },
            {
              "content": "=[\n  {\n    \"role\": \"user\",\n    \"content\": \"You are generating a landing page. The topic and content must fully reflect this description:\\n\\n{{ $('Prepare Chat Prompt with Memory').item.json.prompt }}\\n\\nIf {{ $('Prepare Chat Prompt with Memory').item.json.current_html }} exists, apply the user\u2019s changes to that HTML. If not, create a new HTML page from scratch.\\n\\nImportant:\\n- The page\u2019s **headline, subheadline, and feature text** should clearly relate to the given topic above. Avoid generic placeholder text like 'Feature One'.\\n- Use this image for the hero section: {{ $json.hero_image }} (as a CSS background or <img> tag).\\n- Include a clean, modern hero section (full-width background, large bold headline, short subheadline, and two call-to-action buttons).\\n- Add a top navigation bar (logo left, 2\u20133 links like About, Team).\\n- Include a three-card section with icons, rounded corners, shadows, and soft hover effects.\\n- Use bright, friendly colors (warm oranges, soft blues, light backgrounds) and clean sans-serif fonts.\\n- Put all CSS inside a single <style> tag (no external CSS or JS).\\n- Output **only** the final HTML (no markdown, no comments).\"\n  }\n]\n"
            }
          ]
        },
        "options": {},
        "resource": "chat",
        "requestOptions": {},
        "simplifyOutput": false
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "a6337e56-50ee-4fd9-9fb2-f380d37406bd",
      "name": "Chat input",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "position": [
        -2448,
        384
      ],
      "parameters": {
        "public": true,
        "options": {
          "responseMode": "responseNodes"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "e28bf8af-a4de-4fcc-a53f-2c18c7c4ccaa",
      "name": "Respond to Chat",
      "type": "@n8n/n8n-nodes-langchain.chat",
      "position": [
        2352,
        368
      ],
      "parameters": {
        "message": "=Here\u2019s your live page:\n{{ $json.deployment_url }}\n",
        "options": {},
        "waitUserReply": false
      },
      "typeVersion": 1
    },
    {
      "id": "860219e9-5a02-4386-a505-7ab437bc4be0",
      "name": "Deploy to Vercel",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1312,
        368
      ],
      "parameters": {
        "url": "https://api.vercel.com/v13/deployments",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ $json }}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "67c10b33-7823-44f0-acce-df930927b955",
      "name": "list deployments",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1792,
        960
      ],
      "parameters": {
        "url": "https://api.vercel.com/v6/deployments?limit=1000",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "10d5e23c-0d51-4828-92e0-2e0aa49aada4",
      "name": "Code in JavaScript1",
      "type": "n8n-nodes-base.code",
      "position": [
        -1568,
        960
      ],
      "parameters": {
        "jsCode": "const d = (items[0].json.deployments || [])\n  .sort((a, b) => b.created - a.created)\n  .slice(0); // keep 2 newest\nreturn d.map(x => ({ json: { uid: x.uid, createdAt: x.created } }));\n"
      },
      "typeVersion": 2
    },
    {
      "id": "93a2a503-ad28-4017-8cf4-cb32bd6eebd5",
      "name": "HTTP Request",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1344,
        960
      ],
      "parameters": {
        "url": "=https://api.vercel.com/v6/deployments/{{$json.uid}}",
        "method": "DELETE",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "bbc57dde-acaf-421a-95ea-a7ecb36a19ce",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1920,
        784
      ],
      "parameters": {
        "color": 5,
        "width": 1312,
        "height": 336,
        "content": "> ## **\ud83e\uddf9 Optional Cleanup Flow (Vercel Deployments)**\n> ## Deletes older Vercel deployments, keeping only the two most recent.\n> ## Update your Vercel Header Auth credentials before running.\n> ## Use with caution \u2014 this permanently deletes older deployments."
      },
      "typeVersion": 1
    },
    {
      "id": "b9d6da97-c899-4f93-9c89-9b653bb53343",
      "name": "Get memory for current session",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        -2208,
        384
      ],
      "parameters": {
        "filters": {
          "conditions": [
            {
              "keyName": "sessionID",
              "keyValue": "={{ $json.sessionId }}"
            }
          ]
        },
        "operation": "get",
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "c3NWTExzLAJw5QeR",
          "cachedResultUrl": "/projects/cisuTMhblpNeiKpl/datatables/c3NWTExzLAJw5QeR",
          "cachedResultName": "html_memory_mini_loveable"
        }
      },
      "typeVersion": 1,
      "alwaysOutputData": true
    },
    {
      "id": "07f73d2e-1b13-4d61-b632-49f52cbdb196",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2288,
        96
      ],
      "parameters": {
        "width": 528,
        "height": 464,
        "content": "## Step 1 \u2013 Fetch existing memory and prepare prompt\n\nRetrieves previously stored session data and combines it with the user\u2019s latest chat input.\nThis is required to enable you to iterate on each landing page during each session. Eg. \"make the font bigger\" or \"change the landing page image\"\n### \ud83d\udd27 Edit Required: Update the data table name (e.g., html_memory_mini_loveable) to your own memory table. \n### Ensure the table has columns sessionID and html"
      },
      "typeVersion": 1
    },
    {
      "id": "226e3491-915d-4fd4-b847-680eedefc961",
      "name": "Prepare Chat Prompt with Memory",
      "type": "n8n-nodes-base.code",
      "position": [
        -1920,
        384
      ],
      "parameters": {
        "jsCode": "// Merge Chat Input + Get row(s) data\n\n// Get chat message from the Chat Input node\nconst chatNode = $node[\"Chat input\"].json;\nconst userMessage = (chatNode.chatInput || \"\").trim();\n\n// Get any existing HTML (if available) from Get row(s)\nconst getRowData = $node[\"Get memory for current session\"].json;\nconst currentHtml = getRowData.html || \"\";\n\n// If user says \"start new\", clear previous HTML\nlet finalHtml = currentHtml;\nif (userMessage.toLowerCase().includes(\"start new\")) {\n  finalHtml = \"\";\n}\n\n// Pass both values forward\nreturn [\n  {\n    json: {\n      prompt: userMessage,\n      current_html: finalHtml,\n      sessionId: chatNode.sessionId,\n    },\n  },\n];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "16859d0e-bda0-48cb-ae18-b9d2bd1acbec",
      "name": "Generate Image Prompt",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        -1680,
        384
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "GPT-4O-MINI"
        },
        "options": {
          "maxTokens": 120,
          "temperature": 0.6
        },
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "You are a prompt generator for DALL\u00b7E. Convert the user\u2019s landing-page idea into ONE concise, vivid scene description for a website hero image. Include composition, setting, lighting, color palette, mood, style. Exclude any UI text, logos, or typography. Output ONLY the description text\u2014no preface or formatting."
            },
            {
              "content": "={{ $json.prompt }}"
            }
          ]
        }
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "afb1de8d-787d-4615-9a81-a81ac0be054c",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1712,
        16
      ],
      "parameters": {
        "width": 576,
        "height": 560,
        "content": "## Step 2 \u2013 Generate image prompt and create hero image\n\nUses GPT-4o-mini to craft a vivid scene description and then generates a hero image using Nano banana model.\n\n\n### \ud83d\udd27 Edit Required: Replace the OpenAI and Gemini (Palm) credential with your own API key. The Google Gemini (PaLM) API key is available through Google Cloud Platform.\n\n### If preferred the gemini node can be switched out for another node, eg the OpenAI Dalle 2 node which is simpler and cheaper, but produces lower quality images."
      },
      "typeVersion": 1
    },
    {
      "id": "b73f2827-1d69-496a-80b8-0cff86c5f5b1",
      "name": "Convert Image to Base64",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        -1040,
        384
      ],
      "parameters": {
        "options": {},
        "operation": "binaryToPropery"
      },
      "typeVersion": 1
    },
    {
      "id": "012fec94-c4b3-4e39-9624-c727104aaa9b",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1120,
        144
      ],
      "parameters": {
        "width": 512,
        "height": 432,
        "content": "## Step 3 \u2013 Process image for upload\nConverts the generated image into a Base64 string and then wraps it as a valid data:image/png;base64,\u2026 URI for upload or preview."
      },
      "typeVersion": 1
    },
    {
      "id": "aa54da96-684f-42e9-88fc-4001a1aaf908",
      "name": "Format Image as Data URI",
      "type": "n8n-nodes-base.set",
      "position": [
        -768,
        384
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "6b52ab16-98e6-458c-a904-36edb9be67fd",
              "name": "file",
              "type": "string",
              "value": "={{ 'data:image/png;base64,' + $json.data }}\n"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "1b7b8094-07d2-4e5d-b864-3f4df21a40ca",
      "name": "Upload Image to Cloudinary",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -512,
        384
      ],
      "parameters": {
        "url": "https://api.cloudinary.com/v1_1/<your_cloud_key>/image/upload",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "multipart-form-data",
        "bodyParameters": {
          "parameters": [
            {
              "name": "file",
              "value": "={{$json.file}}"
            },
            {
              "name": "upload_preset",
              "value": "unsigned_upload"
            },
            {
              "name": "folder",
              "value": "ai_websites/landing_pages"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "a6c73419-65ad-4339-ae45-7486786efff0",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -576,
        144
      ],
      "parameters": {
        "width": 528,
        "height": 432,
        "content": "## Step 4 \u2013 Upload image to Cloudinary and return link\n\nUploads the Base64-encoded image to Cloudinary and outputs the public image URL.\n### \ud83d\udd27Edit Required:\n### Replace <your_cloud_key> in the URL with your actual Cloudinary cloud name.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "8f6c03cf-a07b-4813-8d9f-d7e2f3306042",
      "name": "Return Hero Image URL",
      "type": "n8n-nodes-base.code",
      "position": [
        -224,
        384
      ],
      "parameters": {
        "jsCode": "return {\n  \"hero_image\": $input.first().json.url\n}\n"
      },
      "typeVersion": 2
    },
    {
      "id": "24380557-af56-4cff-923b-69092d8117b1",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        80
      ],
      "parameters": {
        "width": 608,
        "height": 512,
        "content": "## Step 5 \u2013 Generate landing page HTML\n\nGenerates a responsive landing-page HTML layout using GPT-4o-mini based on the user\u2019s topic and design input.\nEditing prompt instructions can create large improvements/changes to final landing page output.\n### \ud83d\udd27 Edit Required:\n\n### Update the OpenAI credential to your own.\n\nOptionally switch to GPT-4o or Gemini 2.5 Flash for richer, more creative HTML output."
      },
      "typeVersion": 1
    },
    {
      "id": "44c708df-14a4-416f-983c-40e31de637c4",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        656,
        112
      ],
      "parameters": {
        "width": 528,
        "height": 512,
        "content": "## Step 6 \u2013 Save HTML to memory and prepare for deployment\n\nSave HTML to Memory Table, Prepare Vercel Deployment Payload\nStores the generated HTML for the current session and prepares a clean JSON payload for Vercel deployment.\n### \ud83d\udd27 Edit Required:\n### Replace the data table name (e.g., html_memory_mini_loveable) with your own."
      },
      "typeVersion": 1
    },
    {
      "id": "c0332850-2804-40ea-a154-50cd94ad1afa",
      "name": "Sticky Note12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1216,
        128
      ],
      "parameters": {
        "width": 1056,
        "height": 496,
        "content": "## Step 7 \u2013 Deploy site to Vercel\nDeploys the generated HTML to Vercel, retrieves the new deployment URL, makes it public, and formats it for easy sharing.\n### \ud83d\udd27 Edit Required:\n\n### Update the Vercel API credential or Header Auth token with your account\u2019s access token."
      },
      "typeVersion": 1
    },
    {
      "id": "34cc85f9-78b8-4a14-aa5a-c0b9f9489d9f",
      "name": "Save HTML to Memory Table",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        688,
        368
      ],
      "parameters": {
        "columns": {
          "value": {
            "html": "={{ $json.choices[0].message.content }}",
            "sessionID": "={{ $('Chat input').item.json.sessionId }}"
          },
          "schema": [
            {
              "id": "sessionID",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "sessionID",
              "defaultMatch": false
            },
            {
              "id": "html",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "html",
              "defaultMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "filters": {
          "conditions": [
            {
              "keyName": "sessionID",
              "keyValue": "={{ $('Chat input').item.json.sessionId }}"
            }
          ]
        },
        "options": {},
        "operation": "upsert",
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "c3NWTExzLAJw5QeR",
          "cachedResultUrl": "/projects/cisuTMhblpNeiKpl/datatables/c3NWTExzLAJw5QeR",
          "cachedResultName": "html_memory_mini_loveable"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "506a5de0-da4c-4729-b31b-82752183bede",
      "name": "Prepare Vercel Deployment Payload",
      "type": "n8n-nodes-base.function",
      "position": [
        976,
        368
      ],
      "parameters": {
        "functionCode": "// --- Get the HTML content from the OpenAI node ---\nconst html =\n  $node[\"Generate HTML (OpenAI)\"].json?.choices?.[0]?.message?.content ??\n  $json.html ??\n  \"\";\n\n// --- Clean out markdown fences if they exist ---\nconst cleanedHtml = html\n  .replace(/^```(?:html)?/i, \"\")\n  .replace(/```$/, \"\")\n  .trim();\n\n// --- Return payload for Vercel deployment ---\nreturn [\n  {\n    json: {\n      name: `ai-site-${Date.now()}`,\n      files: [\n        {\n          file: \"index.html\",\n          data: cleanedHtml, // raw HTML string; Vercel accepts this\n        },\n      ],\n      projectSettings: { framework: null },\n      target: \"production\",\n    },\n  },\n];\n"
      },
      "typeVersion": 1
    },
    {
      "id": "7eaa6e51-bc32-4999-8136-adef4ac55914",
      "name": "Fetch Latest Deployment URL1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1584,
        368
      ],
      "parameters": {
        "url": "https://api.vercel.com/v6/deployments?limit=1",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "6aa3b9f6-4419-4a33-b8c5-335be1ead8fd",
      "name": "Make Deployment URL Public",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1856,
        368
      ],
      "parameters": {
        "url": "=https://api.vercel.com/v9/projects/{{ $json.deployments[0].projectId }}",
        "method": "PATCH",
        "options": {},
        "jsonBody": "{\n  \"ssoProtection\": null,\n  \"passwordProtection\": null\n}\n",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "17316a8a-25e5-47d7-a965-057cb1aad9a2",
      "name": "Format Deployment URL",
      "type": "n8n-nodes-base.set",
      "position": [
        2128,
        368
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "5bb0cd69-a7a4-45a1-9d64-77b937fb8920",
              "name": "deployment_url",
              "type": "string",
              "value": "={{ 'https://' + $('Fetch Latest Deployment URL1').item.json.deployments[0].url}}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "372ae7e5-8ee4-4064-81e3-0540e929a496",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3120,
        112
      ],
      "parameters": {
        "width": 608,
        "height": 896,
        "content": "# AI Landing Page Generator\n\n## Purpose\n\nThis workflow turns a simple text idea into a fully designed and hosted **AI-generated landing page** \u2014 complete with a hero image, generated HTML, and live deployment on Vercel.\n\n## How It Works\n\nIt retrieves or creates session memory, generates a Nano Banana hero image, builds responsive landing-page HTML with GPT-4o-mini, saves it to an n8n data table, and then deploys the finished page to **Vercel**, returning a public live URL in minutes.\n\n## Requirements\n\n* **OpenAI** account \u2014 for GPT (and potentially DALL\u00b7E image generation)\n* **Google Cloud Platform** account to generate a **Google Gemini (PaLM)** API key \u2014 for image generation. If preferred this node can be switched out for the OpenAI Dalle 2 node, which is simpler and cheaper, but produces lower quality images.\n* **Cloudinary** account \u2014 for hosting generated images\n* **Vercel** account \u2014 for live deployment\n* **n8n Data Table** with at least two columns:\n  * `sessionID` \u2014 text or string\n  * `html` \u2014 long text or string\n\n## Setup Notes\n\nInline notes are added throughout the workflow to highlight where you need to update your own details \u2014 such as **OpenAI API key**, **Google Gemini (PaLM)**, **Cloudinary cloud name**, **table name**, and **Vercel token**.\nOnce these are configured, the workflow runs end-to-end automatically and publishes a fully functional landing page generated by AI."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "44cdea5c-82ec-4ea4-9c6f-89d4da271555",
  "connections": {
    "Chat input": {
      "main": [
        [
          {
            "node": "Get memory for current session",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Deploy to Vercel": {
      "main": [
        [
          {
            "node": "Fetch Latest Deployment URL1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "list deployments": {
      "main": [
        [
          {
            "node": "Code in JavaScript1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate an image1": {
      "main": [
        [
          {
            "node": "Convert Image to Base64",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript1": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Deployment URL": {
      "main": [
        [
          {
            "node": "Respond to Chat",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Image Prompt": {
      "main": [
        [
          {
            "node": "Generate an image1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Return Hero Image URL": {
      "main": [
        [
          {
            "node": "Generate HTML (OpenAI)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate HTML (OpenAI)": {
      "main": [
        [
          {
            "node": "Save HTML to Memory Table",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Convert Image to Base64": {
      "main": [
        [
          {
            "node": "Format Image as Data URI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Image as Data URI": {
      "main": [
        [
          {
            "node": "Upload Image to Cloudinary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Save HTML to Memory Table": {
      "main": [
        [
          {
            "node": "Prepare Vercel Deployment Payload",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Make Deployment URL Public": {
      "main": [
        [
          {
            "node": "Format Deployment URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload Image to Cloudinary": {
      "main": [
        [
          {
            "node": "Return Hero Image URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Latest Deployment URL1": {
      "main": [
        [
          {
            "node": "Make Deployment URL Public",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get memory for current session": {
      "main": [
        [
          {
            "node": "Prepare Chat Prompt with Memory",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Chat Prompt with Memory": {
      "main": [
        [
          {
            "node": "Generate Image Prompt",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Vercel Deployment Payload": {
      "main": [
        [
          {
            "node": "Deploy to Vercel",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}