{
  "id": "Ftc5rqkqCX9ROcDu",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Create &Publish X-Threads (Twitter) with GPT-5 via Telegram Bot & Approval Loop",
  "tags": [
    {
      "id": "0f9SAyGcLm0ORsVP",
      "name": "telegram",
      "createdAt": "2025-11-13T18:01:50.147Z",
      "updatedAt": "2025-11-13T18:01:50.147Z"
    },
    {
      "id": "jr2hCTuLFQKar2iT",
      "name": "x",
      "createdAt": "2025-11-21T17:08:00.869Z",
      "updatedAt": "2025-11-21T17:08:00.869Z"
    }
  ],
  "nodes": [
    {
      "id": "f92a4c30-c994-4aab-ae38-a01299c99d7b",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        3296,
        1424
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-5",
          "cachedResultName": "gpt-5"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "5928f72a-808a-4ebf-88e1-3ba527693705",
      "name": "Speech to Text",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        3088,
        1088
      ],
      "parameters": {
        "options": {},
        "resource": "audio",
        "operation": "transcribe"
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "b56c0add-3a93-49b9-b39a-7b3333d17307",
      "name": "Get Voice File",
      "type": "n8n-nodes-base.telegram",
      "position": [
        2864,
        1088
      ],
      "parameters": {
        "fileId": "={{ $('Start: Telegram Message').item.json.message.voice.file_id }}",
        "resource": "file",
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "d7309acd-e08f-4ef3-8a7c-36dea5daf065",
      "name": "Check if Approved",
      "type": "n8n-nodes-base.if",
      "position": [
        3664,
        1200
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "id-1",
              "operator": {
                "type": "string",
                "operation": "contains"
              },
              "leftValue": "={{ $json.output }}",
              "rightValue": "videoPrompt"
            },
            {
              "id": "id-2",
              "operator": {
                "type": "string",
                "operation": "contains"
              },
              "leftValue": "={{ $json.output }}",
              "rightValue": "socialMediaText"
            },
            {
              "id": "id-3",
              "operator": {
                "type": "string",
                "operation": "startsWith"
              },
              "leftValue": "={{ $json.output }}",
              "rightValue": "{"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "9447030e-7089-4045-b28c-c1e038a3f3e6",
      "name": "Window Buffer Memory",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        3472,
        1424
      ],
      "parameters": {
        "sessionKey": "={{ $('Start: Telegram Message').first().json.message.from.id }}",
        "sessionIdType": "customKey",
        "contextWindowLength": 10
      },
      "typeVersion": 1.3
    },
    {
      "id": "11c8c3ce-b6d3-44e3-b35d-cc43b8892d1d",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        720,
        816
      ],
      "parameters": {
        "width": 1120,
        "height": 752,
        "content": "## AI LinkedIn Content Bot with Approval Loop\n\nTransform your Telegram into a LinkedIn content assistant. Send ideas via text or voice, collaborate with AI to refine posts, and publish directly to X with a simple \"ok\" or \"approved\".\n\n### How it works\n\n1. **Send your idea** - Message your Telegram bot with text or voice notes\n2. **AI drafts content** - GPT analyzes your input and creates a X-optimized post with hashtags\n3. **Iterative refinement** - Request changes (tone, length, style) until satisfied\n4. **Approve & publish** - Say \"ok\" or \"approved\" to trigger automatic LinkedIn posting via Blotato\n5. **Get confirmation** - Receive a direct link once your post is live\n\n### Setup steps\n\n1. **Telegram Bot** - Create a bot via @BotFather and add the API token to credentials\n2. **OpenAI API** - Add your OpenAI key for AI generation and voice transcription\n3. **Blotato Account** - Connect your LinkedIn profile at [Blotato](https://blotato.com/) and add API credentials & Connect with your X-Account\n4. **Customize the AI** - Edit the system prompt in \"AI: Draft & Revise Post\" to match your brand voice and content style\n\n### Customization tips\n\n- **Adjust tone & style** - Modify the system prompt to change formality, emoji usage, or hashtag count\n- **Switch AI models** - Swap GPT-4o-mini for more powerful models in the OpenAI Chat Model node\n- **Schedule posts** - Change Blotato operation from \"create\" to \"schedule\" for delayed publishing"
      },
      "typeVersion": 1
    },
    {
      "id": "5bcd779f-2a5c-444a-b387-69e9df29eecb",
      "name": "Start: Telegram Message",
      "type": "n8n-nodes-base.telegramTrigger",
      "position": [
        2192,
        1184
      ],
      "parameters": {
        "updates": [
          "message"
        ],
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "05ca53c7-a8c3-4ec7-b939-f2d48973a34c",
      "name": "Prepare Input",
      "type": "n8n-nodes-base.set",
      "position": [
        2416,
        1184
      ],
      "parameters": {
        "fields": {
          "values": [
            {
              "name": "text",
              "stringValue": "={{ $json?.message?.text || \"\" }}"
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "46615b14-105f-4cec-ae69-76f7b50fbe21",
      "name": "Check: ist it a Voice?",
      "type": "n8n-nodes-base.if",
      "position": [
        2640,
        1184
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "a0bf9719-4272-46f6-ab3b-eda6f7b44fd8",
              "operator": {
                "type": "string",
                "operation": "empty",
                "singleValue": true
              },
              "leftValue": "={{ $json.message.text }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "52e83621-28ec-4ff8-ae44-397ccc6e556a",
      "name": "AI: Draft & Revise Post",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        3312,
        1200
      ],
      "parameters": {
        "text": "={{ $json.text }}",
        "options": {
          "systemMessage": "Keep the confirmation/approval process, but change the output format as follows:\n\n1. Your Core Task\nStep 1: First understand and structure the user\u2019s thoughts\n\n\nAnalyze the user\u2019s message and explicitly structure it into:\n\n\nTopic\n\n\nGoal (e.g., reach, show expertise, recruiting, personal branding, leads)\n\n\nTarget Audience\n\n\nTonality (e.g., factual, personal, bold, inspiring)\n\n\nKey message (one main core idea)\n\n\nImportant examples, stories, data or arguments the user mentions or clearly wants included\n\n\n\n\nIf information is missing, unclear, or contradictory:\n\n\nAsk targeted follow-up questions before you write a thread draft.\n\n\nAsk at most 3 precise questions per round so you don\u2019t overwhelm the user.\n\n\nPhrase questions clearly and in a bullet-like style so they are easy to answer.\n\n\n\n\nIf needed, briefly research on the internet to clarify the context:\n\n\nDo this when the user refers to current events, numbers, trends, studies, people, tools, or products that you are not sure about.\n\n\nUse this research to:\n\n\nUse terms correctly\n\n\nCheck the plausibility of numbers or statements\n\n\nAdd short, relevant context where it increases value for the reader\n\n\n\n\nIf sources are conflicting or something is uncertain, mention this briefly and neutrally instead of inventing certainty.\n\n\n\n\nApply scientifically grounded prompting methods:\n\n\nDecomposition: Break the user\u2019s request into sub-tasks:\n\n\nclarify goal\n\n\nclarify target audience\n\n\ndefine the key message\n\n\ndefine the structure of the 5 tweets (beginning, middle, end)\n\n\ndefine the call-to-action\n\n\n\n\nStep-by-step reasoning (Chain-of-Thought):\n\n\nFirst, lock in the goal and target audience.\n\n\nThen formulate one clear key message.\n\n\nSplit that key message into 5 logical steps (one for each tweet).\n\n\nFrom that, derive hook, narrative arc, and closing.\n\n\n\n\nSelf-check / reflection before sending a draft:\n\n\nDoes the thread match the defined target audience?\n\n\nIs the tonality consistent?\n\n\nDoes each tweet add a clear step, value, or perspective?\n\n\nAre there obvious factual errors, contradictions, or confusing jumps?\n\n\n\n\n\n\nOnly after this understanding and structuring step is done, you propose a 5-part thread for X.\n\n2. Create a 5-part Thread for X\nCreate a 5-part thread (5 separate posts/tweets) based on the structured analysis:\n\n\nTweet 1 (Hook):\n\n\nStrong, curiosity-driving hook in the first 1\u20132 lines.\n\n\nMake immediately clear what the thread is about and who it is for.\n\n\n\n\nTweets 2\u20134 (Main body):\n\n\nBuild a clear narrative or logical progression with value, story, examples, or insights.\n\n\nEach tweet should:\n\n\nConvey one main point (step in a process, an insight, a lesson, or a concrete example).\n\n\nBe understandable on its own, but still clearly part of the overall thread.\n\n\n\n\n\n\nTweet 5 (Conclusion & Call-to-Action):\n\n\nShort conclusion or strongest insight.\n\n\nOptionally add a call-to-action, e.g.:\n\n\nAsk a question to spark replies\n\n\nInvite to share experiences\n\n\nSuggest following the account, sending a DM, or checking out a resource\n\n\n\n\n\n\nHashtags & format for X:\n\n\nUse hashtags sparingly and intentionally, primarily in the last tweet (or naturally inside tweets).\n\n\nUse about 3\u20138 relevant hashtags (mix of niche + broader ones).\n\n\nEnsure good readability:\n\n\nNo emoji spam\n\n\nClear sentences, straightforward language\n\n\nEach tweet should be easy to scan and read on mobile\n\n\n\n\n\n\n\n3. How to Present Your Suggestion to the User\nAlways present your draft first as a normal text suggestion, not as JSON.\nUse a clear structure like:\nProposed X Thread:\n\n\nTweet 1: \u2026\n\n\nTweet 2: \u2026\n\n\nTweet 3: \u2026\n\n\nTweet 4: \u2026\n\n\nTweet 5: \u2026\n\n\nOptionally add a 1\u20132 sentence summary of the overall message of the thread.\nThen ask for feedback, for example:\n\n\u201cAny changes? (tone, length, more/less personal, more expert content, different hashtags, different structure of the thread?)\u201d\n\n\n4. Handling Feedback\nIf the user requests changes:\n\n\nExplicitly interpret what should change:\n\n\ntone (more/less bold, more/less personal)\n\n\nlength (shorter/longer tweets)\n\n\ncontent focus (more examples, more data, more emotional story, more actionable tips)\n\n\nstructure (different order of tweets, stronger hook, stronger conclusion)\n\n\nhashtags\n\n\nlanguage (e.g. German vs. English, \u201cyou\u201d vs. more formal wording)\n\n\n\n\nThen adjust the thread specifically based on this feedback, without randomly rewriting everything.\n\n\nOutput again only the updated thread suggestion, e.g.:\n\n\nUpdated X Thread Proposal:\n\n\nTweet 1: \u2026\n\n\nTweet 2: \u2026\n\n\nTweet 3: \u2026\n\n\nTweet 4: \u2026\n\n\nTweet 5: \u2026\n\n\nThen ask again whether further changes are desired.\n\n5. Final Approval & JSON Output\nIf the user writes \u201capproved\u201d, \u201cok\u201d, \u201clooks good\u201d, \u201cfine\u201d, \u201cpasst\u201d, \u201cship it\u201d, \u201cfreigeben\u201d or anything clearly meaning approval:\n\n\nReturn only the following JSON, with no additional text, no Markdown, no explanation:\n\n\n{\n  \"thread\": [\n    \"Tweet 1 \u2013 final text including hashtags if used\",\n    \"Tweet 2 \u2013 final text\",\n    \"Tweet 3 \u2013 final text\",\n    \"Tweet 4 \u2013 final text\",\n    \"Tweet 5 \u2013 final text\"\n  ]\n}\n\nImportant rules:\n\n\nNever output JSON before explicit approval.\n\n\nBefore approval, always respond with a normal, human-readable suggestion (no JSON).\n\n\nThe final output after approval must consist of only one JSON object with exactly one field:\n\n\nthread = an array with exactly 5 strings (one for each tweet in the final X thread)."
        },
        "promptType": "define"
      },
      "typeVersion": 3
    },
    {
      "id": "0064a0ec-a5b0-403d-abec-d83f7d392518",
      "name": "Approval: Extract Final Post Text",
      "type": "n8n-nodes-base.code",
      "position": [
        3888,
        1104
      ],
      "parameters": {
        "jsCode": "// Nimmt das erste Item aus dem Input\nconst item = $input.item;\n\n// Hier liegt dein KI-Output als Text, z.B.:\n// output\n// { \"thread\": [ \"Tweet 1\", \"Tweet 2\", ... ] }\nlet aiOutput = item.json.output;\n\nif (!aiOutput) {\n\tthrow new Error('Kein Feld \"output\" im JSON gefunden.');\n}\n\n// In manchen F\u00e4llen h\u00e4ngt vor dem JSON noch \"output\" o.\u00e4. oder ```json-Markdown.\n// 1) Code-Fences entfernen\naiOutput = aiOutput\n\t.replace(/```json/gi, '')\n\t.replace(/```/g, '')\n\t.trim();\n\n// 2) Nur den JSON-Teil extrahieren: erst '{', dann letztes '}'\nconst firstBrace = aiOutput.indexOf('{');\nconst lastBrace = aiOutput.lastIndexOf('}');\n\nif (firstBrace === -1 || lastBrace === -1) {\n\tthrow new Error('Konnte kein g\u00fcltiges JSON in \"output\" finden.');\n}\n\nlet jsonString = aiOutput.slice(firstBrace, lastBrace + 1).trim();\n\nlet parsed;\ntry {\n\tparsed = JSON.parse(jsonString);\n} catch (error) {\n\tthrow new Error('Fehler beim JSON.parse: ' + error.message + '\\nJSON-String: ' + jsonString);\n}\n\n// Erwartete Struktur: { \"thread\": [ \"...\", \"...\", ... ] }\nconst thread = Array.isArray(parsed.thread) ? parsed.thread : [];\n\n// 5 Tweets extrahieren (falls weniger vorhanden sind, leere Strings)\nconst tweet1 = thread[0] || '';\nconst tweet2 = thread[1] || '';\nconst tweet3 = thread[2] || '';\nconst tweet4 = thread[3] || '';\nconst tweet5 = thread[4] || '';\n\n// Optional: Array aller Tweets\nconst tweetsArray = [tweet1, tweet2, tweet3, tweet4, tweet5];\n\n// Item zur\u00fcckgeben (n8n erwartet ein Array von Items)\nreturn [\n\t{\n\t\tjson: {\n\t\t\t// Originaldaten beibehalten\n\t\t\t...item.json,\n\t\t\t// Neue Felder\n\t\t\ttweet1,\n\t\t\ttweet2,\n\t\t\ttweet3,\n\t\t\ttweet4,\n\t\t\ttweet5,\n\t\t\ttweetsArray,\n\t\t},\n\t},\n];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "093e0fc9-5dc6-4010-860f-c8f336d28a38",
      "name": "Create post with Blotato",
      "type": "@blotato/n8n-nodes-blotato.blotato",
      "position": [
        4112,
        1104
      ],
      "parameters": {
        "options": {},
        "platform": "twitter",
        "accountId": {
          "__rl": true,
          "mode": "list",
          "value": "9843",
          "cachedResultUrl": "https://backend.blotato.com/v2/accounts/9843",
          "cachedResultName": "EvelynX273809"
        },
        "postContentText": "=Thread:",
        "postContentAdditionalPosts": {
          "posts": [
            {
              "text": "={{ $json.tweet1 }}"
            },
            {
              "text": "={{ $json.tweet2 }}"
            },
            {
              "text": "={{ $json.tweet3 }}"
            },
            {
              "text": "={{ $json.tweet4 }}"
            },
            {
              "text": "={{ $json.tweet5 }}"
            }
          ]
        }
      },
      "credentials": {
        "blotatoApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "d34e3f69-49cb-41d2-b072-6fd05209a492",
      "name": "Give Blotat 5s :)",
      "type": "n8n-nodes-base.wait",
      "position": [
        4416,
        1104
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "025b6b00-b85a-4f25-a839-1493b46b3131",
      "name": "Check post status",
      "type": "@blotato/n8n-nodes-blotato.blotato",
      "position": [
        4640,
        1104
      ],
      "parameters": {
        "operation": "get",
        "postSubmissionId": "={{ $json.postSubmissionId }}"
      },
      "credentials": {
        "blotatoApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "cbca9508-afb0-4f5f-9487-226a3d8580b8",
      "name": "Published?",
      "type": "n8n-nodes-base.if",
      "position": [
        4864,
        1104
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "1bc619f0-b64a-4487-bbc7-21be7c30f1f1",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "published"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "e01508ab-1545-44d3-a8b7-68865a976e4d",
      "name": "Send a confirmation message",
      "type": "n8n-nodes-base.telegram",
      "position": [
        5312,
        944
      ],
      "parameters": {
        "text": "=Your post is online!\n\nClick here to go to the post:\n{{ $json.publicUrl }}",
        "chatId": "={{ $('Start: Telegram Message').item.json.message.chat.id }}",
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "ca70b802-fa47-4cc8-a505-1046d6ad297a",
      "name": "In Progress?",
      "type": "n8n-nodes-base.if",
      "position": [
        5088,
        1120
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "e6c403be-3a03-4365-ac18-69d9ffc1770b",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $('Check post status').item.json.status }}",
              "rightValue": "in-progress"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "a2173eef-8e33-46e1-9df4-d25cb9570b66",
      "name": "Give Blotat other 5s :)",
      "type": "n8n-nodes-base.wait",
      "position": [
        5088,
        1328
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "79036c64-f6e6-4a92-ae67-2ade9e05566b",
      "name": "Send an error message",
      "type": "n8n-nodes-base.telegram",
      "position": [
        5328,
        1136
      ],
      "parameters": {
        "text": "There was an error uploading your post.",
        "chatId": "={{ $('Start: Telegram Message').item.json.message.chat.id }}",
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "32ed1162-4627-41dd-99e3-0a84107ee9b4",
      "name": "Post Suggestion Or Ask For Approval",
      "type": "n8n-nodes-base.telegram",
      "position": [
        3888,
        1296
      ],
      "parameters": {
        "text": "={{ $('AI: Draft & Revise Post').item.json.output }}",
        "chatId": "={{ $('Start: Telegram Message').first().json.message.chat.id }}",
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "f5f6d080-f306-45d7-93c6-ee26ce39d078",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2128,
        816
      ],
      "parameters": {
        "color": 7,
        "width": 1104,
        "height": 752,
        "content": "## 1. Capture Input\n\nReceives Telegram messages and converts voice notes to text using OpenAI Whisper"
      },
      "typeVersion": 1
    },
    {
      "id": "598d0910-603f-4bf5-8c69-cafc6e673dbb",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3248,
        816
      ],
      "parameters": {
        "color": 7,
        "width": 352,
        "height": 752,
        "content": "## 2. AI Content Creation\n\nGenerates LinkedIn posts and handles revision requests through conversational memory"
      },
      "typeVersion": 1
    },
    {
      "id": "2ea2f2b1-5f4f-4d9d-8321-9448d295a383",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3616,
        816
      ],
      "parameters": {
        "color": 7,
        "width": 720,
        "height": 752,
        "content": "## 3. Approval & Publishing\n\nDetects approval keywords, extracts final content, and posts to X via Blotato"
      },
      "typeVersion": 1
    },
    {
      "id": "94d388d6-ea42-41f5-9f69-1e6a3a2078d5",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4368,
        816
      ],
      "parameters": {
        "color": 7,
        "width": 1168,
        "height": 752,
        "content": "## 4. Status Monitoring\n\nPolls Blotato API to verify publication and sends confirmation with post link to Telegram"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "d042a95a-26e4-4494-9737-3f9c472c2a40",
  "connections": {
    "Published?": {
      "main": [
        [
          {
            "node": "Send a confirmation message",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "In Progress?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "In Progress?": {
      "main": [
        [
          {
            "node": "Give Blotat other 5s :)",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send an error message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Input": {
      "main": [
        [
          {
            "node": "Check: ist it a Voice?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Voice File": {
      "main": [
        [
          {
            "node": "Speech to Text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Speech to Text": {
      "main": [
        [
          {
            "node": "AI: Draft & Revise Post",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check if Approved": {
      "main": [
        [
          {
            "node": "Approval: Extract Final Post Text",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Post Suggestion Or Ask For Approval",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check post status": {
      "main": [
        [
          {
            "node": "Published?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Give Blotat 5s :)": {
      "main": [
        [
          {
            "node": "Check post status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI: Draft & Revise Post",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Window Buffer Memory": {
      "ai_memory": [
        [
          {
            "node": "AI: Draft & Revise Post",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Check: ist it a Voice?": {
      "main": [
        [
          {
            "node": "Get Voice File",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "AI: Draft & Revise Post",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI: Draft & Revise Post": {
      "main": [
        [
          {
            "node": "Check if Approved",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Give Blotat other 5s :)": {
      "main": [
        [
          {
            "node": "Check post status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Start: Telegram Message": {
      "main": [
        [
          {
            "node": "Prepare Input",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create post with Blotato": {
      "main": [
        [
          {
            "node": "Give Blotat 5s :)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Approval: Extract Final Post Text": {
      "main": [
        [
          {
            "node": "Create post with Blotato",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Post Suggestion Or Ask For Approval": {
      "main": [
        []
      ]
    }
  }
}