This workflow corresponds to n8n.io template #5909 — we link there as the canonical source.
This workflow follows the Chainllm → Google Sheets 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": "APuS8Jz54ZljwIJ7",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Hindu Festival Post on X",
"tags": [],
"nodes": [
{
"id": "72ba643f-c65e-419f-9617-ce3123727b81",
"name": "Get Today's Date",
"type": "n8n-nodes-base.code",
"position": [
-760,
600
],
"parameters": {
"jsCode": "const today = new Date();\nconst day = String(today.getDate()).padStart(2, '0');\nconst month = String(today.getMonth() + 1).padStart(2, '0');\nconst year = today.getFullYear();\n\nconst formattedDate = `${day}/${month}/${year}`;\n\nreturn {\n date: formattedDate,\n};"
},
"typeVersion": 2
},
{
"id": "5e5aa3f7-1485-4e75-9875-6589be7263b5",
"name": "Fetch Data of Matched Date",
"type": "n8n-nodes-base.googleSheets",
"position": [
-460,
600
],
"parameters": {
"options": {},
"filtersUI": {
"values": [
{
"lookupValue": "={{ $json.date }}",
"lookupColumn": "Date"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1zVvFDvCRSDbeKVTV4vLj3txSrCptaVFlVkulve7gi5s/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1zVvFDvCRSDbeKVTV4vLj3txSrCptaVFlVkulve7gi5s",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1zVvFDvCRSDbeKVTV4vLj3txSrCptaVFlVkulve7gi5s/edit?usp=drivesdk",
"cachedResultName": "n8n-test"
},
"combineFilters": "OR"
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "c80da083-075a-4829-8d97-c8ef94f0414e",
"name": "When clicking \u2018Execute workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-820,
-180
],
"parameters": {},
"typeVersion": 1
},
{
"id": "c1dede48-8d86-42ff-966b-40cd0dcb345d",
"name": "Generate Structured Data",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
-220,
-180
],
"parameters": {
"text": "=You are an expert Hindu festival researcher and data extractor. Your primary goal is to gather detailed information for each Hindu festival in 2025 based on the provided initial data.\nInput Data:\nBelow is the content of the 'data' field, which contains a list of Hindu festivals for 2025 in a Markdown table format.\n---\n{{ $json.data }}\n---\nYour Task:\n1. Initial Extraction: First, meticulously parse the Markdown table titled \"List of Religious Holidays of Hindu in 2025\" from the Input Data. For each row, extract the English Name of the Festival (from the 'HOLIDAY' column, including all names if separated by '/') and the Date of the Festival (from the 'DATE' column, e.g., 'Jan 15, 2025').\n2. Date Formatting: Convert the extracted date to DD/MM/YYYY format. For example, 'Jan 15, 2025' should become '15/01/2025'.\n3. Information Enrichment : For each festival identified in Step 1,find the following additional details:\n Hindi Name of the Festival: Search specifically for the Hindi name (e.g., \"Makar Sankranti Hindi name\"). Prioritize widely accepted Hindi transliterations.\n **Short Description of the Festival: Find a concise, well-summarized English description (2-4 sentences is ideal) of the festival's significance, rituals, and celebration.\n *Hindi Description of the Festival/or translation of english to hindi:** Find a concise, well-summarized Hindi description (2-4 sentences is ideal) of the festival's significance, rituals, and celebration or just translate English description to Hindi.",
"batching": {},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.7
},
{
"id": "32801a33-0b01-4efd-a7bc-32e75036c8ae",
"name": "Structured Posts",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
60,
840
],
"parameters": {
"jsonSchemaExample": "[\n {\n \"text\": \"...\",\n \"hashtags\": \"#.. #.. #..\",\n \"call_to_action\": \"...\"\n },\n {\n \"text\": \"...\",\n \"hashtags\": \"#.. #.. #..\",\n \"call_to_action\": \"...\"\n }\n]"
},
"typeVersion": 1.3
},
{
"id": "a3882aaa-6df4-44ba-a151-922af524ebd7",
"name": "Generate Posts",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
-160,
600
],
"parameters": {
"text": "=You are a social media content creator specializing in cultural and festival updates for X (formerly Twitter). Your goal is to create engaging posts that resonate with a diverse audience by blending English with key Hindi terms.\n\n**Input Festival Data:**\n- **Festival Name:** `{{ $json[\"Name of the Festival\"] }}`\n- **Date:** `{{ $json[\"Date\"] }}`\n- **English Description:** `{{ $json[\"English Description \"] }}`\n- **Hindi Description:** `{{ $json[\"Hindi Description\"] }}`\n\n**Your Task:**\n\nGenerate exactly 3 distinct social media post options for X (Twitter) for the `{{ $json[\"Name of the Festival\"] }}` festival happening on `{{ $json[\"Date\"] }}`.\n\n**Guidelines for X (Twitter) Posts:**\n1. **Conciseness:** Keep posts brief and impactful, suitable for X's character limits.\n2. **Language Blend:** The primary language of the post should be English, but **strategically incorporate 1-3 relevant Hindi words or short phrases** (e.g., festival names, key ritual terms, or greetings from the Hindi Description) to enhance cultural connection and reach.\n3. **Engagement:** Encourage likes, retweets, or community interaction.\n4. **Hashtags:** Include 2-4 relevant and trending hashtags (mix of broad and specific, including some in Hindi where appropriate).\n5. **Emojis:** Incorporate 1-3 relevant emojis to enhance visual appeal.\n6. **Call to Action (Optional):** Suggest a simple call to action (e.g., \"Retweet if...\", \"Learn more...\").\n7. **Key Info:** Ensure the festival name and date are clearly visible.\n8. **LIMIT:** The Character limit is 280 characters so text+hashtags+call_to_action should be less than 280\n",
"batching": {},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.7
},
{
"id": "8d7215ac-e355-447d-9cfe-a649f8226f46",
"name": "Select Best Post",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
280,
600
],
"parameters": {
"text": "=You are a highly discerning social media manager tasked with selecting the most effective X (formerly Twitter) post from a list of generated options. Your objective is to choose **only one** post that is best suited for publication.\n\n**Input Data:**\nBelow is a JSON array containing multiple social media post options for X.\n\n---\n1st Post:\n{{ $json.output[0].text }}\n\n{{ $json.output[0].call_to_action }}\n\n{{ $json.output[0].hashtags }}\n\n2nd Post:\n{{ $json.output[1].text }}\n\n{{ $json.output[1].call_to_action }}\n\n{{ $json.output[1].hashtags }}\n\n3rd Post:\n{{ $json.output[2].text }}\n\n{{ $json.output[2].call_to_action }}\n\n{{ $json.output[2].hashtags }}\n---\n\n**Your Task:**\n\nCarefully review each post option and select the single best one based on the following criteria:\n\n1. **Overall Impact & Engagement:** Which post is most likely to capture immediate attention and drive interactions (likes, retweets, replies)?\n2. **Conciseness:** While containing Hindi words, the post should still be Twitter-friendly and concise within typical character limits.\n3. **Clarity & Readability:** Is the message clear and easy to understand for a broad audience?\n4. **Effective Blend of English and Hindi:** Does it integrate Hindi words naturally and effectively to enhance cultural appeal without hindering understanding?\n5. **Hashtag & Emoji Relevance:** Are the hashtags and emojis well-chosen and supportive of the message?\n6. **Call to Action (if present):** Is the call to action clear and compelling?\n",
"batching": {},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.7
},
{
"id": "458e7c34-b3fb-47b4-95b3-2a02504a1196",
"name": "Generator Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
-200,
840
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.5-flash"
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "1aa2a4b6-c5f8-4554-bc7c-8e21a357afe2",
"name": "Selector Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
240,
840
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini",
"cachedResultName": "gpt-4o-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "e0fbf542-5a15-4be9-94aa-2d5e43cbc642",
"name": "Structured Output Parser1",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
520,
840
],
"parameters": {
"jsonSchemaExample": " {\n \"text\": \"...\",\n \"hashtags\": \"#.. #.. #..\",\n \"call_to_action\": \"...\"\n }"
},
"typeVersion": 1.3
},
{
"id": "c0df5bf5-8db2-4b36-b459-aa1e7924eafa",
"name": "Everyday Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-1040,
600
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 8
}
]
}
},
"typeVersion": 1.2
},
{
"id": "6aa2c2d5-8c2c-44d1-b7b1-f05011014262",
"name": "Generate Data",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
-280,
60
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.5-flash"
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "e392fca2-13ab-4f1a-96a8-8719f9bdbfd9",
"name": "Schema for Data",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
0,
60
],
"parameters": {
"schemaType": "manual",
"inputSchema": "{\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"Name of the Festival\": {\n \"type\": \"string\",\n \"description\": \"The common English name(s) of the Hindu festival.\"\n },\n \"Date\": {\n \"type\": \"string\",\n \"pattern\": \"^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[0-2])/\\\\d{4}$\",\n \"description\": \"The date of the festival in DD/MM/YYYY format.\"\n },\n \"Short Description of the Festival\": {\n \"type\": \"string\",\n \"description\": \"A concise English description of the festival's significance and celebration.\"\n },\n \"Hindi Translation of the Description\": {\n \"type\": \"string\",\n \"description\": \"A concise Hindi translation of the festival's description.\"\n }\n },\n \"required\": [\n \"Name of the Festival\",\n \"Date\",\n \"Short Description of the Festival\",\n \"Hindi Translation of the Description\"\n ]\n },\n \"description\": \"A list of Hindu festivals with their names, dates, and short descriptions in both English and Hindi.\"\n}"
},
"typeVersion": 1.3
},
{
"id": "0743bd85-ad04-4c44-a6a0-69aad433fdd7",
"name": "Transform to add all Data at once",
"type": "n8n-nodes-base.code",
"position": [
200,
-180
],
"parameters": {
"jsCode": "return $json.output.map(festival => ({ json: festival }));"
},
"typeVersion": 2
},
{
"id": "d79d0959-22b2-4f02-b8ec-b38bc637aa94",
"name": "Add all Rows at once",
"type": "n8n-nodes-base.googleSheets",
"position": [
540,
-180
],
"parameters": {
"columns": {
"value": {
"Date": "={{ $json.Date }}",
"Hindi Description": "={{ $json['Hindi Translation of the Description'] }}",
"English Description ": "={{ $json['Short Description of the Festival'] }}",
"Name of the Festival": "={{ $json['Name of the Festival'] }}"
},
"schema": [
{
"id": "Name of the Festival",
"type": "string",
"display": true,
"required": false,
"displayName": "Name of the Festival",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date",
"type": "string",
"display": true,
"required": false,
"displayName": "Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "English Description ",
"type": "string",
"display": true,
"required": false,
"displayName": "English Description ",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Hindi Description",
"type": "string",
"display": true,
"required": false,
"displayName": "Hindi Description",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1zVvFDvCRSDbeKVTV4vLj3txSrCptaVFlVkulve7gi5s/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1zVvFDvCRSDbeKVTV4vLj3txSrCptaVFlVkulve7gi5s",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1zVvFDvCRSDbeKVTV4vLj3txSrCptaVFlVkulve7gi5s/edit?usp=drivesdk",
"cachedResultName": "n8n-test"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "cedfbf0a-9c3c-4323-b99e-50971f8795f8",
"name": "Post to X",
"type": "n8n-nodes-base.twitter",
"position": [
760,
600
],
"parameters": {
"text": "={{ $json.output.text }}\n\n{{ $json.output.call_to_action }}\n\n{{ $json.output.hashtags }}",
"additionalFields": {}
},
"credentials": {
"twitterOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "21d2fcc5-75ab-4333-a14d-151dd8d8f20e",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1060,
-280
],
"parameters": {
"width": 400,
"height": 260,
"content": "## \ud83d\udfe5 Execute workflow\nTrigger node to manually run the workflow on demand for quick testing or use."
},
"typeVersion": 1
},
{
"id": "6690b393-e9a5-4090-a0a9-a9dbd724fc92",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-580,
-340
],
"parameters": {
"width": 260,
"height": 320,
"content": "## \ud83d\udfea Get Festival Data\n- Makes a GET request to fetch festival data from a remote API. This acts as the external data source.\n\n- **[URL](https://r.jina.ai/https://www.calendarlabs.com/2025-hindu-calendar)**"
},
"typeVersion": 1
},
{
"id": "f247e949-96d2-4d9f-b8e7-0b2d5e97500d",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-240,
-380
],
"parameters": {
"width": 300,
"height": 360,
"content": "## \ud83d\udd17 Generate Structured Data \nUses an AI model (OpenAI or Gemini) to structure raw festival data into a well-defined format for consistent downstream processing.\n\n"
},
"typeVersion": 1
},
{
"id": "7082b953-fdda-4d7b-b857-e52ef4c45e6d",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
120,
-340
],
"parameters": {
"height": 320,
"content": "## \ud83d\udfe7 Transform Data\nJavaScript/Code node that reshapes structured output into the format required for Google Sheets (i.e., an array of rows)."
},
"typeVersion": 1
},
{
"id": "d883cd80-fc5d-4ae8-be4a-3b82e0efe296",
"name": "Get Festival Data",
"type": "n8n-nodes-base.httpRequest",
"position": [
-500,
-180
],
"parameters": {
"url": "https://r.jina.ai/https://www.calendarlabs.com/2025-hindu-calendar",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpBearerAuth"
},
"credentials": {
"httpBearerAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "b0b3cd42-d5f3-42fb-bcdd-551098a699a3",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
460,
-340
],
"parameters": {
"width": 260,
"height": 320,
"content": "## \ud83d\udfe9 Feel Google Sheet\nAppends all transformed rows to a Google Sheet in one go. Efficient batch upload to keep data organized and update logs or reports."
},
"typeVersion": 1
},
{
"id": "95ccbbe9-84a2-47f1-b6f7-167c65786447",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1160,
-460
],
"parameters": {
"color": 5,
"width": 2020,
"height": 680,
"content": ""
},
"typeVersion": 1
},
{
"id": "020314f2-419f-4101-bc03-57a21feaa640",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1260,
480
],
"parameters": {
"width": 360,
"height": 260,
"content": "## \ud83d\udd01 Everyday Trigger\nSchedules the workflow to run automatically once every day to generate and publish a new post based on the date."
},
"typeVersion": 1
},
{
"id": "54f1ff32-4048-4110-9115-731fa5d78ce0",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-840,
480
],
"parameters": {
"width": 260,
"height": 260,
"content": "## \ud83d\udcc6 Get Today's Date\nJavaScript code to fetch today's date."
},
"typeVersion": 1
},
{
"id": "ab656067-7aed-49dd-8d88-588d682fb894",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
-540,
460
],
"parameters": {
"width": 260,
"height": 280,
"content": "## \ud83d\udfe9 Match Date\nReads a Google Sheet and filters the row(s) matching today\u2019s date. Acts as the source of contextual data for the post."
},
"typeVersion": 1
},
{
"id": "c6552300-bb7e-46ee-b310-56ff0ac21ccb",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
-220,
460
],
"parameters": {
"width": 380,
"height": 280,
"content": "## \ud83e\udde0 Generate Posts\nUses an AI model (e.g., Gemini or OpenAI) to generate multiple draft social media posts based on the matched row\u2019s content."
},
"typeVersion": 1
},
{
"id": "a974a47e-c95a-46da-a869-dd81f68effbf",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
200,
460
],
"parameters": {
"width": 420,
"height": 280,
"content": "## \ud83e\udde0 Select Best Post\nUses a second AI model to evaluate and select the best-performing or most relevant post among the generated options.\n\n"
},
"typeVersion": 1
},
{
"id": "c115adcd-6424-4498-9fe3-8ad199caf376",
"name": "Sticky Note11",
"type": "n8n-nodes-base.stickyNote",
"position": [
660,
460
],
"parameters": {
"width": 300,
"height": 280,
"content": "## \ud83d\udc26 Post to X (Twitter)\nShares the chosen post directly to an X (formerly Twitter) account using the n8n X node."
},
"typeVersion": 1
},
{
"id": "2de18aee-64f8-4a63-a5df-af6579b7e4c0",
"name": "Sticky Note12",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1400,
380
],
"parameters": {
"color": 6,
"width": 2640,
"height": 640,
"content": ""
},
"typeVersion": 1
}
],
"active": true,
"settings": {
"executionOrder": "v1"
},
"versionId": "09b762fa-8df9-474e-8b41-75e27ba4805f",
"connections": {
"Generate Data": {
"ai_languageModel": [
[
{
"node": "Generate Structured Data",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Generate Posts": {
"main": [
[
{
"node": "Select Best Post",
"type": "main",
"index": 0
}
]
]
},
"Selector Model": {
"ai_languageModel": [
[
{
"node": "Select Best Post",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Generator Model": {
"ai_languageModel": [
[
{
"node": "Generate Posts",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Schema for Data": {
"ai_outputParser": [
[
{
"node": "Generate Structured Data",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Everyday Trigger": {
"main": [
[
{
"node": "Get Today's Date",
"type": "main",
"index": 0
}
]
]
},
"Get Today's Date": {
"main": [
[
{
"node": "Fetch Data of Matched Date",
"type": "main",
"index": 0
}
]
]
},
"Select Best Post": {
"main": [
[
{
"node": "Post to X",
"type": "main",
"index": 0
}
]
]
},
"Structured Posts": {
"ai_outputParser": [
[
{
"node": "Generate Posts",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Get Festival Data": {
"main": [
[
{
"node": "Generate Structured Data",
"type": "main",
"index": 0
}
]
]
},
"Generate Structured Data": {
"main": [
[
{
"node": "Transform to add all Data at once",
"type": "main",
"index": 0
}
]
]
},
"Structured Output Parser1": {
"ai_outputParser": [
[
{
"node": "Select Best Post",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Fetch Data of Matched Date": {
"main": [
[
{
"node": "Generate Posts",
"type": "main",
"index": 0
}
]
]
},
"Transform to add all Data at once": {
"main": [
[
{
"node": "Add all Rows at once",
"type": "main",
"index": 0
}
]
]
},
"When clicking \u2018Execute workflow\u2019": {
"main": [
[
{
"node": "Get Festival Data",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
googlePalmApigoogleSheetsOAuth2ApihttpBearerAuthopenAiApitwitterOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow automates the entire process of creating and publishing culturally rich social media content about Hindu festivals. It starts by building a comprehensive festival calendar for the year in a Google Sheet, then runs daily to post engaging, bilingual updates on X…
Source: https://n8n.io/workflows/5909/ — 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.
Transform a single quote into a fully-rendered cinematic short video — with voice-over, visuals, and music — then publish it directly to TikTok, Instagram Reels, and YouTube Shorts. This isn’t just au
Ultimate Blogblizt is a powerhouse workflow that solves the tedious task of crafting and publishing SEO-optimized tech blog posts. It integrates AI models (OpenAI, Google Gemini), WordPress, and multi
This template attempts to replicate OpenAI's DeepResearch feature which, at time of writing, is only available to their pro subscribers.
My workflow 53. Uses formTrigger, httpRequest, lmChatOpenAi, form. Event-driven trigger; 74 nodes.
Episode 23: UGC with nanobanana. Uses lmChatOpenAi, lmChatOllama, lmChatDeepSeek, lmChatOpenRouter. Event-driven trigger; 74 nodes.