This workflow corresponds to n8n.io template #10880 — we link there as the canonical source.
This workflow follows the Agent → Form Trigger recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "tgYe7SMum0MBmgwx",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Moodboard self create V1 template",
"tags": [
{
"id": "uvj9PpOqKwRGcFO6",
"name": "Template",
"createdAt": "2025-11-16T10:31:35.565Z",
"updatedAt": "2025-11-16T10:31:35.565Z"
}
],
"nodes": [
{
"id": "fdea9b3a-09ec-4aaa-a8e9-5a17c3d63db5",
"name": "Google Gemini Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
224,
496
],
"parameters": {
"options": {}
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "1f915d73-b808-416d-8cb9-c2eff7144666",
"name": "Structured Output Parser2",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
-960,
896
],
"parameters": {
"jsonSchemaExample": "{\n \"Image_prompt_1\": {\n \"title\": \"Image_prompt_1\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 1 here...\"\n },\n \"Image_prompt_2\": {\n \"title\": \"Image_prompt_2\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 2 here...\"\n },\n \"Image_prompt_3\": {\n \"title\": \"Image_prompt_3\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 3 here...\"\n },\n \"Image_prompt_4\": {\n \"title\": \"Image_prompt_4\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 4 here...\"\n },\n \"Image_prompt_5\": {\n \"title\": \"Image_prompt_5\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 5 here...\"\n },\n \"Image_prompt_6\": {\n \"title\": \"Image_prompt_6\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 6 here...\"\n },\n \"Image_prompt_7\": {\n \"title\": \"Image_prompt_7\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 7 here...\"\n },\n \"Image_prompt_8\": {\n \"title\": \"Image_prompt_8\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 8 here...\"\n },\n \"Image_prompt_9\": {\n \"title\": \"Image_prompt_9\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 9 here...\"\n },\n \"Image_prompt_10\": {\n \"title\": \"Image_prompt_10\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 10 here...\"\n },\n \"Image_prompt_11\": {\n \"title\": \"Image_prompt_11\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 10 here...\"\n },\n \"Image_prompt_12_Complete_3D_View\": {\n \"title\": \"Image_prompt_12\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 10 here...\"\n }\n}"
},
"typeVersion": 1.3
},
{
"id": "270750c8-4783-4499-ae49-7424cda468fa",
"name": "Think2",
"type": "@n8n/n8n-nodes-langchain.toolThink",
"position": [
-1088,
896
],
"parameters": {},
"typeVersion": 1.1
},
{
"id": "bca322b0-defe-4df1-ac26-3129162206e3",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-528,
672
],
"parameters": {
"options": {
"reset": false
}
},
"typeVersion": 3
},
{
"id": "52704f57-d723-4f48-b8eb-3a8eef907a64",
"name": "Create a folder",
"type": "n8n-nodes-base.nextCloud",
"onError": "continueRegularOutput",
"position": [
-1568,
672
],
"parameters": {
"path": "=/moodboard/{{ $json.localPart }}",
"resource": "folder"
},
"credentials": {
"nextCloudApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "12ed36b8-135f-4f26-bdea-47d9ccfdbafa",
"name": "Share a file",
"type": "n8n-nodes-base.nextCloud",
"position": [
208,
672
],
"parameters": {
"path": "=/moodboard/{{ $('Email extractor').item.json.localPart }}/{{ $('Concept Splitter').item.json.output.title }}.jpg",
"options": {},
"operation": "share",
"shareType": 3
},
"credentials": {
"nextCloudApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "c2f427d3-675e-409f-812d-09b902908122",
"name": "OpenRouter Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
-1344,
896
],
"parameters": {
"model": "anthropic/claude-sonnet-4",
"options": {}
},
"credentials": {
"openRouterApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "0295e8f0-55e9-4839-9684-b2e8fa60465f",
"name": "Simple Memory",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
-1216,
896
],
"parameters": {
"sessionKey": "={{ $('Moodbaord Form').item.json['Title '] }}",
"sessionIdType": "customKey"
},
"typeVersion": 1.3
},
{
"id": "446e41fe-5243-45b8-aaaa-057ddf5b2894",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2064,
272
],
"parameters": {
"color": 5,
"width": 208,
"height": 544,
"content": "### Creative Moodboard Request Form\n\nThis n8n form collects detailed moodboard requests. Users provide a concept title, description of colors, materials, textures, lighting, and desired elements, along with their email. Submissions are timestamped and marked as test or live, enabling automated workflows to generate customized moodboards based on user-defined specifications."
},
"typeVersion": 1
},
{
"id": "58c38997-b9e4-4806-b4a3-1c2baec69910",
"name": "Moodbaord Form",
"type": "n8n-nodes-base.formTrigger",
"position": [
-2016,
672
],
"parameters": {
"options": {},
"formTitle": "Moodboard",
"formFields": {
"values": [
{
"fieldLabel": "Title ",
"placeholder": "Modern Mediterranean Serenity",
"requiredField": true
},
{
"fieldType": "textarea",
"fieldLabel": "Description",
"placeholder": "=Create a moodboard for a Modern Mediterranean-inspired living room that blends coastal charm with contemporary minimalism. Include white stucco walls, arched doorways, terracotta floor tiles, and warm neutral tones like beige, cream, and soft taupe. Add woven textures, linen fabrics, ceramic vases, and olive-green accents through plants or cushions. Lighting should be natural and airy, with touches of wrought iron and brushed brass. Include inspirational images of Santorini-style patios, rustic wooden furniture, and breezy open-plan layouts. Convey a sense of calm, warmth, and timeless coastal sophistication.",
"requiredField": true
},
{
"fieldType": "email",
"fieldLabel": "Email",
"placeholder": "example@email.com",
"requiredField": true
}
]
},
"formDescription": "Generate moodboard"
},
"typeVersion": 2.3
},
{
"id": "39472196-967a-414f-a922-e8c3951a7413",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1840,
400
],
"parameters": {
"color": 5,
"height": 416,
"content": "### Email Local Part Extractor\n\nThis n8n Function node extracts the username from a submitted email. It splits the address at '@', removes optional '+' tags, and returns the cleaned local part. This value supports personalized file naming, folder structuring, and user identification in subsequent workflow steps."
},
"typeVersion": 1
},
{
"id": "a61c6b14-a07d-4c9f-b973-58d336390aeb",
"name": "Email extractor",
"type": "n8n-nodes-base.code",
"position": [
-1792,
672
],
"parameters": {
"jsCode": "// n8n Function node\n// Input: an email passed as parameter or via previous node\n// Output: local part (before @)\n\nconst email = $('Moodbaord Form').first().json.Email || ''; // adjust key if needed, e.g. $json.user_email\nconst stripPlus = true; // change to false to keep +tags (e.g. user+tag)\n\nlet local = email.trim().split('@')[0];\nif (stripPlus) local = local.split('+')[0];\n\nreturn [{ localPart: local }];\n"
},
"typeVersion": 2
},
{
"id": "2f573eb9-6a3a-4ab0-a8ff-26f87b006832",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1584,
368
],
"parameters": {
"color": 5,
"height": 464,
"content": "\n### Folder Creator\n\nThis node creates a dedicated folder in Nextcloud using the extracted email local part as the folder name. Generated moodboard images are stored in this personalized directory, organizing output by user and ensuring each moodboard request has its own identifiable storage location for easy retrieval and management within the automated workflow."
},
"typeVersion": 1
},
{
"id": "b2594385-5ef5-4826-b000-c10124ac2cba",
"name": "Conceptualization Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-1232,
672
],
"parameters": {
"text": "=Title: {{ $('Moodbaord Form').item.json['Title '] }}\nDescription: {{ $('Moodbaord Form').item.json.Description }}",
"options": {
"systemMessage": "=# Interior Design Moodboard Conceptualization Agent Prompt\n\nYou are an expert interior design conceptualization agent specializing in creating detailed moodboard layouts. You will receive project information in the following format:\n\n**Title:** {{ $json['Title '] }}\n**Description:** {{ $json.Description }}\n\n## Your Primary Task\n\nAnalyze the provided title and description thoroughly to develop a comprehensive conceptual layout for an interior design moodboard. Take your time to understand the aesthetic vision, functional requirements, style preferences, target audience, and emotional atmosphere described in the project brief.\n\n## Step 1: Conceptual Analysis (Internal Processing)\n\nBefore generating image prompts, internally analyze:\n\n1. **Design Style**: Determine the primary and secondary design styles (e.g., Modern Minimalist, Scandinavian, Industrial Chic, Mediterranean, Art Deco, Japandi, Bohemian, Contemporary Luxury, Rustic Farmhouse, Mid-Century Modern, etc.)\n\n2. **Color Palette**: Define 5-7 specific colors with exact names (e.g., \"Warm Terracotta #E07A5F\", \"Sage Green #87A878\", \"Cream White #F4F1DE\")\n\n3. **Material & Texture Story**: List key materials and textures (e.g., natural oak wood, brushed brass, linen upholstery, marble with grey veining, matte black metal, boucl\u00e9 fabric)\n\n4. **Spatial Context**: Specify which room(s) or space type(s) the design targets\n\n5. **Mood & Atmosphere**: Describe the emotional feeling and ambiance\n\n6. **Functional Requirements**: Note any practical considerations mentioned\n\n## Step 2: Generate 12 Detailed Image Prompts\n\nCreate exactly **12 image prompts** for an image generation agent. Each prompt must be **300-500 words**.\n\n### Image Prompt Requirements (Images 1-11)\n\nEach of the first 11 prompts must include:\n\n**Visual Composition**: Describe the exact framing, angle, and layout. Specify if it's a wide shot, close-up, flat lay, 3/4 angle view, etc.\n\n**Specific Objects & Elements**: Name real, researchable products, materials, and items. Include brand references when relevant (e.g., \"Eames lounge chair replica in walnut and black leather,\" \"Carrara marble hexagonal tiles,\" \"Flos Arco floor lamp in brushed stainless steel,\" \"West Elm mid-century console table,\" \"CB2 brass picture ledge,\" \"Muuto Dots wall hooks\")\n\n**Colors & Finishes**: Reference specific color names and hex codes. Describe finishes precisely (matte, glossy, brushed, polished, distressed, satin, honed, etc.)\n\n**Textures & Materials**: Detail the tactile qualities visible in the image. Describe how light interacts with surfaces (e.g., \"soft natural light creates subtle shadows on the ribbed texture of the sand-colored linen curtains\")\n\n**Lighting Conditions**: Specify the type and quality of lighting (natural daylight through large windows, warm ambient lighting, dramatic side lighting, soft diffused light, golden hour glow, overhead pendant lighting, etc.)\n\n**Styling Details**: Include decorative elements, accessories, and styling touches (plants like fiddle leaf fig or monstera, coffee table books, ceramic vases, throw pillows, artwork, rugs, etc.)\n\n**Context & Setting**: Provide environmental details (architectural features like exposed brick, crown molding, hardwood floors, background elements, spatial relationships)\n\n**Technical Specifications**: Include photography style notes (shallow depth of field, sharp focus on foreground, slightly warm color grading, high contrast, soft and airy, editorial style, architectural photography aesthetic)\n\n### Image 12: Comprehensive 3D View Requirement\n\n**Image 12 MUST be a complete 3D rendered view of the entire space** that incorporates and showcases ALL elements from Images 1-11. This final image should:\n\n**Spatial Integration**: Present a cohesive 3D perspective view (such as a 3/4 angle or corner view) that reveals the complete room layout, showing how all previously described elements come together in the actual space\n\n**Element Incorporation**: Visibly include all key furniture pieces, materials, textures, colors, and styling details from the previous 11 images in their proper spatial context\n\n**Realistic 3D Rendering Quality**: Describe the image as a high-quality 3D architectural visualization with realistic lighting, accurate material rendering, proper shadows and reflections, and photorealistic quality\n\n**Comprehensive Coverage**: Ensure the view captures the full spatial arrangement - walls, flooring, ceiling, windows, doors, and how all furniture and decor elements are positioned relative to each other\n\n**Design Cohesion**: Demonstrate how the individual elements from Images 1-11 work together to create the complete design vision, showing traffic flow, spatial relationships, and overall aesthetic harmony\n\n**Technical 3D Specifications**: Include details like rendering style (V-Ray, Corona, Unreal Engine aesthetic), camera angle (eye-level perspective, 3/4 view from corner), field of view, and lighting setup (natural + artificial light sources)\n\n### Image Distribution Guidelines (Images 1-11)\n\nYour first 11 images should include:\n\n- **2-3 Overall Room Views**: Wide shots showing partial spatial layouts or specific zones\n- **2-3 Furniture Pieces**: Key furniture items shot in context or as hero pieces\n- **2-3 Detail Shots**: Close-ups of materials, textures, or design details\n- **1-2 Accent/Styling Elements**: Decorative objects, textiles, or accessory groupings\n- **1-2 Color/Material Palette Shots**: Flat lay or arranged samples showing the material story\n\n## Quality Standards\n\nEach image prompt (1-12) must:\n\n\u2713 Reference **real, researchable objects** (actual furniture designs, known materials, recognizable styles)\n\u2713 Include **specific brand names or design references** when applicable\n\u2713 Provide **precise color descriptions** using both common names and hex codes\n\u2713 Describe **realistic lighting scenarios** that could be photographed or rendered\n\u2713 Create **cohesive visual storytelling** where Image 12 synthesizes all previous images\n\u2713 Maintain **high-end interior photography and 3D visualization aesthetic** standards\n\u2713 Be between **300-500 words each**\n\n## CRITICAL: Output Format\n\nYou must output your response as a **valid JSON object** with this exact structure:\n\n```json\n{\n \"Image_prompt_1\": {\n \"title\": \"Image_prompt_1\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 1 here...\"\n },\n \"Image_prompt_2\": {\n \"title\": \"Image_prompt_2\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 2 here...\"\n },\n \"Image_prompt_3\": {\n \"title\": \"Image_prompt_3\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 3 here...\"\n },\n \"Image_prompt_4\": {\n \"title\": \"Image_prompt_4\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 4 here...\"\n },\n \"Image_prompt_5\": {\n \"title\": \"Image_prompt_5\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 5 here...\"\n },\n \"Image_prompt_6\": {\n \"title\": \"Image_prompt_6\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 6 here...\"\n },\n \"Image_prompt_7\": {\n \"title\": \"Image_prompt_7\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 7 here...\"\n },\n \"Image_prompt_8\": {\n \"title\": \"Image_prompt_8\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 8 here...\"\n },\n \"Image_prompt_9\": {\n \"title\": \"Image_prompt_9\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 9 here...\"\n },\n \"Image_prompt_10\": {\n \"title\": \"Image_prompt_10\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 10 here...\"\n },\n \"Image_prompt_11\": {\n \"title\": \"Image_prompt_11\",\n \"prompt\": \"Your detailed 300-500 word prompt for image 11 here...\"\n },\n \"Image_prompt_12\": {\n \"title\": \"Image_prompt_12_Complete_3D_View\",\n \"prompt\": \"Your detailed 300-500 word prompt for the comprehensive 3D rendered view that incorporates ALL elements from images 1-11 in a complete spatial context...\"\n }\n}\n```\n\n**Important JSON Formatting Rules:**\n- Do not include any text before or after the JSON object\n- Ensure all string values are properly escaped (use `\\\"` for quotes within prompts, `\\n` for line breaks if needed)\n- Each prompt value must be a single string between 300-500 words\n- Do not include line breaks within the prompt strings unless escaped as `\\n`\n- Ensure the JSON is valid and parseable\n\n---\n\n**Remember:** Take your time to deeply understand the project brief. Images 1-11 should showcase individual elements, materials, furniture pieces, and details, while Image 12 MUST be a comprehensive 3D rendered view that brings everything together into a complete, cohesive spatial visualization. The quality and specificity of your prompts will directly determine the quality of the generated images and the effectiveness of the final moodboard. Every detail matters in creating a cohesive, inspiring, and professionally accurate interior design vision.\n\n**Your complete response should be ONLY the JSON object with the 12 image prompts. No additional text, explanations, or formatting outside the JSON structure.**"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 3
},
{
"id": "99a0ce9b-e48d-4090-848f-ee8d4cdd1ab7",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1248,
368
],
"parameters": {
"color": 5,
"width": 272,
"height": 448,
"content": "### Interior Design Moodboard Conceptualization Agent\n\nThis AI agent analyzes interior design briefs to generate 12 detailed 300\u2013500-word image prompts. Prompts 1\u201311 cover room views, furniture, materials, and styling with brand-specific details, while Prompt 12 provides a 3D rendered view. The output is structured in JSON for moodboard creation."
},
"typeVersion": 1
},
{
"id": "d5453bb3-fc7e-4448-b20d-551ac82e33e3",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-832,
336
],
"parameters": {
"color": 5,
"height": 496,
"content": "### Concept Image Splitter\n\nThis node splits the 12 generated image prompts from the Conceptualization Agent into individual items. It parses the JSON output and separates each detailed prompt (Image_prompt_1 through Image_prompt_12) for parallel processing, enabling each prompt to be sent independently to the image generation service in subsequent workflow steps."
},
"typeVersion": 1
},
{
"id": "d44be5bf-1a3b-46de-a4a4-1d28aecdcf1a",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-352,
608
],
"parameters": {
"color": 6,
"height": 464,
"content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n**Image Generator (Hugging Face API)**\n\nThis HTTP Request node sends each 300\u2013500-word prompt to the Hugging Face API, including colors, materials, textures, and composition details. It manages authentication and formatting, returning high-quality images that transform written design concepts into visual moodboard outputs."
},
"typeVersion": 1
},
{
"id": "97fe4e2a-8187-4061-a447-3e42925b11b9",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-576,
368
],
"parameters": {
"color": 6,
"width": 208,
"height": 448,
"content": "### Image Loop\n\nThis loop node processes each prompt sequentially, generating an image, uploading it to the designated Nextcloud folder, and retrieving a public URL. It repeats this for all 12 prompts, ensuring each moodboard image is created, stored, and accessible through direct Nextcloud links."
},
"typeVersion": 1
},
{
"id": "464c37d5-313a-4426-b1e4-8c241d587aa6",
"name": "Concept Splitter",
"type": "n8n-nodes-base.splitOut",
"position": [
-752,
672
],
"parameters": {
"include": "allOtherFields",
"options": {},
"fieldToSplitOut": "output"
},
"typeVersion": 1
},
{
"id": "375d0e16-ae87-43aa-b509-69cf8e7d0682",
"name": "Image Generator",
"type": "n8n-nodes-base.httpRequest",
"position": [
-304,
672
],
"parameters": {
"url": "https://router.huggingface.co/hf-inference/models/black-forest-labs/FLUX.1-schnell",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "=json",
"sendHeaders": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "inputs",
"value": "={{ $json.output.prompt }}"
}
]
},
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "Accept",
"value": "image/jpeg"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "8a34ec84-6c90-483c-9fdd-561c16600a75",
"name": "Upload Image",
"type": "n8n-nodes-base.nextCloud",
"onError": "continueRegularOutput",
"position": [
-80,
672
],
"parameters": {
"path": "=/moodboard/{{ $('Email extractor').item.json.localPart }}/{{ $json.output.title }}.jpg",
"binaryDataUpload": true
},
"credentials": {
"nextCloudApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "e6eb07fa-b31d-406b-bd23-692e2702d81c",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-96,
624
],
"parameters": {
"color": 6,
"height": 512,
"content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n**Nextcloud Image Uploader**\n\nThis node uploads each generated moodboard image to the user's designated Nextcloud folder. It transfers the image file received from Hugging Face API, stores it with appropriate naming conventions in the previously created directory, and handles authentication with the Nextcloud instance to ensure secure file storage within the automated workflow."
},
"typeVersion": 1
},
{
"id": "653e5dea-4c73-4309-a7c9-908799e66a70",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
160,
624
],
"parameters": {
"color": 6,
"width": 496,
"height": 384,
"content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n**Public URL Generator**\n\nThis node creates publicly shareable Nextcloud links for each uploaded moodboard image. It generates access URLs with appropriate permissions, enabling the images to be viewed externally without authentication. These public links are collected and prepared for inclusion in the final email notification sent to the user."
},
"typeVersion": 1
},
{
"id": "ff1fcc6a-f283-4a56-8627-94f3219942e2",
"name": "set image title and url",
"type": "n8n-nodes-base.set",
"position": [
496,
704
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "b205c1a0-d764-4da1-83c4-4530d897f7fc",
"name": "title",
"type": "string",
"value": "={{ $('Loop Over Items').item.json.output.title }}"
},
{
"id": "70ef2a19-bae7-4c66-9a65-1c279f57e9e9",
"name": "url",
"type": "string",
"value": "={{ $json.url }}/preview"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "56f363ee-5720-4f9e-94f3-3c5b88deb2f2",
"name": "URL Aggregate",
"type": "n8n-nodes-base.aggregate",
"position": [
-304,
384
],
"parameters": {
"options": {},
"aggregate": "aggregateAllItemData",
"destinationFieldName": "data_url"
},
"typeVersion": 1
},
{
"id": "cc71508b-1266-41ea-ad8e-75697df667e8",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
-368,
112
],
"parameters": {
"color": 4,
"height": 400,
"content": "### URL Aggregator\n\nThis node combines all 12 generated Nextcloud image URLs from the loop into a single consolidated output. It collects the public links created for each moodboard image and formats them into a structured list or array, preparing the complete set of accessible URLs for insertion into the final email notification to the user."
},
"typeVersion": 1
},
{
"id": "d7e5c4bf-fd44-4c41-96c4-f740bdde0930",
"name": "Clean URLs",
"type": "n8n-nodes-base.code",
"position": [
-80,
384
],
"parameters": {
"jsCode": "// n8n Code node\n// Extracts all URLs from data_url[] and returns them as a single list\n\n// Get the first input item (since your structure is in a single array)\nconst item = $input.first().json;\n\n// Ensure data_url exists and is an array\nconst dataList = item.data_url || [];\n\n// Extract all URLs\nconst urls = dataList.map(entry => entry.url);\n\n// Return them in a single array item\nreturn [\n {\n json: {\n urls, // full list of URLs\n count: urls.length // optional: number of URLs found\n }\n }\n];\n"
},
"typeVersion": 2
},
{
"id": "5e366007-6168-4212-83f5-447485072c77",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
-128,
112
],
"parameters": {
"color": 4,
"height": 416,
"content": "### URL Extraction Node\n\nThis Code node extracts all image URLs from the aggregated data_url array, formats them into a clean list, and returns a JSON object containing the URLs and their total count. This organized collection is then ready for seamless integration into the email template."
},
"typeVersion": 1
},
{
"id": "74a5c66c-3c1c-4085-807a-9dfcebc87255",
"name": "Sticky Note11",
"type": "n8n-nodes-base.stickyNote",
"position": [
112,
-112
],
"parameters": {
"color": 4,
"width": 304,
"height": 544,
"content": "### Two-Page Moodboard HTML Generator\n\nThis AI agent transforms interior design concepts into professional, print-ready HTML moodboards. It analyzes the project title, description, and 12 image URLs to select an appropriate visual style from 10 layout options. Page 1 showcases all images artistically with Image #12 (the 3D view) as the prominent hero element. Page 2 provides a comprehensive administrative summary including design overview, color palette with hex codes, materials, spatial program, and project details\u2014outputting complete, self-contained HTML ready for client presentation."
},
"typeVersion": 1
},
{
"id": "92210f31-3a8d-45c2-99f2-ed66afd84c9f",
"name": "Moodboard Generator Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
144,
272
],
"parameters": {
"text": "={\n \"title\": \"{{ $('Moodbaord Form').item.json['Title '] }}\",\n \"description\": \"{{ $('Moodbaord Form').item.json.Description }}\",\n \"originalUrls\":{{ $json.urls }}\n}",
"options": {
"systemMessage": "=# Two-Page Moodboard Generator for Gemini 2.5 Pro\n\n## Primary Objective\nGenerate a complete, self-contained HTML document creating a professional two-page moodboard presentation from provided title, description, and 12 image URLs.\n\n---\n\n## Input Structure\n```json\n{\n \"title\": \"Design Style Name\",\n \"description\": \"Detailed design concept description\",\n \"originalUrls\": [\"url1\", \"url2\", ..., \"url12\"]\n}\n```\n\n---\n\n## MANDATORY REQUIREMENTS\n\n### 1. Two-Page Structure (NON-NEGOTIABLE)\n```\nPAGE 1: Visual Moodboard\n- All 12 images displayed\n- Image #12 = PRIMARY FOCUS (2-3x larger than others)\n- Minimal text (title, color swatches only)\n- Artistic layout based on style selection\n\nPAGE 2: Administrative Summary\n- Comprehensive project documentation\n- Professional typography\n- All required sections (see Section 5)\n\nCRITICAL: Use `page-break-after: always` on Page 1 and `page-break-before: always` on Page 2\n```\n\n### 2. Image Implementation Rules\n- **USE ALL 12 URLs** from input array as `<img src=\"URL\">` tags\n- **NO lazy loading, NO data attributes, NO background-image CSS**\n- **Image #12 (index 11) = 3D view** - MUST occupy 2-3x more visual space\n- **Standard format**: `<img src=\"https://full-url-here.jpg\" alt=\"description\">`\n- **Verification**: Count input URLs (12) = Count `<img>` tags in output (12)\n\n### 3. Output Format\n- **ONLY output raw HTML** - no markdown code fences, no explanations\n- **Start immediately with**: `<!DOCTYPE html>`\n- **End with**: `</html>`\n- **Self-contained**: All CSS inline, only external dependency = Google Fonts\n\n---\n\n## Design Style Selection Matrix\n\nAnalyze title/description keywords and select ONE style (or blend multiple):\n\n| Style | Best For | Image #12 Placement | Layout Type |\n|-------|----------|---------------------|-------------|\n| **1. Modern Sectional Grid** | Contemporary, bold, vibrant | Hero section (50-60% width) | Asymmetric grid + color palette bar |\n| **2. Material Board Collage** | Textural, layered, artisan | Central floating element | Organic scattered arrangement |\n| **3. Editorial Magazine** | Luxury, narrative, lifestyle | Hero image (40-50% space) | Magazine-style mixed sizes |\n| **4. Clean Minimalist** | Scandinavian, contemporary | Focal point (2x others) | Asymmetric grid with white space |\n| **5. Split-Screen Dramatic** | High-contrast, commercial | Full left/right half | 50/50 or 60/40 split |\n| **6. Asymmetric Feature** | Boutique, creative studio | Panoramic header (60%) | Dynamic varied-size grid |\n| **7. Centered Showcase** | Luxury residential, hospitality | Centered (50% of page) | Symmetrical classical layout |\n| **8. Modular Block System** | Architectural, systematic | 2x2 or 3x2 block space | Perfect grid (e.g., 12-column) |\n| **9. Organic Flow** | Biophilic, wellness, natural | Organic shape with curves | Flowing natural composition |\n| **10. Layered Depth** | Innovative, conceptual | Background full-bleed layer | Overlapping with transparency |\n\n### Quick Selection Guide\n```\nKeywords Detection:\n- \"modern\", \"contemporary\", \"bold\" \u2192 Style 1, 4, 5, or 8\n- \"material\", \"texture\", \"artisan\" \u2192 Style 2 or 9\n- \"luxury\", \"editorial\", \"narrative\" \u2192 Style 3 or 7\n- \"minimalist\", \"Scandinavian\", \"clean\" \u2192 Style 4\n- \"dramatic\", \"commercial\", \"contrast\" \u2192 Style 5\n- \"creative\", \"boutique\", \"studio\" \u2192 Style 6\n- \"architectural\", \"systematic\" \u2192 Style 8\n- \"natural\", \"wellness\", \"biophilic\" \u2192 Style 9\n- \"innovative\", \"conceptual\", \"experiential\" \u2192 Style 10\n```\n\n---\n\n## Page 1: Moodboard Layout Specifications\n\n### Core Structure Elements\n```html\n<div class=\"page-1\" style=\"width: 210mm; height: 297mm; page-break-after: always;\">\n \n <!-- PRIMARY: Image #12 Container (2-3x larger) -->\n <div class=\"hero-image-12\">\n <img src=\"[URL_OF_IMAGE_12]\" alt=\"Complete 3D view of space\">\n </div>\n \n <!-- SECONDARY: Remaining 11 images in style-appropriate layout -->\n <div class=\"image-grid\">\n <img src=\"[URL_1]\" alt=\"...\">\n <!-- ... images 2-11 ... -->\n </div>\n \n <!-- OPTIONAL: Minimal text elements -->\n <div class=\"page-title\">[Title if style requires]</div>\n <div class=\"color-swatches\">[If style includes palette]</div>\n \n</div>\n```\n\n### Style-Specific Implementation Examples\n\n**Style 1 (Modern Sectional Grid)**:\n```css\n.hero-image-12 {\n width: 55%; \n height: 100%;\n float: left;\n}\n.image-grid {\n width: 45%;\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 5mm;\n}\n.color-swatches {\n position: absolute;\n bottom: 10mm;\n display: flex;\n height: 15mm;\n}\n```\n\n**Style 2 (Material Board Collage)**:\n```css\n.hero-image-12 {\n position: absolute;\n width: 60%;\n top: 20%;\n left: 20%;\n transform: rotate(-2deg);\n box-shadow: 0 8px 20px rgba(0,0,0,0.3);\n}\n.image-grid img {\n position: absolute;\n width: 15-25%; /* varied */\n transform: rotate(random -5\u00b0 to 5\u00b0);\n}\n```\n\n**Style 5 (Split-Screen Dramatic)**:\n```css\n.hero-image-12 {\n width: 50%;\n height: 100%;\n float: left;\n position: relative;\n}\n.image-grid {\n width: 50%;\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n grid-template-rows: repeat(4, 1fr);\n}\n```\n\n---\n\n## Page 2: Administrative Summary Template\n\n### Required Sections (In Order)\n\n```html\n<div class=\"page-2\" style=\"width: 210mm; min-height: 297mm; page-break-before: always; padding: 25mm;\">\n\n <!-- 1. HEADER -->\n <div class=\"summary-header\">\n <h1>[PROJECT TITLE]</h1>\n <p class=\"meta\">Project Reference: [AUTO-GENERATE] | Date: [CURRENT DATE]</p>\n </div>\n\n <!-- 2. DESIGN OVERVIEW (2-3 paragraphs) -->\n <div class=\"summary-section\">\n <h2>Design Overview</h2>\n <p>[Synthesize description: vision, concept, spatial approach]</p>\n </div>\n\n <!-- 3. KEY DESIGN ELEMENTS -->\n <div class=\"summary-section\">\n <h2>Key Design Elements</h2>\n <ul>\n <li><strong>Style Classification:</strong> [e.g., Contemporary Minimalist]</li>\n <li><strong>Primary Principles:</strong> [e.g., Balance, Contrast, Harmony]</li>\n <li><strong>Spatial Characteristics:</strong> [e.g., Open-plan, Layered zones]</li>\n </ul>\n </div>\n\n <!-- 4. COLOR PALETTE (Extract from description or infer from style) -->\n <div class=\"summary-section\">\n <h2>Color Palette</h2>\n <div class=\"color-specifications\">\n <div class=\"color-spec\">\n <div class=\"swatch\" style=\"background: #HEX;\"></div>\n <span>Color Name #HEX - [Usage/Psychology]</span>\n </div>\n <!-- Repeat for 4-6 colors -->\n </div>\n </div>\n\n <!-- 5. MATERIALS & FINISHES -->\n <div class=\"summary-section\">\n <h2>Materials & Finishes</h2>\n <ul>\n <li><strong>Primary:</strong> [e.g., Oak veneer, matte finish]</li>\n <li><strong>Secondary:</strong> [e.g., Brushed brass, natural stone]</li>\n <li><strong>Textiles:</strong> [e.g., Linen upholstery, wool rugs]</li>\n </ul>\n </div>\n\n <!-- 6. SPATIAL PROGRAM (if applicable) -->\n <div class=\"summary-section\">\n <h2>Spatial Program</h2>\n <ul>\n <li>[Area 1] - [Function/Size if mentioned]</li>\n <li>[Area 2] - [Function/Size if mentioned]</li>\n </ul>\n </div>\n\n <!-- 7. DESIGN FEATURES -->\n <div class=\"summary-section\">\n <h2>Notable Design Features</h2>\n <ul>\n <li><strong>Furniture:</strong> [Key pieces]</li>\n <li><strong>Lighting:</strong> [Approach/Fixtures]</li>\n <li><strong>Decorative Elements:</strong> [Art, accessories]</li>\n </ul>\n </div>\n\n <!-- 8. PROJECT DETAILS -->\n <div class=\"summary-section\">\n <h2>Project Details</h2>\n <ul>\n <li><strong>Scope:</strong> [Full interior design/Concept development]</li>\n <li><strong>Phase:</strong> [Design development/Concept stage]</li>\n <li><strong>Status:</strong> [Proposed/In progress]</li>\n </ul>\n </div>\n\n <!-- FOOTER -->\n <div class=\"footer\">\n <span>Interior Design Moodboard</span>\n <span>Page 2 of 2</span>\n <span>[CURRENT DATE]</span>\n </div>\n\n</div>\n```\n\n### Page 2 CSS Requirements\n```css\n.summary-header {\n margin-bottom: 15mm;\n border-bottom: 2px solid #333;\n padding-bottom: 5mm;\n}\n.summary-header h1 {\n font-size: 32px;\n margin-bottom: 3mm;\n font-weight: 600;\n}\n.summary-section {\n margin-bottom: 10mm;\n}\n.summary-section h2 {\n font-size: 18px;\n margin-bottom: 4mm;\n color: #333;\n font-weight: 600;\n}\n.summary-section p {\n font-size: 11px;\n line-height: 1.6;\n color: #444;\n}\n.summary-section ul {\n font-size: 11px;\n line-height: 1.8;\n margin-left: 5mm;\n color: #444;\n}\n.color-spec {\n display: inline-flex;\n align-items: center;\n margin-right: 5mm;\n margin-bottom: 2mm;\n}\n.color-spec .swatch {\n width: 8mm;\n height: 8mm;\n border-radius: 2px;\n margin-right: 2mm;\n border: 1px solid #ddd;\n}\n.footer {\n position: absolute;\n bottom: 15mm;\n left: 25mm;\n right: 25mm;\n font-size: 9px;\n color: #888;\n border-top: 1px solid #ddd;\n padding-top: 3mm;\n display: flex;\n justify-content: space-between;\n}\n```\n\n---\n\n## Complete HTML Structure Template\n\n```html\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>[PROJECT TITLE] - Design Moodboard</title>\n <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600&family=Playfair+Display:wght@400;600&display=swap\" rel=\"stylesheet\">\n <style>\n @page {\n size: A4;\n margin: 0;\n }\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n body {\n width: 210mm;\n margin: 0 auto;\n background: #ffffff;\n font-family: 'Inter', sans-serif;\n }\n \n /* PAGE 1 STYLES - [STYLE NAME] */\n .page-1 {\n width: 210mm;\n height: 297mm;\n page-break-after: always;\n position: relative;\n background: [STYLE-APPROPRIATE-BG];\n overflow: hidden;\n }\n \n /* Image #12 HERO (2-3x larger than others) */\n .hero-image-12 {\n /* Style-specific positioning */\n /* Ensure 2-3x visual prominence */\n }\n .hero-image-12 img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n \n /* Remaining 11 images */\n .image-grid {\n /* Style-specific layout */\n }\n .image-grid img {\n width: [SIZE];\n height: [SIZE];\n object-fit: cover;\n }\n \n /* Optional page 1 text elements */\n .page-title {\n /* If style includes title on page 1 */\n }\n .color-swatches {\n /* If style includes color display */\n }\n\n /* PAGE 2 STYLES */\n .page-2 {\n width: 210mm;\n min-height: 297mm;\n page-break-before: always;\n padding: 25mm;\n background: #ffffff;\n position: relative;\n }\n \n /* [All Page 2 CSS from above section] */\n\n @media print {\n .page-1, .page-2 {\n page-break-inside: avoid;\n }\n }\n </style>\n</head>\n<body>\n\n <!-- PAGE 1: VISUAL MOODBOARD -->\n <div class=\"page-1\">\n <div class=\"hero-image-12\">\n <img src=\"[IMAGE_12_URL]\" alt=\"Complete 3D interior view\">\n </div>\n <div class=\"image-grid\">\n <img src=\"[IMAGE_1_URL]\" alt=\"...\">\n <img src=\"[IMAGE_2_URL]\" alt=\"...\">\n <!-- ... through IMAGE_11_URL ... -->\n </div>\n <!-- Optional: title, color swatches based on style -->\n </div>\n\n <!-- PAGE 2: ADMINISTRATIVE SUMMARY -->\n <div class=\"page-2\">\n <!-- [Complete Page 2 structure from above] -->\n </div>\n\n</body>\n</html>\n```\n\n---\n\n## Processing Instructions for Gemini 2.5 Pro\n\n### Step 1: Analyze Input\n```\n1. Read title and description\n2. Extract keywords for style selection\n3. Identify color themes mentioned\n4. Note formality level required\n5. Count and verify 12 image URLs present\n```\n\n### Step 2: Style Selection\n```\n1. Match keywords to style matrix\n2. Consider formality: client presentation vs creative\n3. Assess color palette importance\n4. Select primary style (or blend 2 styles)\n5. Plan Image #12 placement strategy\n```\n\n### Step 3: Generate Page 1\n```\n1. Create style-appropriate container structure\n2. Place Image #12 in hero position (2-3x others)\n3. Arrange remaining 11 images per style\n4. Add minimal text elements (title/colors if style requires)\n5. Verify all 12 <img src=\"\"> tags present\n```\n\n### Step 4: Generate Page 2\n```\n1. Synthesize description into professional overview (2-3 paragraphs)\n2. Infer or extract color palette (4-6 colors with hex codes)\n3. List materials/finishes from description\n4. Identify design features and spatial elements\n5. Create comprehensive, scannable summary\n```\n\n### Step 5: Validation\n```\n\u2713 Starts with <!DOCTYPE html>\n\u2713 12 <img> tags on Page 1, all with src=\"URL\"\n\u2713 Image #12 is 2-3x larger/more prominent\n\u2713 Page 1 and Page 2 completely separated (page-break CSS)\n\u2713 Page 2 includes all 8 required sections\n\u2713 Professional typography and spacing\n\u2713 A4 dimensions (210mm x 297mm per page)\n\u2713 Print-ready quality\n\u2713 No markdown code fences, pure HTML output\n```\n\n---\n\n## Critical Gemini-Specific Optimizations\n\n### 1. Direct Output Format\n```\nNO: ```html [code] ```\nYES: <!DOCTYPE html> [immediate code start]\n```\n\n### 2. Image Array Handling\n```javascript\n// Gemini efficiently processes arrays\nconst images = input.originalUrls; // All 12 URLs\nconst heroImage = images[11]; // Image #12 (index 11)\nconst gridImages = images.slice(0, 11); // Images 1-11 (indices 0-10)\n```\n\n### 3. Color Palette Intelligence\nIf description doesn't specify colors:\n- Infer from title/style (e.g., \"Tropical\" \u2192 greens, blues, coral)\n- Use style-appropriate palettes (e.g., \"Minimalist\" \u2192 neutrals, mono)\n- Generate 4-6 colors with descriptive names and hex codes\n\n### 4. Content Synthesis\nTransform description into Page 2 summary:\n- Expand terse descriptions into 2-3 paragraph overviews\n- Extract spatial elements \u2192 Spatial Program section\n- Identify materials \u2192 Materials & Finishes section\n- Note design approach \u2192 Design Overview section\n\n---\n\n## Example Decision Tree\n\n```\nINPUT: \nTitle: \"Tropical Modern Living Room\"\nDescription: \"Vibrant space with natural materials, bold colors...\"\n\nPROCESSING:\nKeywords: \"tropical\", \"vibrant\", \"natural\", \"bold\"\n\u2192 Style candidates: 1 (Modern Grid), 2 (Material Collage), 9 (Organic Flow)\n\u2192 Color importance: HIGH (mentioned \"vibrant\", \"bold\")\n\u2192 Selection: Style 1 (Modern Sectional Grid) with color palette bar\n\nIMAGE STRATEGY:\n- Image #12 \u2192 Hero section (55% width, left side)\n- Images 1-11 \u2192 3x4 grid (right side, 45% width)\n- Color palette \u2192 Bottom bar with extracted/inferred tropical colors\n\nPAGE 2 CONTENT:\n- Overview: Synthesize tropical modern concept\n- Colors: Teal (#2FB5A3), Coral (#FF6B6B), Sand (#E8D5B7), Forest (#1C5630)\n- Materials: Rattan, teak, linen, natural stone\n- Features: Biophilic design, indoor-outdoor flow\n```\n\n---\n\n## Final Output Checklist\n\nBefore returning HTML, confirm:\n- [ ] Pure HTML output (no markdown, no explanations)\n- [ ] Starts: `<!DOCTYPE html>`\n- [ ] Ends: `</html>`\n- [ ] Page 1: 12 images, Image #12 prominent (2-3x)\n- [ ] Page 2: All 8 sections present and detailed\n- [ ] CSS: Inline, print-ready, A4 sized\n- [ ] Page break: Clean separation between pages\n- [ ] Typography: Professional, hierarchical\n- [ ] Content: Synthesized, comprehensive, client-ready\n- [ ] Style: Appropriate to title/description aesthetic\n\n---\n\n## Execution Command\n\n**Generate the two-page HTML moodboard now:**\n1. Analyze the provided title, description, and 12 image URLs\n2. Select the most appropriate style from the 10 options\n3. Create Page 1 with all 12 images (Image #12 prominently featured)\n4. Create Page 2 with comprehensive administrative summary\n5. Output ONLY the complete HTML code with no additional text\n\n**START OUTPUT WITH: <!DOCTYPE html>**"
},
"promptType": "define"
},
"typeVersion": 3
},
{
"id": "28a3e0cd-47e9-4a31-b842-ed0c67e2d1d1",
"name": "Sticky Note12",
"type": "n8n-nodes-base.stickyNote",
"position": [
416,
128
],
"parameters": {
"color": 4,
"height": 384,
"content": "### HTML to Binary Converter\n\nThis Code node converts the HTML moodboard into a binary-ready format for PDF generation. It takes the AI agent\u2019s HTML, converts it to a UTF-8 buffer, encodes it as base64, and packages it as \u201cindex.html\u201d with correct MIME settings and error handling for Gotenberg compatibility."
},
"typeVersion": 1
},
{
"id": "4b1f5650-a537-49f7-ab72-e7f6565a2e78",
"name": "Sticky Note13",
"type": "n8n-nodes-base.stickyNote",
"position": [
656,
80
],
"parameters": {
"color": 4,
"height": 464,
"content": "**PDF Generator**\n\nThis node converts the HTML moodboard into a print-ready PDF. It sends the binary \u201cindex.html\u201d file to the Gotenberg service, which renders the two-page layout in A4 with proper page breaks and high-resolution images, producing a professional, client-ready PDF for download or delivery."
},
"typeVersion": 1
},
{
"id": "ac4e72d0-70ac-4433-b15a-e4b10025c958",
"name": "Binary Converter",
"type": "n8n-nodes-base.code",
"position": [
496,
384
],
"parameters": {
"jsCode": "// Get HTML content from previous node\nconst htmlContent = $input.item.json.output;\n\nif (!htmlContent) {\n throw new Error('HTML content not found in output field');\n}\n\n// Convert to binary with the EXACT filename Gotenberg expects\nconst binaryData = Buffer.from(htmlContent, 'utf-8');\n\nreturn {\n json: {\n success: true\n },\n binary: {\n data: {\n data: binaryData.toString('base64'),\n mimeType: 'text/html',\n fileName: 'index.html', // MUST be \"index.html\" for Gotenberg\n fileExtension: 'html'\n }\n }\n};"
},
"typeVersion": 2
},
{
"id": "4252f52b-3f71-450f-9406-6ed63ccfafba",
"name": "PDF creator",
"type": "n8n-nodes-base.httpRequest",
"position": [
720,
384
],
"parameters": {
"url": "[YOUR URL]",
"method": "POST",
"options": {
"timeout": 1000000,
"response": {
"response": {
"responseFormat": "file",
"outputPropertyName": "output.pdf"
}
},
"allowUnauthorizedCerts": true
},
"sendBody": true,
"contentType": "multipart-form-data",
"sendHeaders": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "fileInput",
"parameterType": "formBinaryData",
"inputDataFieldName": "=data"
}
]
},
"genericAuthType": "httpBasicAuth",
"headerParameters": {
"parameters": [
{
"name": "Gotenberg-Timeout",
"value": "360s"
}
]
}
},
"credentials": {
"httpBasicAuth": {
"name": "<your credential>"
}
},
"retryOnFail": false,
"typeVersion": 4.3
},
{
"id": "5cade0bf-8f69-4f5c-8129-d08ad9438b75",
"name": "Send PDF",
"type": "n8n-nodes-base.gmail",
"position": [
944,
384
],
"parameters": {
"sendTo": "={{ $('Moodbaord Form').item.json.Email }}",
"message": "={{ $('Moodbaord Form').item.json.Description }}",
"options": {
"attachmentsUi": {
"attachmentsBinary": [
{
"property": "output.pdf"
}
]
}
},
"subject": "=Moddboard: {{ $('Moodbaord Form').item.json['Title '] }}",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "7f415049-d982-4f5d-bda1-cf3f23e1075e",
"name": "Sticky Note14",
"type": "n8n-nodes-base.stickyNote",
"position": [
912,
128
],
"parameters": {
"color": 4,
"height": 432,
"content": "### Email Delivery Node\n\nThis node emails the finalized PDF moodboard to the user. It retrieves the email provided in the original form, attaches the generated PDF, and sends a professional confirmation message, allowing the user to download and review their completed interior design moodboard."
},
"typeVersion": 1
},
{
"id": "04711980-0bef-4e34-b9cb-841569bc0599",
"name": "Sticky Note15",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2064,
-752
],
"parameters": {
"width": 640,
"height": 1008,
"content": "# Two-Page Moodboard Generator\n\nThis AI agent transforms interior design concepts into professional, print-ready HTML moodboards. Users submit design project ideas, descriptions, and 12 design URLs to select an appropriate visual style. The system automatically generates a beautifully formatted two-page moodboard with curated images, detailed administrative summaries, and style preferences, all assembled into a customized HTML ready for client deliverables.\n\n## How it works\n\nThe workflow operates in three distinct phases:\n\n**Input & Conceptualization (Blue Section):** Users submit their design brief through the Creative Moodboard Request Form. The Email Local Part Extractor and Folder Creator establish the project structure, while the Interior Design Moodboard Conceptualization Agent uses AI to generate detailed specifications including image prompts, color palettes, materials, textures, furniture pieces, and mood-setting details in structured JSON format.\n\n**Image Generation (Grey Section):** The Concept Image Splitter breaks down the conceptualization into individual prompts, processed through an Image Loop. For each iteration, the Image Generator (Hugging Face API) creates custom visuals, the Nextcloud Image Uploader stores them, and public shareable URLs are retrieved. The URL Aggregator consolidates all generated images for final assembly.\n\n**Moodboard Assembly & Delivery (Green Section):** The URL Extraction Node consolidates image data, which flows to Classe UILs to merge with the original request. The HTML to Binary Converter transforms the moodboard into print-ready format, sending it to the PDF Generator which creates an A4 document with proper dimensions and page breaks. Finally, the Email Delivery Node sends the completed two-page HTML/PDF moodboard with the attached PDF document.\n\n## Setup steps\n\n1. Configure the Creative Moodboard Request Form with your preferred trigger method and customize form fields\n2. Set up API credentials for the Interior Design Moodboard Conceptualization Agent\n3. Configure image generation service credentials in the Image Generator (Hugging Face API) node\n4. Set up the Nextcloud Image Uploader with your server details and authentication\n5. Add email service credentials to the Email Delivery Node\n6. Test the workflow with a sample request"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "da914c97-2cc5-4870-8356-de232b48ff7e",
"connections": {
"Think2": {
"ai_tool": [
[
{
"node": "Conceptualization Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Send PDF": {
"main": [
[]
]
},
"Clean URLs": {
"main": [
[
{
"node": "Moodboard Generator Agent",
"type": "main",
"index": 0
}
]
]
},
"PDF creator": {
"main": [
[
{
"node": "Send PDF",
"type": "main",
"index": 0
}
]
]
},
"Share a file": {
"main": [
[
{
"node": "set image title and url",
"type": "main",
"index": 0
}
]
]
},
"Upload Image": {
"main": [
[
{
"node": "Share a file",
"type": "main",
"index": 0
}
]
]
},
"Simple Memory": {
"ai_memory": [
[
{
"node": "Conceptualization Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"URL Aggregate": {
"main": [
[
{
"node": "Clean URLs",
"type": "main",
"index": 0
}
]
]
},
"Moodbaord Form": {
"main": [
[
{
"node": "Email extractor",
"type": "main",
"index": 0
}
]
]
},
"Create a folder": {
"main": [
[
{
"node": "Conceptualization Agent",
"type": "main",
"index": 0
}
]
]
},
"Email extractor": {
"main": [
[
{
"node": "Create a folder",
"type": "main",
"index": 0
}
]
]
},
"Image Generator": {
"main": [
[
{
"node": "Upload Image",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[
{
"node": "URL Aggregate",
"type": "main",
"index": 0
}
],
[
{
"node": "Image Generator",
"type": "main",
"index": 0
}
]
]
},
"Binary Converter": {
"main": [
[
{
"node": "PDF creator",
"type": "main",
"index": 0
}
]
]
},
"Concept Splitter": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"OpenRouter Chat Model": {
"ai_languageModel": [
[
{
"node": "Conceptualization Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Conceptualization Agent": {
"main": [
[
{
"node": "Concept Splitter",
"type": "main",
"index": 0
}
]
]
},
"set image title and url": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Chat Model1": {
"ai_languageModel": [
[
{
"node": "Moodboard Generator Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Moodboard Generator Agent": {
"main": [
[
{
"node": "Binary Converter",
"type": "main",
"index": 0
}
]
]
},
"Structured Output Parser2": {
"ai_outputParser": [
[
{
"node": "Conceptualization Agent",
"type": "ai_outputParser",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
gmailOAuth2googlePalmApihttpBasicAuthhttpHeaderAuthnextCloudApiopenRouterApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This comprehensive n8n workflow automates the complete process of generating professional interior design moodboards from concept to client delivery. Users submit a design brief through a form, and the system automatically generates 12 AI-powered images, compiles them into a…
Source: https://n8n.io/workflows/10880/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
The AI-Powered Shopify SEO Content Automation is an enterprise-grade workflow that transforms product content creation for e-commerce stores. This sophisticated multi-agent system integrates GPT-4o, C
How it Works
Who is this for? Agencies, consultants, and service providers who conduct discovery calls and need to quickly turn conversations into professional proposals.
This automated workflow template transforms a single product image into a complete professional advertisement video with dynamic motion and custom soundtrack. Perfect for e-commerce businesses, market
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.