{"workflow":{"id":14891,"name":"Generate AI camera moves with Seedance and build a previs review board","views":0,"recentViews":0,"totalViews":0,"createdAt":"2026-04-08T08:51:28.279Z","description":"## 📘 Description\nThis workflow is an AI-powered virtual cinematography and previs generation pipeline designed for film and VFX production. It transforms a director’s shot description into multiple camera choreography options, generates AI-driven previs videos, extracts key frames, and delivers a complete previs board package for supervisor review—enabling faster creative decision-making with zero manual setup.\n⚙️ Step-by-Step Flow\nThe workflow begins with a form-based trigger that captures a structured shot brief from the production team, including shot code, script snippet, camera and lens specifications, plate image reference, and movement complexity. This input is validated and normalized into a clean data structure, ensuring consistency across the pipeline. The processed brief is then sent to an AI agent powered by GPT-4o, which interprets the creative intent and generates three distinct camera choreography options. Each option includes a cinematic description, technical movement style, supervisor guidance, and a fully structured Seedance-ready prompt—effectively translating creative direction into executable camera logic.\n\nThese AI-generated options are parsed and expanded into individual processing units, where each one is converted into a structured API request for video generation. The pipeline attaches the provided plate image as a visual reference to ensure all outputs remain grounded in the real environment. Each request is then submitted to the Seedance AI model as an asynchronous job, enabling parallel generation of all camera variations. A polling system continuously checks the status of each render at fixed intervals, ensuring that the workflow proceeds only after successful completion of all outputs.\n\nOnce rendering is complete, the system collects each generated video and enriches it with production-ready metadata, including resolution, duration, and predefined key frames representing the opening, peak motion, and final composition. In parallel, the workflow downloads each video and archives it to Google Drive, creating a structured library of lighting references for downstream teams such as compositing and look development. An aggregation layer then compiles all camera options into a unified previs board package, formatting them into structured outputs for different platforms, including visual option cards, Jira descriptions, and a complete HTML lookbook.\n\nFinally, the delivery system distributes the previs package across multiple production tools simultaneously. A Slack message presents all options in an easy A/B/C selection format for supervisors, a Jira task is created for tracking and approval, a ClickUp record is logged for production management, and a Telegram message is sent for quick mobile access. This ensures that all stakeholders receive synchronized, actionable outputs, enabling fast and informed decision-making in the previs stage.\n\n## 🚨 Error Handling\n • AI parsing fallback to handle invalid JSON outputs\n • Retry loop for incomplete Seedance jobs (polling system)\n • Dedicated error trigger with instant Slack alerts\n • Telegram alert if AI agent fails to generate valid output\n • Prevents pipeline breaks and ensures reliability\n\n## 🧩 Prerequisites\n • Azure OpenAI (GPT-4o or similar model)\n • Seedance API (AI video generation)\n • Google Drive OAuth2 (asset storage)\n • Slack OAuth2 (team communication)\n • Jira API (task tracking)\n • ClickUp API (production management)\n • Telegram Bot (optional notifications)\n • Form/Webhook trigger (input layer)\n\n## 💡 Key Benefits\n✔ Converts creative intent into technical camera choreography automatically\n ✔ Generates multiple previs options for faster decision-making\n ✔ Maintains visual consistency using plate image reference\n ✔ Auto-extracts key frames for editorial and layout guidance\n ✔ Centralized previs board generation (ready for review)\n ✔ Multi-platform delivery (Slack, Jira, ClickUp, Telegram)\n ✔ Builds a reusable lighting reference archive\n\n## 👥 Perfect For\n-  Directors and cinematographers\n-  VFX previs and layout teams\n-  Virtual production workflows\n-  Film and episodic production pipelines\n-  Studios handling complex camera choreography","workflow":{"id":"fo01fX5smicEJD3L","meta":{"instanceId":"8443f10082278c46aa5cf3acf8ff0f70061a2c58bce76efac814b16290845177"},"name":"Generate AI Camera Moves with Seedance and Build Previs Review Board","tags":[],"nodes":[{"id":"7a347a23-2955-4b5f-beea-28feb37fbf04","name":"Overview: AI Previs Pipeline","type":"n8n-nodes-base.stickyNote","position":[-464,16],"parameters":{"width":660,"height":612,"content":"## 🎬 AI Previs — Virtual Cinematography Pipeline\n\n### How it works\nA supervisor fills out a web form describing a complex shot — script snippet, lens specs, and move complexity. GPT-4o translates that intent into three distinct camera choreography briefs, then Seedance generates a short video for each. All three options land in Slack, Jira, ClickUp, and Telegram so the supervisor can simply pick A, B, or C.\n\nThe plate image you supply is attached to every Seedance generation as a visual reference, keeping all options grounded in the real location. Rendered videos are also archived to Google Drive for later use as lighting references.\n\n### Setup steps\n1. **Form Trigger** — the webhook URL is auto-generated. Share it with your production team.\n2. **Azure OpenAI** — connect your Azure OpenAI credential and confirm the deployment name matches `gpt-4o-mini` (or update it to your deployment).\n3. **Seedance API** — replace the `Authorization` bearer token with your own key, stored as an HTTP Header Auth credential.\n4. **Slack** — connect Slack via OAuth2 and update the `channelId` to your target channel.\n5. **Jira** — connect your Jira Cloud credential; update `project` and `issueType` IDs to match your board.\n6. **ClickUp** — connect your ClickUp credential and update `team`, `space`, `folder`, and `list` IDs.\n7. **Google Drive** — connect via OAuth2 and update the `folderId` to your previs archive folder.\n8. **Telegram** — connect your bot credential and confirm the `chatId` is correct.\n9. Do a test run using a simple shot description before going live."},"typeVersion":1},{"id":"14d23d60-e548-4e18-845f-470e1406cab2","name":"Section: Brief Intake & AI","type":"n8n-nodes-base.stickyNote","position":[528,544],"parameters":{"color":7,"width":1104,"height":824,"content":"## 📋 Brief Intake & AI Choreography\nCollects the shot brief via a structured form, maps it to clean fields, then sends it to GPT-4o to generate three distinct camera choreography options — each with a Seedance-ready prompt, style description, and a note for the supervisor on when to choose it."},"typeVersion":1},{"id":"46757a89-c42e-429d-9cba-5dddf1c3c429","name":"Section: Seedance Generation & Polling","type":"n8n-nodes-base.stickyNote","position":[1648,592],"parameters":{"color":7,"width":1256,"height":756,"content":"## 🎥 Seedance Video Generation\nBuilds a Seedance API request for each camera option — plate image attached as visual reference — then submits and polls every 20 seconds until the render completes. Runs in parallel for all three options."},"typeVersion":1},{"id":"85e0a360-2deb-46d0-9004-3c9ed5fdfd5b","name":"Section: Key Frame & Board Compile","type":"n8n-nodes-base.stickyNote","position":[2928,576],"parameters":{"color":7,"width":852,"height":756,"content":"## 🗂️ Key Frame Extraction & Board Assembly\nOnce all moves are rendered, key frames are tagged at three timecodes (open, peak, landing). All options are compiled into a single previs board package — formatted for Slack, Jira, ClickUp, and Confluence — ready to send in one pass."},"typeVersion":1},{"id":"6d2e6783-3225-4520-b8f3-7c6239ed336c","name":"Section: Supervisor Delivery","type":"n8n-nodes-base.stickyNote","position":[3776,192],"parameters":{"color":7,"width":500,"height":1140,"content":"## 📤 Supervisor Delivery\nPublishes the previs board simultaneously to Slack (with A/B/C pick prompt), Jira (review task), ClickUp (production record), and Telegram. The Google Drive step archives each rendered video as a lighting reference for the comp team."},"typeVersion":1},{"id":"34700215-d243-43be-b911-9ac8dade75f7","name":"Security: Credentials Note","type":"n8n-nodes-base.stickyNote","position":[4336,1008],"parameters":{"color":3,"width":296,"height":320,"content":"## 🔐 Credentials & Security\nUse OAuth2 for Slack, Google Drive, and Jira. Store the Seedance and ClickUp API keys as named n8n credentials — never paste raw tokens into node parameters. Replace all personal IDs, folder paths, and chat IDs with your own values before sharing."},"typeVersion":1},{"id":"b889bca2-6204-4889-bd3f-94878b3c94a7","name":"Extract & Map Form Fields","type":"n8n-nodes-base.code","position":[864,816],"parameters":{"jsCode":"const form = $input.first().json;\n\nconst complexityMap = {\n  'Simple — single axis move':             'simple',\n  'Medium — multi-axis choreography':      'medium',\n  'Complex — impossible / virtual camera': 'complex',\n  'Hero — signature shot / oner':          'hero'\n};\n\nreturn [{ json: {\n  shotCode:         (form['Shot Code'] || '').trim(),\n  scriptSnippet:    (form['Script Snippet'] || '').trim(),\n  lensSpecs:        (form['Lens / Camera Specs'] || 'unspecified').trim(),\n  plateImageUrl:    (form['Plate Image URL'] || '').trim(),\n  complexity:       complexityMap[form['Move Complexity']] || 'medium',\n  supervisorEmail:  (form['Supervisor Email'] || '').trim(),\n  sequenceCode:     (form['Shot Code'] || '').split('_')[0],\n  requestTimestamp: new Date().toISOString()\n}}];"},"typeVersion":2},{"id":"8aff767d-f57d-481a-ba0f-099b7244a206","name":"AI Agent: Generate Camera Options","type":"@n8n/n8n-nodes-langchain.agent","onError":"continueErrorOutput","position":[1104,816],"parameters":{"text":"==Shot Code: {{ $json.shotCode }}\nScript / Scene Description: {{ $json.scriptSnippet }}\nLens & Camera Specs: {{ $json.lensSpecs }}\nMove Complexity: {{ $json.complexity }}\nPlate Image URL: {{ $json.plateImageUrl }}\nSupervisor Email: {{ $json.supervisorEmail }}\n\nBased on the above, generate 3 distinct camera choreography options as a JSON object with this exact structure:\n{\n  \"shotIntent\": \"one sentence summarising what this shot is trying to achieve dramatically\",\n  \"moves\": [\n    {\n      \"moveId\": \"PREVIS-V1\",\n      \"moveName\": \"short punchy name\",\n      \"moveIcon\": \"🎬\",\n      \"moveStyle\": \"one-line camera style description\",\n      \"supervisorNote\": \"why a supervisor would choose this option\",\n      \"seedancePrompt\": \"full detailed Seedance-ready prompt describing the camera move, subject, environment, speed, mood, photorealistic\"\n    },\n    { \"moveId\": \"PREVIS-V2\", \"moveName\": \"\", \"moveIcon\": \"\", \"moveStyle\": \"\", \"supervisorNote\": \"\", \"seedancePrompt\": \"\" },\n    { \"moveId\": \"PREVIS-V3\", \"moveName\": \"\", \"moveIcon\": \"\", \"moveStyle\": \"\", \"supervisorNote\": \"\", \"seedancePrompt\": \"\" }\n  ]\n}\n\nReturn ONLY the raw JSON object. No markdown, no backticks, no explanation.","options":{"systemMessage":"=You are a virtual cinematography expert for a VFX production pipeline. You translate director intent and technical shot briefs into precise camera choreography options. Return ONLY valid raw JSON — no markdown, no backticks, no preamble."},"promptType":"define"},"typeVersion":2.1},{"id":"cabb59d4-a356-429c-9059-5570f7adb202","name":"Azure OpenAI: GPT-4o Mini","type":"@n8n/n8n-nodes-langchain.lmChatAzureOpenAi","position":[1008,1024],"parameters":{"model":"gpt-4o-mini","options":{}},"typeVersion":1},{"id":"9525d5d8-0c97-4904-aa8f-7281afa794e6","name":"Parse AI Response → Seedance Items","type":"n8n-nodes-base.code","position":[1408,816],"parameters":{"jsCode":"const raw = $input.first().json.text ||\n            $input.first().json.output ||\n            $input.first().json.content || '';\n\nconst formData = $('Extract & Map Form Fields').first().json;\n\nlet aiParsed;\ntry {\n  const cleaned = raw.replace(/```json|```/g, '').replace(/\\n/g, ' ').trim();\n  aiParsed = JSON.parse(cleaned);\n} catch(e) {\n  const match = raw.match(/\\{[\\s\\S]*\\}/);\n  if (match) {\n    try { aiParsed = JSON.parse(match[0]); }\n    catch(e2) { throw new Error(`AI parse failed: ${raw.substring(0,200)}`); }\n  } else {\n    throw new Error(`No JSON in AI output: ${raw.substring(0,200)}`);\n  }\n}\n\nreturn (aiParsed.moves || []).map(move => ({\n  json: {\n    ...formData,\n    moveId:         move.moveId,\n    moveName:       move.moveName,\n    moveIcon:       move.moveIcon || '🎬',\n    moveStyle:      move.moveStyle,\n    supervisorNote: move.supervisorNote,\n    shotIntent:     aiParsed.shotIntent,\n    safePrompt:     JSON.stringify(\n      `${move.seedancePrompt}. Shot: ${formData.shotCode}. ${formData.lensSpecs}. --duration 5 --camerafixed false`\n    ).slice(1,-1),\n    totalMoves:     (aiParsed.moves || []).length\n  }\n}));"},"typeVersion":2},{"id":"54904b08-41d8-4bac-9b36-a87eefde4df7","name":"Build Seedance API Request","type":"n8n-nodes-base.code","position":[1648,816],"parameters":{"jsCode":"const input = $input.first().json;\n\nconst body = {\n  model: 'seedance-1-5-pro-251215',\n  content: [\n    { type: 'text', text: input.safePrompt },\n    { type: 'image_url', image_url: { url: input.plateImageUrl } }\n  ],\n  generate_audio: false,\n  ratio: '16:9',\n  duration: 5,\n  watermark: false\n};\n\nreturn [{ json: { ...input, requestBody: JSON.stringify(body) } }];"},"typeVersion":2},{"id":"245d7f53-5280-47d7-9525-e425db8d8574","name":"Seedance: Submit Camera Move Job","type":"n8n-nodes-base.httpRequest","position":[1888,816],"parameters":{"url":"https://ark.ap-southeast.bytepluses.com/api/v3/contents/generations/tasks","method":"POST","options":{},"jsonBody":"={{ JSON.parse($json.requestBody) }}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer YOUR_TOKEN_HERE"},{"name":"Content-Type","value":"application/json"}]}},"typeVersion":4.3},{"id":"0c6ad07f-9cbe-4ead-a782-f674860d591f","name":"Store Job ID + Move Metadata","type":"n8n-nodes-base.code","position":[2128,816],"parameters":{"jsCode":"const httpResult = $input.first().json;\nconst moveData = $('Build Seedance API Request').first().json;\nreturn [{ json: { ...moveData, id: httpResult.id } }];"},"typeVersion":2},{"id":"7ef36442-395c-4c11-98ca-ccc3966426c1","name":"Poll: Check Move Render Status","type":"n8n-nodes-base.httpRequest","position":[2368,816],"parameters":{"url":"=https://ark.ap-southeast.bytepluses.com/api/v3/contents/generations/tasks/{{ $json.id }}","options":{},"sendHeaders":true,"headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer YOUR_TOKEN_HERE"}]}},"typeVersion":4.3},{"id":"cb03e00d-d69e-4868-8e48-ba4b03a6a21d","name":"Move Render Complete?","type":"n8n-nodes-base.if","position":[2608,816],"parameters":{"options":{},"conditions":{"options":{"caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"previs-done","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.status }}","rightValue":"succeeded"}]}},"typeVersion":2},{"id":"fb29ed79-0a2a-45e5-ab32-c090fac7c84d","name":"Wait 20s Before Retry","type":"n8n-nodes-base.wait","position":[2736,1088],"webhookId":"previs-wait-001","parameters":{"amount":20},"typeVersion":1.1},{"id":"d4ec5e79-3892-4428-947a-ea81b8e89b96","name":"Collect Move + Tag Key Frames","type":"n8n-nodes-base.code","position":[2944,800],"parameters":{"jsCode":"const pollResult = $input.first().json;\nconst moveData   = $('Store Job ID + Move Metadata').first().json;\n\nlet videoUrl = null;\nif (pollResult.content && pollResult.content.video_url) {\n  videoUrl = pollResult.content.video_url;\n}\nif (!videoUrl) videoUrl = `Not found. Job: ${pollResult.id}`;\n\nconst keyFrames = [\n  { frame: 1,   timecode: '00:00:00:01', label: 'Opening frame — camera start position' },\n  { frame: 48,  timecode: '00:00:02:00', label: 'Peak move — maximum camera energy' },\n  { frame: 120, timecode: '00:00:05:00', label: 'Landing frame — final composition' }\n];\n\nreturn [{ json: {\n  moveId:          moveData.moveId,\n  moveName:        moveData.moveName,\n  moveIcon:        moveData.moveIcon,\n  moveStyle:       moveData.moveStyle,\n  supervisorNote:  moveData.supervisorNote,\n  shotIntent:      moveData.shotIntent,\n  shotCode:        moveData.shotCode,\n  sequenceCode:    moveData.sequenceCode,\n  complexity:      moveData.complexity,\n  lensSpecs:       moveData.lensSpecs,\n  scriptSnippet:   moveData.scriptSnippet,\n  supervisorEmail: moveData.supervisorEmail,\n  plateImageUrl:   moveData.plateImageUrl,\n  videoUrl,\n  jobId:           pollResult.id,\n  resolution:      pollResult.resolution,\n  duration:        pollResult.duration,\n  keyFrames,\n  totalMoves:      moveData.totalMoves,\n  generatedAt:     new Date().toISOString()\n}}];"},"typeVersion":2},{"id":"80193cdb-af35-410c-b200-9eb25bf987cc","name":"Download Lighting Reference Video","type":"n8n-nodes-base.httpRequest","position":[3216,1152],"parameters":{"url":"={{ $json.videoUrl }}","options":{"response":{"response":{"responseFormat":"file"}}}},"typeVersion":4.3},{"id":"45fc8958-c402-4236-932a-c22a9c8740e5","name":"Google Drive: Archive Lighting Ref","type":"n8n-nodes-base.googleDrive","position":[3488,1152],"parameters":{"name":"=={{ $json.shotCode }}_lighting_{{ $now.toFormat('yyyyMMdd_HHmmss') }}.mp4","driveId":{"__rl":true,"mode":"list","value":"My Drive"},"options":{},"folderId":{"__rl":true,"mode":"list","value":"YOUR_GOOGLE_DRIVE_FOLDER_ID","cachedResultUrl":"https://drive.google.com/drive/folders/YOUR_GOOGLE_DRIVE_FOLDER_ID","cachedResultName":"Previs Archive Folder"}},"typeVersion":3},{"id":"0eb98dd8-b354-4491-8fc0-f314c1b00809","name":"Jira: Create Previs Review Task","type":"n8n-nodes-base.jira","position":[3888,896],"parameters":{"project":{"__rl":true,"mode":"list","value":"YOUR_JIRA_PROJECT_ID","cachedResultName":"Your Project Name"},"summary":"=[AI Previs] {{ $json.shotCode }} – {{ $json.totalMoves }} Camera Options | Supervisor Pick Required","issueType":{"__rl":true,"mode":"list","value":"YOUR_JIRA_ISSUE_TYPE_ID","cachedResultName":"Task"},"additionalFields":{"description":"=AI Previs Board Generated — {{ $json.shotCode }}\n\nShot Intent: {{ $json.shotIntent }}\nScript: {{ $json.scriptSnippet }}\nLens: {{ $json.lensSpecs }}\nComplexity: {{ $json.complexity }}\n\nCamera Options:\n{{ $json.jiraDesc }}\n\nStatus: Awaiting supervisor selection.\nGenerated: {{ $json.generatedAt }}"}},"typeVersion":1},{"id":"ca884283-0c15-40a0-acab-dd306aad90f1","name":"ClickUp: Create Previs Production Record","type":"n8n-nodes-base.clickUp","position":[3888,368],"parameters":{"list":"YOUR_CLICKUP_LIST_ID","name":"=[AI Previs] {{ $json.shotCode }}","team":"YOUR_CLICKUP_TEAM_ID","space":"YOUR_CLICKUP_SPACE_ID","folder":"YOUR_CLICKUP_FOLDER_ID","additionalFields":{"content":"==Shot Code: {{ $json.shotCode }}\nSequence: {{ $json.sequenceCode }}\nShot Intent: {{ $json.shotIntent }}\nScript: {{ $json.scriptSnippet }}\nLens: {{ $json.lensSpecs }}\nComplexity: {{ $json.complexity }}\nSupervisor: {{ $json.supervisorEmail }}\nTotal Options: {{ $json.totalMoves }}\nGenerated: {{ $json.generatedAt }}\n\n--- CAMERA OPTIONS ---\n{{ $json.jiraDesc }}\n\n--- VIDEO LINKS ---\n{{ $json.allMoves.map(m => m.moveId + ': ' + m.videoUrl).join('\\n') }}"}},"typeVersion":1},{"id":"ef4a7cd1-cfa4-47f2-a13d-9e99f8d0face","name":"Telegram: Deliver Previs to Supervisor","type":"n8n-nodes-base.telegram","position":[3904,1136],"webhookId":"884081b8-142f-4d67-889f-621f3946881a","parameters":{"text":"==🎬 *AI Previs Board Ready — {{ $json.shotCode }}*\n\n📋 *Sequence:* {{ $json.sequenceCode }} | *Complexity:* {{ $json.complexity }}\n🎯 *Shot Intent:* {{ $json.shotIntent }}\n📝 *Script:* {{ $json.scriptSnippet }}\n🎥 *Lens:* {{ $json.lensSpecs }}\n📧 *Supervisor:* {{ $json.supervisorEmail }}\n\n*── {{ $json.totalMoves }} Camera Option(s) Generated ──*\n\n{{ $json.allMoves.map(function(m, i) { return (i+1) + '. ' + m.moveIcon + ' *' + m.moveName + '* (' + m.moveId + ')\\n   Style: ' + m.moveStyle + '\\n   Note: ' + m.supervisorNote + '\\n   Resolution: ' + (m.resolution || 'N/A') + '\\n   Video: ' + m.videoUrl; }).join('\\n\\n') }}\n\n🖼️ *Plate Ref:* {{ $json.plateImageUrl }}\n\n_Supervisor — watch the options above and reply with your pick (PREVIS-V1, V2, or V3) to lock it to the Jira task._\n_Generated: {{ $json.generatedAt }}_","chatId":"=YOUR_TELEGRAM_CHAT_ID","additionalFields":{"parse_mode":"Markdown"}},"typeVersion":1.1},{"id":"8d594e49-ac8c-4a28-9cbd-bb7d173b1feb","name":"Telegram: Alert on AI Agent Failure","type":"n8n-nodes-base.telegram","position":[1440,1104],"webhookId":"884081b8-142f-4d67-889f-621f3946881a","parameters":{"text":"⚠️ *AI Previs: AI Agent Error*\n\nThe camera choreography agent failed to return valid JSON. The workflow has retried from form extraction.\n\nTime: {{ new Date().toISOString() }}","chatId":"=YOUR_TELEGRAM_CHAT_ID","additionalFields":{"parse_mode":"Markdown"}},"typeVersion":1.1},{"id":"6acad659-e831-4f3f-8c32-486bc806f8e3","name":"Form: Previs Brief Input1","type":"n8n-nodes-base.formTrigger","position":[624,816],"webhookId":"33e2daee-8506-4c17-aa56-1d76660bdc4d","parameters":{"options":{},"formTitle":"AI Previs — Virtual Cinematography Request","formFields":{"values":[{"fieldLabel":"Shot Code","placeholder":"SQ080_SH010","requiredField":true},{"fieldType":"textarea","fieldLabel":"Script Snippet","placeholder":"Camera starts behind hero, swoops around in slow motion, then races through the crowd toward the villain...","requiredField":true},{"fieldLabel":"Lens / Camera Specs","placeholder":"14mm anamorphic, drone rig, 240fps slowmo"},{"fieldLabel":"Plate Image URL","placeholder":"https://your-server.com/location_plate.jpg","requiredField":true},{"fieldType":"dropdown","fieldLabel":"Move Complexity","fieldOptions":{"values":[{"option":"Simple — single axis move"},{"option":"Medium — multi-axis choreography"},{"option":"Complex — impossible / virtual camera"},{"option":"Hero — signature shot / oner"}]},"requiredField":true},{"fieldType":"email","fieldLabel":"Supervisor Email","placeholder":"user@example.com"}]},"formDescription":"Describe your complex shot. AI will translate your intent into technical camera choreography briefs, then generate multiple video options for supervisor selection."},"typeVersion":2.2},{"id":"2b397314-283e-4c19-8b80-808704e21e06","name":"Compile Previs Board Package1","type":"n8n-nodes-base.code","position":[3184,800],"parameters":{"jsCode":"const allMoves = $input.all().map(i => i.json);\nconst first = allMoves[0];\n\nconst moveCards = allMoves.map((m, idx) => {\n  const letter = String.fromCharCode(65 + idx);\n  return `${m.moveIcon} *Option ${letter} — ${m.moveName}* (${m.moveId})\\n` +\n    `> 🎥 Style: ${m.moveStyle}\\n` +\n    `> 💡 ${m.supervisorNote}\\n` +\n    `> 🎬 <${m.videoUrl}|Watch Option ${letter}>\\n` +\n    `> 📍 Key Frames: ${m.keyFrames.map(k => k.label).join(' → ')}`;\n}).join('\\n\\n');\n\nconst jiraDesc = allMoves.map((m, idx) => {\n  const letter = String.fromCharCode(65 + idx);\n  return `*Option ${letter}: ${m.moveName}*\\n${m.supervisorNote}\\nVideo: ${m.videoUrl}`;\n}).join('\\n\\n');\n\nconst tableRows = allMoves.map((m, idx) => {\n  const letter = String.fromCharCode(65 + idx);\n  return `<tr>\n    <td><strong>Option ${letter}</strong></td>\n    <td>${m.moveIcon} ${m.moveName}</td>\n    <td>${m.moveStyle}</td>\n    <td>${m.supervisorNote}</td>\n    <td><a href=\"${m.videoUrl}\">Watch</a></td>\n    <td>${m.resolution || '720p'}</td>\n  </tr>`;\n}).join('');\n\nconst lookbookHtml = `<h1>🎬 AI Previs Board — ${first.shotCode}</h1>\n<p><strong>Sequence:</strong> ${first.sequenceCode} | <strong>Shot Intent:</strong> ${first.shotIntent}</p>\n<p><strong>Script:</strong> ${first.scriptSnippet}</p>\n<p><strong>Lens/Camera:</strong> ${first.lensSpecs} | <strong>Complexity:</strong> ${first.complexity}</p>\n<h2>Camera Options — Supervisor: Please select one</h2>\n<table><thead><tr><th>Option</th><th>Name</th><th>Style</th><th>Director Note</th><th>Video</th><th>Res</th></tr></thead><tbody>${tableRows}</tbody></table>\n<h2>Key Frame Guide</h2>\n<ul>${first.keyFrames.map(k => `<li><strong>${k.timecode}</strong> — ${k.label}</li>`).join('')}</ul>\n<p><em>Generated by AI Previs Pipeline — ${new Date().toISOString()}</em></p>`;\n\nreturn [{ json: {\n  shotCode:        first.shotCode,\n  sequenceCode:    first.sequenceCode,\n  shotIntent:      first.shotIntent,\n  scriptSnippet:   first.scriptSnippet,\n  lensSpecs:       first.lensSpecs,\n  complexity:      first.complexity,\n  supervisorEmail: first.supervisorEmail,\n  plateImageUrl:   first.plateImageUrl,\n  allMoves,\n  moveCards,\n  jiraDesc,\n  lookbookHtml,\n  totalMoves:      allMoves.length,\n  generatedAt:     new Date().toISOString()\n}}];"},"typeVersion":2},{"id":"d222ad6e-e474-4331-92b3-4f5f40ac36b2","name":"Slack: Publish Previs Board1","type":"n8n-nodes-base.slack","position":[3888,624],"webhookId":"fe1bf20c-7798-44e8-b0a5-aafb7ae59509","parameters":{"text":"=🎬 *AI Previs Board Ready — {{ $json.shotCode }}*\n\n📋 *Sequence:* {{ $json.sequenceCode }} | *Complexity:* {{ $json.complexity }}\n🎯 *Shot Intent:* {{ $json.shotIntent }}\n📝 *Script:* {{ $json.scriptSnippet }}\n🎥 *Lens:* {{ $json.lensSpecs }}\n\n*── 3 Camera Options for Supervisor Review ──*\n{{ $json.moveCards }}\n\n👆 *Supervisor — reply with Option A, B, or C. Your choice will be auto-attached to the shot task in Jira.*\n\n_AI previs generated in {{ $json.totalMoves }} camera variations. Generated: {{ $json.generatedAt }}_","select":"channel","channelId":{"__rl":true,"mode":"list","value":"YOUR_SLACK_CHANNEL_ID","cachedResultName":"your-channel-name"},"otherOptions":{},"authentication":"oAuth2"},"typeVersion":2.3},{"id":"1edb0914-e112-43e4-948f-66113b3d9553","name":"On Workflow Error","type":"n8n-nodes-base.errorTrigger","position":[624,1680],"parameters":{},"typeVersion":1},{"id":"30233fa0-16ff-4328-9b00-0e7a978b1680","name":"Slack: Error Alert","type":"n8n-nodes-base.slack","position":[880,1680],"webhookId":"36b019e6-a01f-483e-8300-214089e84f91","parameters":{"text":"=❌ *AI-Assisted Clean Plate & Object Removal\n\nError: {{ $json.message }}\nTime: {{ new Date().toISOString() }}","select":"channel","channelId":{"__rl":true,"mode":"list","value":"C0ANFAL4WJ2","cachedResultName":"social"},"otherOptions":{},"authentication":"oAuth2"},"typeVersion":2.3},{"id":"41a8c016-ee06-4dd8-9bb1-61c46b6decce","name":"Section: Error Handler","type":"n8n-nodes-base.stickyNote","position":[544,1520],"parameters":{"color":7,"width":492,"height":328,"content":"## ⚠️ Error Handler\nCatches any failure across the entire workflow and immediately sends a Slack alert to the ops channel. Wire this to every sub-workflow or critical node to ensure no silent failures."},"typeVersion":1}],"active":false,"pinData":{},"settings":{"binaryMode":"separate","executionOrder":"v1"},"versionId":"9eea25f1-e862-4f3c-85a0-0bc6c172a9b6","connections":{"On Workflow Error":{"main":[[{"node":"Slack: Error Alert","type":"main","index":0}]]},"Move Render Complete?":{"main":[[{"node":"Collect Move + Tag Key Frames","type":"main","index":0}],[{"node":"Wait 20s Before Retry","type":"main","index":0}]]},"Wait 20s Before Retry":{"main":[[{"node":"Poll: Check Move Render Status","type":"main","index":0}]]},"Azure OpenAI: GPT-4o Mini":{"ai_languageModel":[[{"node":"AI Agent: Generate Camera Options","type":"ai_languageModel","index":0}]]},"Extract & Map Form Fields":{"main":[[{"node":"AI Agent: Generate Camera Options","type":"main","index":0}]]},"Form: Previs Brief Input1":{"main":[[{"node":"Extract & Map Form Fields","type":"main","index":0}]]},"Build Seedance API Request":{"main":[[{"node":"Seedance: Submit Camera Move Job","type":"main","index":0}]]},"Store Job ID + Move Metadata":{"main":[[{"node":"Poll: Check Move Render Status","type":"main","index":0}]]},"Collect Move + Tag Key Frames":{"main":[[{"node":"Compile Previs Board Package1","type":"main","index":0},{"node":"Download Lighting Reference Video","type":"main","index":0}]]},"Compile Previs Board Package1":{"main":[[{"node":"Slack: Publish Previs Board1","type":"main","index":0},{"node":"Jira: Create Previs Review Task","type":"main","index":0},{"node":"ClickUp: Create Previs Production Record","type":"main","index":0},{"node":"Telegram: Deliver Previs to Supervisor","type":"main","index":0}]]},"Poll: Check Move Render Status":{"main":[[{"node":"Move Render Complete?","type":"main","index":0}]]},"Seedance: Submit Camera Move Job":{"main":[[{"node":"Store Job ID + Move Metadata","type":"main","index":0}]]},"AI Agent: Generate Camera Options":{"main":[[{"node":"Parse AI Response → Seedance Items","type":"main","index":0}],[{"node":"Telegram: Alert on AI Agent Failure","type":"main","index":0}]]},"Download Lighting Reference Video":{"main":[[{"node":"Google Drive: Archive Lighting Ref","type":"main","index":0}]]},"Telegram: Alert on AI Agent Failure":{"main":[[{"node":"Extract & Map Form Fields","type":"main","index":0}]]},"Parse AI Response → Seedance Items":{"main":[[{"node":"Build Seedance API Request","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":29,"nodeTypes":{"n8n-nodes-base.if":{"count":1},"n8n-nodes-base.code":{"count":6},"n8n-nodes-base.jira":{"count":1},"n8n-nodes-base.wait":{"count":1},"n8n-nodes-base.slack":{"count":2},"n8n-nodes-base.clickUp":{"count":1},"n8n-nodes-base.telegram":{"count":2},"n8n-nodes-base.stickyNote":{"count":7},"n8n-nodes-base.formTrigger":{"count":1},"n8n-nodes-base.googleDrive":{"count":1},"n8n-nodes-base.httpRequest":{"count":3},"n8n-nodes-base.errorTrigger":{"count":1},"@n8n/n8n-nodes-langchain.agent":{"count":1},"@n8n/n8n-nodes-langchain.lmChatAzureOpenAi":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"Rahul Joshi","username":"rahul08","bio":"Rahul Joshi is a seasoned technology leader specializing in the n8n automation tool and AI-driven workflow automation. With deep expertise in building open-source workflow automation and self-hosted automation platforms, he helps organizations eliminate manual processes through intelligent n8n ai agent automation solutions.\n\n","verified":true,"links":["https://www.linkedin.com/in/callrahul/"],"avatar":"https://gravatar.com/avatar/b6cf57822463143589b36ada06fbf6cb1509223a740fae3160b28f1ce41ccc12?r=pg&d=retro&size=200"},"nodes":[{"id":12,"icon":"fa:bug","name":"n8n-nodes-base.errorTrigger","codex":{"data":{"details":"In n8n, when a workflow execution fails, it can start another workflow. This second workflow can be any arbitrary workflow on your n8n instance. Use the Error Trigger node as your Trigger in the Error workflow.","resources":{"generic":[{"url":"https://n8n.io/blog/creating-error-workflows-in-n8n/","icon":"🌪","label":"Creating Error Workflows in n8n"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.errortrigger/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Other Trigger Nodes"]}}},"group":"[\"trigger\"]","defaults":{"name":"Error Trigger","color":"#0000FF"},"iconData":{"icon":"bug","type":"icon"},"displayName":"Error Trigger","typeVersion":1,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":19,"icon":"file:httprequest.svg","name":"n8n-nodes-base.httpRequest","codex":{"data":{"alias":["API","Request","URL","Build","cURL"],"resources":{"generic":[{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/","icon":"✍️","label":"Learn how to automatically cross-post your content with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/","icon":" 🪢","label":"What are APIs and how to use them with no code"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/world-poetry-day-workflow/","icon":"📜","label":"Celebrating World Poetry Day with a daily poem in Telegram"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automate-designs-with-bannerbear-and-n8n/","icon":"🎨","label":"Automate Designs with Bannerbear and n8n"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/how-to-use-the-http-request-node-the-swiss-army-knife-for-workflow-automation/","icon":"🧰","label":"How to use the HTTP Request Node - The Swiss Army Knife for Workflow Automation"},{"url":"https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/","icon":"🦄","label":"Learn how to use webhooks with Mattermost slash commands"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"},{"url":"https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/","icon":"🤟","label":"Creating scheduled text affirmations with n8n"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"output\"]","defaults":{"name":"HTTP Request","color":"#0004F5"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCAyMEM0MCA4Ljk1MzE0IDMxLjA0NjkgMCAyMCAwQzguOTUzMTQgMCAwIDguOTUzMTQgMCAyMEMwIDMxLjA0NjkgOC45NTMxNCA0MCAyMCA0MEMzMS4wNDY5IDQwIDQwIDMxLjA0NjkgNDAgMjBaTTIwIDM2Ljk0NThDMTguODg1MiAzNi45NDU4IDE3LjEzNzggMzUuOTY3IDE1LjQ5OTggMzIuNjk4NUMxNC43OTY0IDMxLjI5MTggMTQuMTk2MSAyOS41NDMxIDEzLjc1MjYgMjcuNjg0N0gyNi4xODk4QzI1LjgwNDUgMjkuNTQwMyAyNS4yMDQ0IDMxLjI5MDEgMjQuNTAwMiAzMi42OTg1QzIyLjg2MjIgMzUuOTY3IDIxLjExNDggMzYuOTQ1OCAyMCAzNi45NDU4Wk0xMi45MDY0IDIwQzEyLjkwNjQgMjEuNjA5NyAxMy4wMDg3IDIzLjE2NCAxMy4yMDAzIDI0LjYzMDVIMjYuNzk5N0MyNi45OTEzIDIzLjE2NCAyNy4wOTM2IDIxLjYwOTcgMjcuMDkzNiAyMEMyNy4wOTM2IDE4LjM5MDMgMjYuOTkxMyAxNi44MzYgMjYuNzk5NyAxNS4zNjk1SDEzLjIwMDNDMTMuMDA4NyAxNi44MzYgMTIuOTA2NCAxOC4zOTAzIDEyLjkwNjQgMjBaTTIwIDMuMDU0MTlDMjEuMTE0OSAzLjA1NDE5IDIyLjg2MjIgNC4wMzA3OCAyNC41MDAxIDcuMzAwMzlDMjUuMjA2NiA4LjcxNDA4IDI1LjgwNzIgMTAuNDA2NyAyNi4xOTIgMTIuMzE1M0gxMy43NTAxQzE0LjE5MzMgMTAuNDA0NyAxNC43OTQyIDguNzEyNTQgMTUuNDk5OCA3LjMwMDY0QzE3LjEzNzcgNC4wMzA4MyAxOC44ODUxIDMuMDU0MTkgMjAgMy4wNTQxOVpNMzAuMTQ3OCAyMEMzMC4xNDc4IDE4LjQwOTkgMzAuMDU0MyAxNi44NjE3IDI5LjgyMjcgMTUuMzY5NUgzNi4zMDQyQzM2LjcyNTIgMTYuODQyIDM2Ljk0NTggMTguMzk2NCAzNi45NDU4IDIwQzM2Ljk0NTggMjEuNjAzNiAzNi43MjUyIDIzLjE1OCAzNi4zMDQyIDI0LjYzMDVIMjkuODIyN0MzMC4wNTQzIDIzLjEzODMgMzAuMTQ3OCAyMS41OTAxIDMwLjE0NzggMjBaTTI2LjI3NjcgNC4yNTUxMkMyNy42MzY1IDYuMzYwMTkgMjguNzExIDkuMTMyIDI5LjM3NzQgMTIuMzE1M0gzNS4xMDQ2QzMzLjI1MTEgOC42NjggMzAuMTA3IDUuNzgzNDYgMjYuMjc2NyA0LjI1NTEyWk0xMC42MjI2IDEyLjMxNTNINC44OTI5M0M2Ljc1MTQ3IDguNjY3ODQgOS44OTM1MSA1Ljc4MzQxIDEzLjcyMzIgNC4yNTUxM0MxMi4zNjM1IDYuMzYwMjEgMTEuMjg5IDkuMTMyMDEgMTAuNjIyNiAxMi4zMTUzWk0zLjA1NDE5IDIwQzMuMDU0MTkgMjEuNjAzIDMuMjc3NDMgMjMuMTU3NSAzLjY5NDg0IDI0LjYzMDVIMTAuMTIxN0M5Ljk0NjE5IDIzLjE0MiA5Ljg1MjIyIDIxLjU5NDMgOS44NTIyMiAyMEM5Ljg1MjIyIDE4LjQwNTcgOS45NDYxOSAxNi44NTggMTAuMTIxNyAxNS4zNjk1SDMuNjk0ODRDMy4yNzc0MyAxNi44NDI1IDMuMDU0MTkgMTguMzk3IDMuMDU0MTkgMjBaTTI2LjI3NjYgMzUuNzQyN0MyNy42MzY1IDMzLjYzOTMgMjguNzExIDMwLjg2OCAyOS4zNzc0IDI3LjY4NDdIMzUuMTA0NkMzMy4yNTEgMzEuMzMyMiAzMC4xMDY4IDM0LjIxNzkgMjYuMjc2NiAzNS43NDI3Wk0xMy43MjM0IDM1Ljc0MjdDOS44OTM2OSAzNC4yMTc5IDYuNzUxNTUgMzEuMzMyNCA0Ljg5MjkzIDI3LjY4NDdIMTAuNjIyNkMxMS4yODkgMzAuODY4IDEyLjM2MzUgMzMuNjM5MyAxMy43MjM0IDM1Ljc0MjdaIiBmaWxsPSIjM0E0MkU5Ii8+Cjwvc3ZnPgo="},"displayName":"HTTP Request","typeVersion":4,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":20,"icon":"fa:map-signs","name":"n8n-nodes-base.if","codex":{"data":{"alias":["Router","Filter","Condition","Logic","Boolean","Branch"],"details":"The IF node can be used to implement binary conditional logic in your workflow. You can set up one-to-many conditions to evaluate each item of data being inputted into the node. That data will either evaluate to TRUE or FALSE and route out of the node accordingly.\n\nThis node has multiple types of conditions: Bool, String, Number, and Date & Time.","resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/","icon":"🤬","label":"Create a toxic language detector for Telegram in 4 step"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automation-for-maintainers-of-open-source-projects/","icon":"🏷️","label":"How to automatically manage contributions to open-source projects"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.if/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"transform\"]","defaults":{"name":"If","color":"#408000"},"iconData":{"icon":"map-signs","type":"icon"},"displayName":"If","typeVersion":2,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":40,"icon":"file:slack.svg","name":"n8n-nodes-base.slack","codex":{"data":{"alias":["human","form","wait","hitl","approval"],"resources":{"generic":[{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/","icon":"👦","label":"Build your own virtual assistant with n8n: A step by step guide"},{"url":"https://n8n.io/blog/how-to-automatically-give-kudos-to-contributors-with-github-slack-and-n8n/","icon":"👏","label":"How to automatically give kudos to contributors with GitHub, Slack, and n8n"},{"url":"https://n8n.io/blog/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.slack/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/slack/"}]},"categories":["Communication","HITL"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"HITL":["Human in the Loop"]}}},"group":"[\"output\"]","defaults":{"name":"Slack"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgMTUwLjg1MiAxNTAuODUyIj48dXNlIHhsaW5rOmhyZWY9IiNhIiB4PSIuOTI2IiB5PSIuOTI2Ii8+PHN5bWJvbCBpZD0iYSIgb3ZlcmZsb3c9InZpc2libGUiPjxnIHN0cm9rZS13aWR0aD0iMS44NTIiPjxwYXRoIGZpbGw9IiNlMDFlNWEiIHN0cm9rZT0iI2UwMWU1YSIgZD0iTTQwLjc0MSA5My41NWMwLTguNzM1IDYuNjA3LTE1Ljc3MiAxNC44MTUtMTUuNzcyczE0LjgxNSA3LjAzNyAxNC44MTUgMTUuNzcydjM4LjgyNGMwIDguNzM3LTYuNjA3IDE1Ljc3NC0xNC44MTUgMTUuNzc0cy0xNC44MTUtNy4wMzctMTQuODE1LTE1Ljc3MnoiLz48cGF0aCBmaWxsPSIjZWNiMjJkIiBzdHJva2U9IiNlY2IyMmQiIGQ9Ik05My41NSAxMDcuNDA4Yy04LjczNSAwLTE1Ljc3Mi02LjYwNy0xNS43NzItMTQuODE1czcuMDM3LTE0LjgxNSAxNS43NzItMTQuODE1aDM4LjgyNmM4LjczNSAwIDE1Ljc3MiA2LjYwNyAxNS43NzIgMTQuODE1cy03LjAzNyAxNC44MTUtMTUuNzcyIDE0LjgxNXoiLz48cGF0aCBmaWxsPSIjMmZiNjdjIiBzdHJva2U9IiMyZmI2N2MiIGQ9Ik03Ny43NzggMTUuNzcyQzc3Ljc3OCA3LjAzNyA4NC4zODUgMCA5Mi41OTMgMHMxNC44MTUgNy4wMzcgMTQuODE1IDE1Ljc3MnYzOC44MjZjMCA4LjczNS02LjYwNyAxNS43NzItMTQuODE1IDE1Ljc3MnMtMTQuODE1LTcuMDM3LTE0LjgxNS0xNS43NzJ6Ii8+PHBhdGggZmlsbD0iIzM2YzVmMSIgc3Ryb2tlPSIjMzZjNWYxIiBkPSJNMTUuNzcyIDcwLjM3MUM3LjAzNyA3MC4zNzEgMCA2My43NjMgMCA1NS41NTZzNy4wMzctMTQuODE1IDE1Ljc3Mi0xNC44MTVoMzguODI2YzguNzM1IDAgMTUuNzcyIDYuNjA3IDE1Ljc3MiAxNC44MTVzLTcuMDM3IDE0LjgxNS0xNS43NzIgMTQuODE1eiIvPjxnIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiPjxwYXRoIGZpbGw9IiNlY2IyMmQiIHN0cm9rZT0iI2VjYjIyZCIgZD0iTTc3Ljc3OCAxMzMuMzMzYzAgOC4yMDggNi42MDcgMTQuODE1IDE0LjgxNSAxNC44MTVzMTQuODE1LTYuNjA3IDE0LjgxNS0xNC44MTUtNi42MDctMTQuODE1LTE0LjgxNS0xNC44MTVINzcuNzc4eiIvPjxwYXRoIGZpbGw9IiMyZmI2N2MiIHN0cm9rZT0iIzJmYjY3YyIgZD0iTTEzMy4zMzQgNzAuMzcxaC0xNC44MTVWNTUuNTU2YzAtOC4yMDcgNi42MDctMTQuODE1IDE0LjgxNS0xNC44MTVzMTQuODE1IDYuNjA3IDE0LjgxNSAxNC44MTUtNi42MDcgMTQuODE1LTE0LjgxNSAxNC44MTV6Ii8+PHBhdGggZmlsbD0iI2UwMWU1YSIgc3Ryb2tlPSIjZTAxZTVhIiBkPSJNMTQuODE1IDc3Ljc3OEgyOS42M3YxNC44MTVjMCA4LjIwNy02LjYwNyAxNC44MTUtMTQuODE1IDE0LjgxNVMwIDEwMC44IDAgOTIuNTkzczYuNjA3LTE0LjgxNSAxNC44MTUtMTQuODE1eiIvPjxwYXRoIGZpbGw9IiMzNmM1ZjEiIHN0cm9rZT0iIzM2YzVmMSIgZD0iTTcwLjM3MSAxNC44MTVWMjkuNjNINTUuNTU2Yy04LjIwNyAwLTE0LjgxNS02LjYwNy0xNC44MTUtMTQuODE1UzQ3LjM0OCAwIDU1LjU1NiAwczE0LjgxNSA2LjYwNyAxNC44MTUgMTQuODE1eiIvPjwvZz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Slack","typeVersion":2,"nodeCategories":[{"id":6,"name":"Communication"},{"id":28,"name":"HITL"}]},{"id":49,"icon":"file:telegram.svg","name":"n8n-nodes-base.telegram","codex":{"data":{"alias":["human","form","wait","hitl","approval"],"resources":{"generic":[{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/","icon":"🤬","label":"Create a toxic language detector for Telegram in 4 step"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/world-poetry-day-workflow/","icon":"📜","label":"Celebrating World Poetry Day with a daily poem in Telegram"},{"url":"https://n8n.io/blog/using-automation-to-boost-productivity-in-the-workplace/","icon":"💪","label":"Using Automation to Boost Productivity in the Workplace"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/","icon":"🤟","label":"Creating scheduled text affirmations with n8n"},{"url":"https://n8n.io/blog/creating-telegram-bots-with-n8n-a-no-code-platform/","icon":"💬","label":"Creating Telegram Bots with n8n, a No-Code Platform"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.telegram/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/telegram/"}]},"categories":["Communication","HITL"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"HITL":["Human in the Loop"]}}},"group":"[\"output\"]","defaults":{"name":"Telegram"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgNjYgNjYiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0ibm9uZSI+PHBhdGggZmlsbD0iIzM3YWVlMiIgZD0iTTAgMzJjMCAxNy42NzMgMTQuMzI3IDMyIDMyIDMyczMyLTE0LjMyNyAzMi0zMlM0OS42NzMgMCAzMiAwIDAgMTQuMzI3IDAgMzIiLz48cGF0aCBmaWxsPSIjYzhkYWVhIiBkPSJtMjEuNjYxIDM0LjMzOCAzLjc5NyAxMC41MDhzLjQ3NS45ODMuOTgzLjk4MyA4LjA2OC03Ljg2NCA4LjA2OC03Ljg2NGw4LjQwNy0xNi4yMzctMjEuMTE5IDkuODk4eiIvPjxwYXRoIGZpbGw9IiNhOWM2ZDgiIGQ9Im0yNi42OTUgMzcuMDM0LS43MjkgNy43NDZzLS4zMDUgMi4zNzMgMi4wNjggMGw0LjY0NC00LjIwMyIvPjxwYXRoIGQ9Im0yMS43MyAzNC43MTItNy44MDktMi41NDVzLS45MzItLjM3OC0uNjMzLTEuMjM3Yy4wNjItLjE3Ny4xODYtLjMyOC41NTktLjU4OCAxLjczMS0xLjIwNiAzMi4wMjgtMTIuMDk2IDMyLjAyOC0xMi4wOTZzLjg1Ni0uMjg4IDEuMzYxLS4wOTdjLjIzMS4wODguMzc4LjE4Ny41MDMuNTQ4LjA0NS4xMzIuMDcxLjQxMS4wNjguNjg5LS4wMDMuMjAxLS4wMjcuMzg2LS4wNDUuNjc4LS4xODQgMi45NzgtNS43MDYgMjUuMTk4LTUuNzA2IDI1LjE5OHMtLjMzIDEuMy0xLjUxNCAxLjM0NWMtLjQzMi4wMTYtLjk1Ni0uMDcxLTEuNTgyLS42MS0yLjMyMy0xLjk5OC0xMC4zNTItNy4zOTQtMTIuMTI2LTguNThhLjM0LjM0IDAgMCAxLS4xNDYtLjIzOWMtLjAyNS0uMTI1LjEwOC0uMjguMTA4LS4yOHMxMy45OC0xMi40MjcgMTQuMzUyLTEzLjczMWMuMDI5LS4xMDEtLjA3OS0uMTUxLS4yMjYtLjEwNy0uOTI5LjM0Mi0xNy4wMjUgMTAuNTA2LTE4LjgwMSAxMS42MjktLjEwNC4wNjYtLjM5NS4wMjMtLjM5NS4wMjMiLz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Telegram","typeVersion":1,"nodeCategories":[{"id":6,"name":"Communication"},{"id":28,"name":"HITL"}]},{"id":58,"icon":"file:googleDrive.svg","name":"n8n-nodes-base.googleDrive","codex":{"data":{"resources":{"generic":[{"url":"https://n8n.io/blog/your-business-doesnt-need-you-to-operate/","icon":" 🖥️","label":"Hey founders! Your business doesn't need you to operate"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googledrive/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Data & Storage"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\"]","defaults":{"name":"Google Drive"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgODEgNzMiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0ibm9uZSI+PHBhdGggZmlsbD0iIzAwNjZkYSIgZD0ibTYuMDQ4IDYxLjI2IDMuNTI4IDYuMDk0Yy43MzMgMS4yODMgMS43ODcgMi4yOTEgMy4wMjQgMy4wMjRsMTIuNi0yMS44MUgwYTguMyA4LjMgMCAwIDAgMS4xIDQuMTI0eiIvPjxwYXRoIGZpbGw9IiMwMGFjNDciIGQ9Ik00MCAyMi45MSAyNy40IDEuMWMtMS4yMzcuNzMzLTIuMjkxIDEuNzQxLTMuMDI0IDMuMDI0TDEuMSA0NC40NDVBOC4zIDguMyAwIDAgMCAwIDQ4LjU2OGgyNS4yeiIvPjxwYXRoIGZpbGw9IiNlYTQzMzUiIGQ9Ik02Ny40IDcwLjM3OGMxLjIzNy0uNzMzIDIuMjkxLTEuNzQxIDMuMDI0LTMuMDI0bDEuNDY2LTIuNTIgNy4wMS0xMi4xNDJhOC4zIDguMyAwIDAgMCAxLjEtNC4xMjRINTQuNzk4bDUuMzYzIDEwLjUzOHoiLz48cGF0aCBmaWxsPSIjMDA4MzJkIiBkPSJNNDAgMjIuOTEgNTIuNiAxLjFDNTEuMzYzLjM2NyA0OS45NDMgMCA0OC40NzcgMEgzMS41MjRjLTEuNDY2IDAtMi44ODcuNDEyLTQuMTI0IDEuMXoiLz48cGF0aCBmaWxsPSIjMjY4NGZjIiBkPSJNNTQuNzk5IDQ4LjU2OEgyNS4ybC0xMi42IDIxLjgxYzEuMjM3LjczMyAyLjY1NyAxLjEgNC4xMjQgMS4xaDQ2LjU1MmMxLjQ2NiAwIDIuODg3LS40MTIgNC4xMjQtMS4xeiIvPjxwYXRoIGZpbGw9IiNmZmJhMDAiIGQ9Ik02Ny4yNjIgMjQuMjg0IDU1LjYyNCA0LjEyNEM1NC44OTEgMi44NDEgNTMuODM3IDEuODMzIDUyLjYgMS4xTDQwIDIyLjkxbDE0LjggMjUuNjU5aDI1LjE1NWE4LjMgOC4zIDAgMCAwLTEuMS00LjEyNHoiLz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Google Drive","typeVersion":3,"nodeCategories":[{"id":3,"name":"Data & Storage"}]},{"id":77,"icon":"file:jira.svg","name":"n8n-nodes-base.jira","codex":{"data":{"resources":{"generic":[{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/creating-custom-incident-response-workflows-with-n8n/","label":"How to automate every step of an incident response workflow"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.jira/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/jira/"}]},"categories":["Development","Productivity"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"output\"]","defaults":{"name":"Jira Software"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgNjguMjUgNzEuMjUiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9IjMuMTI1IiB5PSIzLjEyNSIvPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjkxLjklIiB4Mj0iMjguNDklIiB5MT0iNDAuMjIlIiB5Mj0iODEuNjMlIj48c3RvcCBvZmZzZXQ9IjE4JSIgc3RvcC1jb2xvcj0iIzAwNTJjYyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzI2ODRmZiIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iOC43JSIgeDI9IjcyLjI2JSIgeTE9IjU5LjE3JSIgeTI9IjE3Ljk5JSI+PHN0b3Agb2Zmc2V0PSIxOCUiIHN0b3AtY29sb3I9IiMwMDUyY2MiLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMyNjg0ZmYiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48c3ltYm9sIGlkPSJhIiBvdmVyZmxvdz0idmlzaWJsZSI+PGcgZmlsbC1ydWxlPSJub256ZXJvIiBzdHJva2U9Im5vbmUiPjxwYXRoIGZpbGw9IiMyNjg0ZmYiIGQ9Ik02MS4xNjEgMzAuMjExIDMwLjk1IDAgLjc0IDMwLjIxMWEyLjU0IDIuNTQgMCAwIDAgMCAzLjU4MWwzMC4yMTEgMzAuMjEgMzAuMjExLTMwLjIxYTIuNTQgMi41NCAwIDAgMCAwLTMuNTgxek0zMC45NSA0MS40NmwtOS40NjItOS40NjIgOS40NjItOS40NjIgOS40NjIgOS40NjJ6Ii8+PHBhdGggZmlsbD0idXJsKCNiKSIgZD0iTTMwLjk1IDIyLjU5OUMyNC43NTUgMTYuNDA1IDI0LjcyNCA2LjM3IDMwLjg4MS4xMzhMMTAuMTE0IDIwLjc3NGwxMS4yNjggMTEuMjY4eiIvPjxwYXRoIGZpbGw9InVybCgjYykiIGQ9Ik00MC40MzcgMzEuOTczIDMwLjk1IDQxLjQ2YTE1LjkzIDE1LjkzIDAgMCAxIDAgMjIuNTM2bDIwLjc0OS0yMC43NDl6Ii8+PC9nPjwvc3ltYm9sPjwvc3ZnPg=="},"displayName":"Jira Software","typeVersion":1,"nodeCategories":[{"id":4,"name":"Productivity"},{"id":5,"name":"Development"}]},{"id":129,"icon":"file:clickup.svg","name":"n8n-nodes-base.clickUp","codex":{"data":{"resources":{"generic":[{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.clickup/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/clickup/"}]},"categories":["Productivity","Communication"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"output\"]","defaults":{"name":"ClickUp"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9Ii0xMCAwIDE1NSAxNTUiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjAlIiB5MT0iNjguMDElIiB5Mj0iNjguMDElIj48c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjODkzMEZEIi8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjNDlDQ0Y5Ii8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIwJSIgeTE9IjY4LjAxJSIgeTI9IjY4LjAxJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI0ZGMDJGMCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI0ZGQzgwMCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxnIGZpbGw9Im5vbmUiPjxwYXRoIGZpbGw9InVybCgjYSkiIGQ9Im0uNCAxMTkuMTIgMjMuODEtMTguMjRDMzYuODYgMTE3LjM5IDUwLjMgMTI1IDY1LjI2IDEyNWMxNC44OCAwIDI3Ljk0LTcuNTIgNDAuMDItMjMuOWwyNC4xNSAxNy44QzExMiAxNDIuNTIgOTAuMzQgMTU1IDY1LjI2IDE1NWMtMjUgMC00Ni44Ny0xMi40LTY0Ljg2LTM1Ljg4Ii8+PHBhdGggZmlsbD0idXJsKCNiKSIgZD0iTTY1LjE4IDM5Ljg0IDIyLjggNzYuMzYgMy4yMSA1My42NCA2NS4yNy4xNmw2MS41NyA1My41Mi0xOS42OCAyMi42NHoiLz48L2c+PC9zdmc+"},"displayName":"ClickUp","typeVersion":1,"nodeCategories":[{"id":4,"name":"Productivity"},{"id":6,"name":"Communication"}]},{"id":514,"icon":"fa:pause-circle","name":"n8n-nodes-base.wait","codex":{"data":{"alias":["pause","sleep","delay","timeout"],"resources":{"generic":[{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.wait/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Flow"]}}},"group":"[\"organization\"]","defaults":{"name":"Wait","color":"#804050"},"iconData":{"icon":"pause-circle","type":"icon"},"displayName":"Wait","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":565,"icon":"fa:sticky-note","name":"n8n-nodes-base.stickyNote","codex":{"data":{"alias":["Comments","Notes","Sticky"],"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\"]","defaults":{"name":"Sticky Note","color":"#FFD233"},"iconData":{"icon":"sticky-note","type":"icon"},"displayName":"Sticky Note","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":834,"icon":"file:code.svg","name":"n8n-nodes-base.code","codex":{"data":{"alias":["cpde","Javascript","JS","Python","Script","Custom Code","Function"],"details":"The Code node allows you to execute JavaScript in your workflow.","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Code"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Code","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":1119,"icon":"fa:robot","name":"@n8n/n8n-nodes-langchain.agent","codex":{"data":{"alias":["LangChain","Chat","Conversational","Plan and Execute","ReAct","Tools"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Agents","Root Nodes"]}}},"group":"[\"transform\"]","defaults":{"name":"AI Agent","color":"#404040"},"iconData":{"icon":"robot","type":"icon"},"displayName":"AI Agent","typeVersion":3,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]},{"id":1225,"icon":"file:form.svg","name":"n8n-nodes-base.formTrigger","codex":{"data":{"alias":["table","submit","post"],"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.formtrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Other Trigger Nodes"]}}},"group":"[\"trigger\"]","defaults":{"name":"On form submission"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0NiIgaGVpZ2h0PSI0MCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwQjdCQyIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMzQuOTc4IDM3LjczMmExLjU2IDEuNTYgMCAwIDEtMS41NjIgMS41NjNINi4yNmExLjU2IDEuNTYgMCAwIDEtMS41NjMtMS41NjNWOS42MDdjMC0uNDA1LjE1Ny0uNzk0LjQzOC0xLjA4Nmw2LjMwNC02LjUzMXY1LjM0NEg4LjIxM2ExLjE3MiAxLjE3MiAwIDEgMCAwIDIuMzQzaDQuNDNhMS4xNyAxLjE3IDAgMCAwIDEuMTcxLTEuMTcxVi4yMzJoMTkuNjAyYTEuNTYgMS41NiAwIDAgMSAxLjU2MiAxLjU2M3YxMC4zMjdsLTIuODYgMi44Ni04LjI1MiA4LjI3NmE0MTMuMDA2IDQxMy4wMDYgMCAwIDEtMS42NTQgMS42NjJsLS4zMzcuMzM3YTIgMiAwIDAgMC0uNTU3IDEuMDhMMjAuMyAzMS45MjJjLS4xMDguNjM4LS4yMTUgMS4wNzkuMjExIDEuNDE4LjQwMy4zMi45LjE3NCAxLjU0LjA2Nmw1LjQwOC0uOTI4YTIgMiAwIDAgMCAxLjA4LS41NTZsNi40NC02LjQyOXptLTI0LjAzLTIxLjI2NWExLjE4IDEuMTggMCAwIDAgMS4xNzEgMS4xNzJoMTMuMTYzYTEuMTcyIDEuMTcyIDAgMSAwIDAtMi4zNDRIMTIuMTE5YTEuMTcgMS4xNyAwIDAgMC0xLjE3MiAxLjE3Mm03LjI5NCAxNC43NjZhMS4xNyAxLjE3IDAgMCAwLTEuMTcyLTEuMTcySDEyLjEyYTEuMTcyIDEuMTcyIDAgMSAwIDAgMi4zNDNoNC45NTFhMS4xNyAxLjE3IDAgMCAwIDEuMTcyLTEuMTcybS44Ni03LjM5MWExLjE3IDEuMTcgMCAwIDAtMS4xNzItMS4xNzJoLTUuODExYTEuMTcyIDEuMTcyIDAgMSAwIDAgMi4zNDNoNS44MWExLjE2NCAxLjE2NCAwIDAgMCAxLjE3My0xLjE3MSIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwQjdCQyIgZD0ibTMzLjUzMiAxNi4zOTcgNC4yODktNC4yODkgMy43NTggMy43MSAxLjYxNy0xLjYxNiAyLjI1OCAyLjI1N2MuMjE4LjIxOC4zNC41MTMuMzQzLjgyLS4wMDIuMzExLS4xMjUuNjA4LS4zNDQuODNsLTYuODA0IDYuNzk2YTEuMTMgMS4xMyAwIDAgMS0uODI4LjM0MyAxLjE1IDEuMTUgMCAwIDEtLjgyOC0uMzQzIDEuMTggMS4xOCAwIDAgMSAwLTEuNjU3bDUuOTc2LTUuOTY4LTEuMzEyLTEuMzEzLTEuMzgzIDEuNDE0LTEzLjE0OSAxMy4xMjUtNC42MTcuNzgyLjc4Mi00LjYxNy4zMzYtLjMzNyAyLjU2MiAyLjU1NWExLjEgMS4xIDAgMCAwIC44MjguMzQ0Yy4zMTIuMDA1LjYxMi0uMTIuODI4LS4zNDRhMS4xOCAxLjE4IDAgMCAwIDAtMS42NTZsLTIuNTYyLTIuNTYyek00NC43MzYgMTIuMjRjMCAuNDE0LS4xNjMuODEtLjQ1NCAxLjEwMmwtLjkyMi45MTQtMy44NTItMy44MjguOTMtLjkzYTEuNTYzIDEuNTYzIDAgMCAxIDIuMjAzIDBsMS42NCAxLjY0MWMuMjkxLjI5My40NTUuNjkuNDU1IDEuMTAyIi8+PC9zdmc+"},"displayName":"n8n Form Trigger","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":1253,"icon":"file:azure.svg","name":"@n8n/n8n-nodes-langchain.lmChatAzureOpenAi","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.lmchatazureopenai/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Language Models","Root Nodes"],"Language Models":["Chat Models (Recommended)"]}}},"group":"[\"transform\"]","defaults":{"name":"Azure OpenAI Chat Model"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTYiIGhlaWdodD0iMjQyIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iNTguOTcyJSIgeDI9IjM3LjE5MSUiIHkxPSI3LjQxMSUiIHkyPSIxMDMuNzYyJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzExNEE4QiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzA2NjlCQyIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iNTkuNzE5JSIgeDI9IjUyLjY5MSUiIHkxPSI1Mi4zMTMlIiB5Mj0iNTQuODY0JSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1vcGFjaXR5PSIuMyIvPjxzdG9wIG9mZnNldD0iNy4xJSIgc3RvcC1vcGFjaXR5PSIuMiIvPjxzdG9wIG9mZnNldD0iMzIuMSUiIHN0b3Atb3BhY2l0eT0iLjEiLz48c3RvcCBvZmZzZXQ9IjYyLjMlIiBzdG9wLW9wYWNpdHk9Ii4wNSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1vcGFjaXR5PSIwIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSIzNy4yNzklIiB4Mj0iNjIuNDczJSIgeTE9IjQuNiUiIHkyPSI5OS45NzklIj48c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjM0NDQkY0Ii8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjMjg5MkRGIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHBhdGggZmlsbD0idXJsKCNhKSIgZD0iTTg1LjM0My4wMDNoNzUuNzUzTDgyLjQ1NyAyMzNhMTIuMDggMTIuMDggMCAwIDEtMTEuNDQyIDguMjE2SDEyLjA2QTEyLjA2IDEyLjA2IDAgMCAxIC42MzMgMjI1LjMwM0w3My44OTggOC4yMTlBMTIuMDggMTIuMDggMCAwIDEgODUuMzQzIDB6Ii8+PHBhdGggZmlsbD0iIzAwNzhENCIgZD0iTTE5NS40MjMgMTU2LjI4Mkg3NS4yOTdhNS41NiA1LjU2IDAgMCAwLTMuNzk2IDkuNjI3bDc3LjE5IDcyLjA0N2ExMi4xNCAxMi4xNCAwIDAgMCA4LjI4IDMuMjZoNjguMDJ6Ii8+PHBhdGggZmlsbD0idXJsKCNiKSIgZD0iTTg1LjM0My4wMDNhMTEuOTggMTEuOTggMCAwIDAtMTEuNDcxIDguMzc2TC43MjMgMjI1LjEwNWExMi4wNDUgMTIuMDQ1IDAgMCAwIDExLjM3IDE2LjExMmg2MC40NzVhMTIuOTMgMTIuOTMgMCAwIDAgOS45MjEtOC40MzdsMTQuNTg4LTQyLjk5MSA1Mi4xMDUgNDguNmExMi4zMyAxMi4zMyAwIDAgMCA3Ljc1NyAyLjgyOGg2Ny43NjZsLTI5LjcyMS04NC45MzUtODYuNjQzLjAyTDE2MS4zNy4wMDN6Ii8+PHBhdGggZmlsbD0idXJsKCNjKSIgZD0iTTE4Mi4wOTggOC4yMDdBMTIuMDYgMTIuMDYgMCAwIDAgMTcwLjY3LjAwM0g4Ni4yNDVjNS4xNzUgMCA5Ljc3MyAzLjMwMSAxMS40MjggOC4yMDRMMTcwLjk0IDIyNS4zYTEyLjA2MiAxMi4wNjIgMCAwIDEtMTEuNDI4IDE1LjkyaDg0LjQyOWExMi4wNjIgMTIuMDYyIDAgMCAwIDExLjQyNS0xNS45MnoiLz48L3N2Zz4="},"displayName":"Azure OpenAI Chat Model","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]}],"categories":[{"id":31,"name":"Content Creation"},{"id":51,"name":"Multimodal AI"}],"image":[]}}