{
  "id": 10880,
  "name": "Generate Interior Moodboards with Claude/Gemini Agents, Hugging Face Image Generation, and PDF Export",
  "description": "## \ud83c\udfa8 Template Overview\n\nThis 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 beautifully formatted two-page PDF moodboard, and emails the final deliverable.\n\n![Screenshot 20251120 091956.png](fileId:3404)\n\n**Key Features:**\n- Form-based design brief submission\n- AI-powered image prompt generation (12 detailed prompts per project)\n- Automated image generation via Hugging Face API\n- Nextcloud cloud storage with public URL sharing\n- Professional two-page HTML/PDF moodboard creation\n- Automated email delivery with PDF attachment\n\n**Technologies Used:** Claude Sonnet 4 (OpenRouter), Google Gemini 2.5 Pro, Hugging Face FLUX.1-schnell, Nextcloud, Gotenberg PDF Service, Gmail\n\n---\n\n## \u2699\ufe0f Self-Hosted Requirements\n\nThis template requires the following self-hosted or third-party services:\n\n- **Nextcloud Instance** - For cloud file storage and public URL generation\n- **Gotenberg PDF Service** - For HTML to PDF conversion (can be self-hosted via Docker)\n- **OpenRouter API Access** - For Claude Sonnet 4 AI agent\n- **Google Gemini API Access** - For secondary AI processing\n- **Hugging Face API Access** - For FLUX.1-schnell image generation\n- **Gmail Account** - For email delivery (or any SMTP service)\n\n---\n\n## \ud83d\udccb Setup Instructions\n\n### Step 1: Configure API Credentials\n\n1. **OpenRouter (Claude Sonnet 4)**\n   - Sign up at [openrouter.ai](https://openrouter.ai)\n   - Generate an API key\n   - Add credentials to the \"OpenRouter Chat Model\" node\n\n2. **Google Gemini API**\n   - Visit [Google AI Studio](https://makersuite.google.com/app/apikey)\n   - Create an API key\n   - Add credentials to the \"Google Gemini Chat Model1\" node\n\n3. **Hugging Face API**\n   - Register at [huggingface.co](https://huggingface.co)\n   - Generate an access token from Settings \u2192 Access Tokens\n   - Add credentials to the \"Image Generator\" node using HTTP Header Auth\n   - Header name: `Authorization`, Value: `Bearer YOUR_TOKEN`\n\n4. **Nextcloud**\n   - Set up a Nextcloud instance or use a hosted provider\n   - Generate an app password from Settings \u2192 Security\n   - Configure credentials in all Nextcloud nodes:\n     - \"Create a folder\"\n     - \"Upload Image\"\n     - \"Share a file\"\n\n5. **Gotenberg PDF Service**\n   - Self-host using Docker: `docker run --rm -p 3000:3000 gotenberg/gotenberg:8`\n   - Or use a hosted instance\n   - Update the URL in the \"PDF creator\" node\n   - Configure HTTP Basic Auth credentials if required\n\n6. **Gmail**\n   - Enable 2-Factor Authentication on your Google account\n   - Generate an App Password from Google Account settings\n   - Add OAuth2 credentials to the \"Send PDF\" node\n\n### Step 2: Customize Workflow Settings\n\n1. **Email Extractor Node**\n   - Review the `stripPlus` variable (default: `true`)\n   - This removes \"+tag\" portions from email addresses for folder naming\n\n2. **Nextcloud Folder Structure**\n   - Default path: `/moodboard/{username}/`\n   - Modify in \"Create a folder\" node if needed\n\n3. **Image Generator Settings**\n   - Model: FLUX.1-schnell (fast generation, good quality)\n   - Adjust model in \"Image Generator\" node if needed\n   - Alternative models: FLUX.1-dev, Stable Diffusion XL\n\n4. **PDF Generation Settings**\n   - Default timeout: 360 seconds\n   - Page size: A4 (210mm \u00d7 297mm)\n   - Adjust in \"PDF creator\" node headers if needed\n\n### Step 3: Test the Workflow\n\n1. **Activate the Form**\n   - Open the \"Moodboard Form\" node\n   - Copy the webhook URL\n   - Access the form in your browser\n\n2. **Submit a Test Request**\n   - Fill in the form fields:\n     - **Title**: Short, descriptive name (e.g., \"Modern Minimalist Bedroom\")\n     - **Description**: Detailed design brief with colors, materials, mood, lighting\n     - **Email**: Your test email address\n   - Submit and monitor workflow execution\n\n3. **Verify Each Stage**\n   - Check Nextcloud folder creation\n   - Monitor image generation progress (12 images)\n   - Review HTML moodboard generation\n   - Confirm PDF creation\n   - Check email delivery\n\n### Step 4: Configure Form Embedding (Optional)\n\nEmbed the form on your website:\n\n```html\n&lt;iframe \n  src=\"YOUR_N8N_FORM_WEBHOOK_URL\" \n  width=\"100%\" \n  height=\"800\" \n  frameborder=\"0\"&gt;\n&lt;/iframe&gt;\n```\n\n---\n\n## \ud83d\udd04 Workflow Structure\n\n### **1. Form Input & Data Extraction**\n- **Moodboard Form** - Collects project title, description, and user email\n- **Email Extractor** - Extracts username from email for folder organization\n\n### **2. Storage Setup**\n- **Create a Folder** - Creates personalized Nextcloud directory using email username\n\n### **3. AI Concept Generation**\n- **Conceptualization Agent** (Claude Sonnet 4) - Analyzes design brief and generates 12 detailed image prompts (300-500 words each)\n  - Images 1-11: Individual design elements (furniture, materials, details, styling)\n  - Image 12: Comprehensive 3D rendered view integrating all elements\n\n### **4. Image Processing Loop**\n- **Concept Splitter** - Separates 12 prompts into individual items\n- **Loop Over Items** - Processes each prompt sequentially:\n  - **Image Generator** - Sends prompt to Hugging Face FLUX.1-schnell API\n  - **Upload Image** - Stores generated image in Nextcloud folder\n  - **Share a File** - Creates public shareable URL\n  - **Set Image Title and URL** - Formats data for aggregation\n\n### **5. URL Collection**\n- **URL Aggregate** - Combines all 12 public image URLs\n- **Clean URLs** - Extracts and formats URLs into a structured list\n\n### **6. Moodboard Compilation**\n- **Moodboard Generator Agent** (Google Gemini 2.5 Pro) - Creates professional two-page HTML document:\n  - **Page 1**: Visual moodboard with all 12 images (Image #12 prominently featured 2-3x larger)\n  - **Page 2**: Administrative summary with design overview, color palette, materials, and project details\n\n### **7. PDF Generation & Delivery**\n- **Binary Converter** - Transforms HTML to base64-encoded binary format\n- **PDF Creator** - Converts HTML to print-ready PDF via Gotenberg service\n- **Send PDF** - Emails final moodboard PDF to user\n\n---\n\n## \ud83c\udfaf Node Descriptions\n\n### **Moodboard Form**\nCollects moodboard generation requests for any design topic. Users input a title, detailed description (colors, materials, patterns, textures, lighting), and email address for delivery.\n\n### **Email Extractor**\nExtracts the username portion from email addresses, optionally stripping \"+tags\" for clean folder naming and user identification.\n\n### **Create a Folder**\nCreates a dedicated Nextcloud folder using the extracted email username, organizing moodboard outputs by user.\n\n### **Conceptualization Agent**\nAI agent that analyzes design briefs to generate 12 detailed image prompts (300-500 words each). Performs conceptual analysis of styles, colors, materials, and spatial requirements, outputting structured JSON.\n\n### **Concept Splitter**\nSplits the 12 generated image prompts into individual items for parallel processing through the image generation pipeline.\n\n### **Loop Over Items**\nProcesses each prompt sequentially, generating images, uploading to Nextcloud, and creating public URLs.\n\n### **Image Generator**\nSends detailed prompts to Hugging Face FLUX.1-schnell API for AI-powered image generation, transforming written design concepts into high-quality visuals.\n\n### **Upload Image**\nUploads each generated moodboard image to the user's Nextcloud folder with appropriate naming conventions.\n\n### **Share a File**\nCreates publicly shareable Nextcloud links for each uploaded image, enabling external viewing without authentication.\n\n### **Set Image Title and URL**\nFormats image metadata (title and URL) for downstream aggregation.\n\n### **URL Aggregate**\nCombines all 12 image URLs into a single consolidated output for moodboard compilation.\n\n### **Clean URLs**\nExtracts and formats URLs from the aggregated data into a clean, structured list with count.\n\n### **Moodboard Generator Agent**\nTransforms design concepts into professional two-page HTML moodboards. Analyzes project details and 12 image URLs, selecting appropriate visual styles. Creates artistic Page 1 with Image #12 as hero element, and comprehensive Page 2 with design documentation.\n\n### **Binary Converter**\nPrepares HTML for PDF conversion by transforming it into binary format with proper encoding and filename (\"index.html\") for Gotenberg compatibility.\n\n### **PDF Creator**\nConverts HTML moodboard into print-ready PDF with proper A4 dimensions, page breaks, and high-quality image resolution.\n\n### **Send PDF**\nEmails the finalized PDF moodboard to the user's submitted email address with project details and PDF attachment.\n\n---\n\n## \ud83c\udfa8 Customization Options\n\n### Design Styles\nThe Moodboard Generator Agent automatically selects from 10 layout styles:\n1. Modern Sectional Grid\n2. Material Board Collage\n3. Editorial Magazine\n4. Clean Minimalist\n5. Split-Screen Dramatic\n6. Asymmetric Feature\n7. Centered Showcase\n8. Modular Block System\n9. Organic Flow\n10. Layered Depth\n\n### Image Generation Models\nReplace FLUX.1-schnell with alternatives in the \"Image Generator\" node:\n- `black-forest-labs/FLUX.1-dev` - Higher quality, slower\n- `stabilityai/stable-diffusion-xl-base-1.0` - Classic SD XL\n\n### Email Templates\nCustomize the email message in the \"Send PDF\" node to include:\n- Brand messaging\n- Next steps\n- Support contact information\n- Pricing information\n\n---\n\n## \ud83d\udc1b Troubleshooting\n\n### Images Not Generating\n- Verify Hugging Face API token is valid\n- Check API rate limits and quotas\n- Increase timeout in \"Image Generator\" node (default: unlimited)\n\n### PDF Generation Fails\n- Ensure Gotenberg service is accessible\n- Verify HTML output contains all 12 image URLs\n- Check timeout settings (default: 360s)\n- Review Gotenberg logs for specific errors\n\n### Nextcloud Upload Errors\n- Confirm folder creation succeeded\n- Verify Nextcloud credentials and permissions\n- Check available storage space\n- Ensure WebDAV is enabled\n\n### Email Not Received\n- Verify Gmail OAuth2 credentials\n- Check spam/junk folders\n- Confirm email address is valid\n- Review Gmail API quotas\n\n---\n\n## \ud83d\udcca Performance Notes\n\n- **Average execution time**: 5-8 minutes (depends on image generation)\n- **Image generation**: ~20-30 seconds per image (12 images = 4-6 minutes)\n- **PDF generation**: ~30-60 seconds\n- **Total data processed**: ~15-25 MB per workflow execution\n\n---\n\n## \ud83d\udd10 Security Considerations\n\n- Store all API keys in n8n credentials (never hardcode)\n- Use environment variables for sensitive configuration\n- Implement rate limiting on the form webhook\n- Consider adding CAPTCHA to prevent abuse\n- Regularly rotate API keys and passwords\n- Use HTTPS for all external communications\n\n---\n\n## \ud83d\udcdd License & Attribution\n\nThis template is provided as-is for the n8n community. Feel free to modify and adapt to your needs.\n\n**AI Models Used:**\n- Claude Sonnet 4 (Anthropic via OpenRouter)\n- Google Gemini 2.5 Pro (Google)\n- FLUX.1-schnell (Black Forest Labs via Hugging Face)\n\n---\n\n## \ud83e\udd1d Support & Contributions\n\nFor questions or improvements, please reach out through the n8n community forum or submit issues/PRs to enhance this template.\n\n**Created by:** Jameson Kanakulya  \n**Template Version:** 1.0  \n**Last Updated:** November 2025",
  "categories": [
    {
      "id": 31,
      "name": "Content Creation"
    },
    {
      "id": 51,
      "name": "Multimodal AI"
    }
  ],
  "totalViews": 254,
  "createdAt": "2025-11-16T11:32:17.910Z",
  "workflow": {
    "id": "tgYe7SMum0MBmgwx",
    "meta": {
      "instanceId": "4004e259d7c32fb84e7e989ad65605c716ae645dcc01b59c6472fbe27f19fc08",
      "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": {
            "id": "credential-id",
            "name": "googlePalmApi 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": {
            "id": "credential-id",
            "name": "nextCloudApi 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": {
            "id": "credential-id",
            "name": "nextCloudApi 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": {
            "id": "credential-id",
            "name": "openRouterApi 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
        ],
        "webhookId": "9577a9c5-adc4-48d8-a2f6-56123ed73772",
        "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": {
            "id": "credential-id",
            "name": "httpHeaderAuth 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": {
            "id": "credential-id",
            "name": "nextCloudApi 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": {
            "id": "credential-id",
            "name": "httpBasicAuth Credential"
          }
        },
        "retryOnFail": false,
        "typeVersion": 4.3
      },
      {
        "id": "5cade0bf-8f69-4f5c-8129-d08ad9438b75",
        "name": "Send PDF",
        "type": "n8n-nodes-base.gmail",
        "position": [
          944,
          384
        ],
        "webhookId": "abc6bf47-5345-4a29-a7b6-9d3f9dea8b96",
        "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": {
            "id": "credential-id",
            "name": "gmailOAuth2 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,
    "pinData": {
      "Moodbaord Form": [
        {
          "json": {
            "Email": "jamesonkanakulya@gmail.com",
            "Title ": "Retro Revival Chic",
            "formMode": "test",
            "Description": "Generate a moodboard for a 1970s-inspired retro-chic living space reimagined with a modern twist. Use vibrant colors like mustard yellow, burnt orange, olive green, and teal, paired with geometric patterns and velvet upholstery. Include curved furniture, shag rugs, mid-century lighting fixtures, and walnut wood finishes. Accent with vinyl records, vintage posters, and chrome or brass decor elements. The lighting should feel warm and nostalgic, evoking a sense of playful sophistication and vintage comfort",
            "submittedAt": "2025-11-06T12:30:06.822+04:00"
          }
        }
      ]
    },
    "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
            }
          ]
        ]
      }
    }
  },
  "workflowInfo": {
    "nodeCount": 37,
    "nodeTypes": {
      "n8n-nodes-base.set": {
        "count": 1
      },
      "n8n-nodes-base.code": {
        "count": 3
      },
      "n8n-nodes-base.gmail": {
        "count": 1
      },
      "n8n-nodes-base.splitOut": {
        "count": 1
      },
      "n8n-nodes-base.aggregate": {
        "count": 1
      },
      "n8n-nodes-base.nextCloud": {
        "count": 3
      },
      "n8n-nodes-base.stickyNote": {
        "count": 16
      },
      "n8n-nodes-base.formTrigger": {
        "count": 1
      },
      "n8n-nodes-base.httpRequest": {
        "count": 2
      },
      "n8n-nodes-base.splitInBatches": {
        "count": 1
      },
      "@n8n/n8n-nodes-langchain.agent": {
        "count": 2
      },
      "@n8n/n8n-nodes-langchain.toolThink": {
        "count": 1
      },
      "@n8n/n8n-nodes-langchain.lmChatOpenRouter": {
        "count": 1
      },
      "@n8n/n8n-nodes-langchain.lmChatGoogleGemini": {
        "count": 1
      },
      "@n8n/n8n-nodes-langchain.memoryBufferWindow": {
        "count": 1
      },
      "@n8n/n8n-nodes-langchain.outputParserStructured": {
        "count": 1
      }
    }
  },
  "nodes": [
    "Google Gemini Chat Model1",
    "Structured Output Parser2",
    "Think2",
    "Loop Over Items",
    "Create a folder",
    "Share a file",
    "OpenRouter Chat Model",
    "Simple Memory",
    "Sticky Note",
    "Moodbaord Form",
    "Sticky Note1",
    "Email extractor",
    "Sticky Note2",
    "Conceptualization Agent",
    "Sticky Note3",
    "Sticky Note4",
    "Sticky Note5",
    "Sticky Note6",
    "Concept  Splitter",
    "Image Generator",
    "Upload Image",
    "Sticky Note7",
    "Sticky Note8",
    "set image title and url",
    "URL Aggregate",
    "Sticky Note9",
    "Clean URLs",
    "Sticky Note10",
    "Sticky Note11",
    "Moodboard Generator Agent",
    "Sticky Note12",
    "Sticky Note13",
    "Binary Converter",
    "PDF creator",
    "Send PDF",
    "Sticky Note14",
    "Sticky Note15"
  ],
  "nodeTypes": [
    "@n8n/n8n-nodes-langchain.agent",
    "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
    "n8n-nodes-base.splitOut",
    "n8n-nodes-base.httpRequest",
    "n8n-nodes-base.splitInBatches",
    "n8n-nodes-base.code",
    "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
    "n8n-nodes-base.gmail",
    "n8n-nodes-base.aggregate",
    "n8n-nodes-base.stickyNote",
    "n8n-nodes-base.set",
    "n8n-nodes-base.formTrigger",
    "@n8n/n8n-nodes-langchain.toolThink",
    "@n8n/n8n-nodes-langchain.outputParserStructured",
    "@n8n/n8n-nodes-langchain.memoryBufferWindow",
    "n8n-nodes-base.nextCloud"
  ]
}