AutomationFlowsAI & RAG › N8nflow En

N8nflow En

N8Nflow En. Uses executeCommand, readBinaryFiles, httpRequest, googleGemini. Scheduled trigger; 28 nodes.

Cron / scheduled trigger★★★★☆ complexityAI-powered28 nodesExecute CommandRead Binary FilesHTTP RequestGoogle GeminiGmail
AI & RAG Trigger: Cron / scheduled Nodes: 28 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow follows the Executecommand → HTTP Request 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 →

Download .json
{
  "nodes": [
    {
      "parameters": {
        "content": "~# docker exec -it n8n_core sh\nrm -f /root/.n8n-files/.processing\nclear the flag manually\n(wsl)",
        "width": 336
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -9552,
        1136
      ],
      "id": "7f0a7d38-1a16-4430-a48b-b6b0513e1b59",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes",
              "minutesInterval": 1
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.3,
      "position": [
        -10640,
        1168
      ],
      "id": "97aa2a49-7d7c-4084-8af1-7ca18f7f7b78",
      "name": "Schedule Trigger"
    },
    {
      "parameters": {
        "command": "find /root/.n8n-files \\( -name \"*.wav\" -o -name \"*.m4a\" \\) -not -path \"*/temp_chunks/*\" -not -name \"*.done.*\" -not -name \"temp_input_course.wav\" | head -1"
      },
      "type": "n8n-nodes-base.executeCommand",
      "typeVersion": 1,
      "position": [
        -10544,
        1168
      ],
      "id": "e931ecc2-09d3-4e70-a9bf-a7a507ac7e05",
      "name": "Execute Command",
      "notesInFlow": true,
      "notes": "Unlimited time, only check for .done., exclude temp_input_course.wav"
    },
    {
      "parameters": {
        "jsCode": "const stdout = $input.first().json.stdout?.trim();\nif (!stdout) return [];\n\nconst filePath = stdout;\nconst parts = filePath.split('/');\nconst filename = parts[parts.length - 1];\nlet category = parts[parts.length - 2];\n\n// If in the '\u6703\u8b70' (Meeting) subfolder, prepend '\u6703\u8b70_' to category\nif (parts.includes('\u6703\u8b70') && category !== '\u6703\u8b70') {\n  category = `\u6703\u8b70_${category}`;\n}\n\nconsole.log(`Found file to process: ${category}/${filename}`);\nreturn [{ json: { body: { category, filename }, filePath } }];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -10448,
        1168
      ],
      "id": "afb360d2-3845-498e-96a0-360fadb492de",
      "name": "Code in JavaScript1"
    },
    {
      "parameters": {
        "command": "=SOURCE=\"{{ $json.filePath }}\"\nif [ ! -f \"$SOURCE\" ]; then\n  echo \"ERROR: Source file does not exist $SOURCE\"\n  exit 1\nfi\nif [ -f /root/.n8n-files/.processing ]; then\n  AGE=$(find /root/.n8n-files/.processing -mmin +180 | wc -l)\n  if [ \"$AGE\" -gt 0 ]; then\n    rm -f /root/.n8n-files/.processing\n    echo \"Old flag timed out and cleared, continuing execution\"\n  else\n    echo \"BUSY\"\n    exit 0\n  fi\nfi\ntouch /root/.n8n-files/.processing\nmkdir -p /root/.n8n-files/temp_chunks\ncp \"$SOURCE\" /root/.n8n-files/temp_input_course.wav\nif [ $? -ne 0 ]; then\n  rm -f /root/.n8n-files/.processing\n  echo \"ERROR: Copy failed\"\n  exit 1\nfi\nmv \"$SOURCE\" \"${SOURCE}.done\"\necho \"OK\""
      },
      "id": "b8dfbee9-230c-4875-9c10-f9d2905862b6",
      "name": "Copy Audio File to Safe Zone 1",
      "type": "n8n-nodes-base.executeCommand",
      "typeVersion": 1,
      "position": [
        -10352,
        1264
      ],
      "notesInFlow": true,
      "onError": "continueErrorOutput",
      "notes": "Failsafe version: Check source exists -> flag check -> copy -> mark done, auto-clear flag on failure"
    },
    {
      "parameters": {
        "jsCode": "const result = $input.first().json;\nconst stdout = result.stdout?.trim() || '';\nconst exitCode = result.exitCode;\nif (exitCode !== 0 || stdout.startsWith('ERROR') || stdout === 'BUSY') {\n  console.log('Stop reason:', stdout || `exitCode=${exitCode}`);\n  return [];\n}\nconsole.log('Audio file copied successfully, continuing workflow');\nreturn $input.all();"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -10256,
        1264
      ],
      "id": "0b06876b-3a38-4b5a-93f7-8c7294477955",
      "name": "Code in JavaScript",
      "notesInFlow": true,
      "notes": "Use exitCode for judgment, more stable than string comparison"
    },
    {
      "parameters": {
        "command": "touch /root/.n8n-files/.last_check"
      },
      "type": "n8n-nodes-base.executeCommand",
      "typeVersion": 1,
      "position": [
        -10160,
        1264
      ],
      "id": "791127b2-802c-4fd0-9233-fe14b8fee559",
      "name": "touch"
    },
    {
      "parameters": {
        "command": "rm -f /root/.n8n-files/temp_chunks/part_*.wav /root/.n8n-files/temp_chunks/part_*.m4a && echo \"Old chunks cleared\""
      },
      "id": "e03894cb-2632-40b9-92e0-49ea82d08925",
      "name": "Clear Old Chunks 1",
      "type": "n8n-nodes-base.executeCommand",
      "typeVersion": 1,
      "position": [
        -10048,
        1344
      ]
    },
    {
      "parameters": {
        "command": "INPUT=\"/root/.n8n-files/temp_input_course.wav\"\nif [ ! -f \"$INPUT\" ]; then echo \"ERROR: temp_input_course.wav does not exist\"; exit 1; fi\nffmpeg -y -i \"$INPUT\" -f segment -segment_time 600 -c:a pcm_s16le /root/.n8n-files/temp_chunks/part_%03d.wav 2>&1 | tail -3\necho \"FFmpeg completed\""
      },
      "id": "337f82da-982f-4ffa-9794-c2996252649c",
      "name": "FFmpeg Auto Chunking 1",
      "type": "n8n-nodes-base.executeCommand",
      "typeVersion": 1,
      "position": [
        -9952,
        1344
      ],
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "command": "sync && FILE_COUNT=$(ls /root/.n8n-files/temp_chunks/part_*.wav 2>/dev/null | wc -l)\nif [ \"$FILE_COUNT\" -eq 0 ]; then echo \"ERROR: No chunks generated\"; exit 1; fi\necho \"Chunking completed, total $FILE_COUNT\"\nls -lh /root/.n8n-files/temp_chunks/part_*.wav"
      },
      "id": "f76a36d6-4184-4cff-9e66-6e925d388936",
      "name": "Confirm Chunking Completed 1",
      "type": "n8n-nodes-base.executeCommand",
      "typeVersion": 1,
      "position": [
        -9856,
        1344
      ],
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "fileSelector": "/root/.n8n-files/temp_chunks/part_*.wav"
      },
      "id": "b2db4452-89f9-4775-8c37-77ae3224a54b",
      "name": "Read All Chunks 1",
      "type": "n8n-nodes-base.readBinaryFiles",
      "typeVersion": 1,
      "position": [
        -9696,
        1344
      ]
    },
    {
      "parameters": {
        "jsCode": "const items = $input.all();\nconst wfStatic = $getWorkflowStaticData('global');\nwfStatic['current_run'] = { totalChunks: items.length, completedCount: 0, results: [] };\nconsole.log(`Initialization complete, total ${items.length} chunks`);\nreturn items.map((item, index) => ({\n  json: { chunkIndex: index, totalChunks: items.length },\n  binary: { data: Object.values(item.binary)[0] }\n}));"
      },
      "id": "cd4b0052-45b8-4bf7-bf91-306e300e19b5",
      "name": "Initialize Static Container 1",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -9568,
        1344
      ]
    },
    {
      "parameters": {
        "options": {}
      },
      "id": "caf356b9-009a-4669-9ce6-aa42f30a2f73",
      "name": "Loop Chunk Processing 1",
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 3,
      "position": [
        -9408,
        1344
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "http://whisper:8000/v1/audio/transcriptions",
        "sendBody": true,
        "contentType": "multipart-form-data",
        "bodyParameters": {
          "parameters": [
            {
              "parameterType": "formBinaryData",
              "name": "file",
              "inputDataFieldName": "data"
            },
            {
              "name": "model",
              "value": "Systran/faster-whisper-large-v3"
            },
            {
              "name": "response_format",
              "value": "json"
            },
            {
              "name": "condition_on_previous_text",
              "value": "false"
            },
            {
              "name": "temperature",
              "value": "0.0"
            },
            {
              "name": "vad_filter",
              "value": "true"
            },
            {
              "name": "compression_ratio_threshold",
              "value": "2.0"
            },
            {
              "name": "logprob_threshold",
              "value": "-1.0"
            },
            {
              "name": "no_speech_threshold",
              "value": "0.6"
            }
          ]
        },
        "options": {
          "timeout": 600000
        }
      },
      "id": "bf3bb7d9-4b11-4a54-bc0e-4bf0da973e15",
      "name": "Whisper ASR Transcription",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.1,
      "position": [
        -9232,
        1360
      ],
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "jsCode": "const items = $input.all();\nconst wfStatic = $getWorkflowStaticData('global');\nif (!wfStatic['current_run']) {\n  wfStatic['current_run'] = { totalChunks: 0, completedCount: 0, results: [] };\n}\nif (items[0]?.json?.error) {\n  wfStatic['current_run'].completedCount += 1;\n  return [{ json: { completed: wfStatic['current_run'].completedCount, total: wfStatic['current_run'].totalChunks } }];\n}\nlet text = items[0]?.json?.text || '';\nconst lines = text.split(/[\uff0c\u3002\uff1f\uff01\\n]/);\nconst seen = {};\nlet cleanLines = [];\nfor (const line of lines) {\n  const trimmed = line.trim();\n  if (!trimmed) continue;\n  seen[trimmed] = (seen[trimmed] || 0) + 1;\n  if (seen[trimmed] <= 3) cleanLines.push(trimmed);\n}\ntext = cleanLines.join('\uff0c');\nwfStatic['current_run'].results.push(text);\nwfStatic['current_run'].completedCount += 1;\nconst completed = wfStatic['current_run'].completedCount;\nconst total = wfStatic['current_run'].totalChunks;\nconsole.log(`Completed ${completed} / ${total} chunks`);\nreturn [{ json: { completed, total } }];"
      },
      "id": "3aacacd8-35e5-4460-9786-3ab7c0658479",
      "name": "Accumulate ASR Results 1",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -9072,
        1360
      ]
    },
    {
      "parameters": {
        "jsCode": "const wfStatic = $getWorkflowStaticData('global');\nconst container = wfStatic['current_run'] || { results: [] };\nfunction cleanHallucinations(text) {\n  if (!text) return '';\n  let cleaned = text.replace(/(.{2,10}?)\\1{3,}/g, '$1');\n  cleaned = cleaned.replace(/(.)\\1{5,}/g, '$1');\n  return cleaned.trim();\n}\nconst fullText = container.results\n  .filter(t => t && t.trim().length > 0)\n  .map(t => cleanHallucinations(t))\n  .join('\\n\\n');\nconsole.log(`Transcript combined, total ${container.results.length} segments`);\nreturn [{ json: { fullText } }];"
      },
      "id": "d0813160-bfa0-4b3b-9f33-2fefb6890f1a",
      "name": "Combine Full Transcript",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -9040,
        1200
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 1
          },
          "conditions": [
            {
              "id": "meeting-01",
              "leftValue": "={{ $('Code in JavaScript1').item.json.body.category }}",
              "rightValue": "\u6703\u8b70",
              "operator": {
                "type": "string",
                "operation": "contains"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "87c9180e-4492-479d-8d97-ef6335491207",
      "name": "IF Meeting Condition",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        -8624,
        1152
      ]
    },
    {
      "parameters": {
        "modelId": {
          "__rl": true,
          "value": "models/gemini-3-flash-preview",
          "mode": "list",
          "cachedResultName": "models/gemini-3-flash-preview"
        },
        "messages": {
          "values": [
            {
              "content": "=You are a professional course teaching assistant. Please help me organize a structured summary based on the following course transcript, and create quiz questions to force active recall (15 multiple-choice questions, 5 short-answer questions), providing reference answers and brief explanations at the end.\n\n**Content:**\n{{ $('Combine Full Transcript').item.json.fullText }}\n\nPlease output in Traditional Chinese with Taiwanese terminology, and use Markdown for elegant formatting (e.g., headings, bold text, bullet points).\n\nSpecial Note: Because these notes will be sent via Gmail, and Gmail does not support LaTeX mathematical rendering.\nAbsolutely DO NOT use the $ symbol to wrap formulas.\nPlease use plain text for all mathematical expressions (e.g., use ^ for powers, sqrt for square roots, / for fractions) to ensure clear readability in an email environment that does not support math formatting."
            }
          ]
        },
        "builtInTools": {},
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "typeVersion": 1.1,
      "position": [
        -8656,
        1344
      ],
      "id": "11930bfd-db84-4262-9d8e-eb1bc3b50b75",
      "name": "Gemini Notes and Quiz 1",
      "retryOnFail": true,
      "waitBetweenTries": 5000,
      "maxTries": 5,
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "command": "=mkdir -p \"/data/obsidian_vault/{{ $('Code in JavaScript1').item.json.body.category }}\" && cat > \"/data/obsidian_vault/{{ $('Code in JavaScript1').item.json.body.category }}/AI_Notes_{{ $now.format('yyyy-MM-dd_HHmm') }}.md\" <<'EOF'\n{{ $json.content.parts[0].text }}\nEOF"
      },
      "id": "772a2b27-41b8-481b-808c-88a95bdc27a4",
      "name": "Write to Obsidian 1",
      "type": "n8n-nodes-base.executeCommand",
      "typeVersion": 1,
      "position": [
        -8304,
        1328
      ]
    },
    {
      "parameters": {
        "mode": "markdownToHtml",
        "markdown": "={{ $('Gemini Notes and Quiz 1').item.json.content.parts[0].text }}",
        "options": {}
      },
      "id": "659e45d3-9a44-464f-97f4-5a998e74d88f",
      "name": "Markdown to HTML 1",
      "type": "n8n-nodes-base.markdown",
      "typeVersion": 1,
      "position": [
        -8144,
        1360
      ]
    },
    {
      "parameters": {
        "sendTo": "411421246@gms.ndhu.edu.tw",
        "subject": "=\ud83d\udcda {{ $('Code in JavaScript1').item.json.body.category }} Course Notes - {{ $now.format('yyyy-MM-dd') }}",
        "message": "=<h2>\ud83d\udcda {{ $('Code in JavaScript1').item.json.body.category }} Course Notes</h2>\n<p><strong>Recording Time:</strong> {{ $now.format('yyyy-MM-dd HH:mm') }}</p>\n<hr>\n{{ $json.data }}",
        "options": {}
      },
      "id": "444a6314-806d-4c23-9b44-c7df801479ab",
      "name": "Send Gmail Review Email",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        -8000,
        1360
      ],
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "executeOnce": false,
        "command": "rm -f /root/.n8n-files/temp_chunks/part_*.wav\nrm -f /root/.n8n-files/temp_chunks/part_*.m4a\nrm -f /root/.n8n-files/temp_input_course.wav\nrm -f /root/.n8n-files/.processing\necho \"Cleanup completed (General Course)\""
      },
      "id": "33140e3d-7335-46cd-bb2c-0467319008a8",
      "name": "Clear Temp Files",
      "type": "n8n-nodes-base.executeCommand",
      "typeVersion": 1,
      "position": [
        -7872,
        1360
      ],
      "notesInFlow": true,
      "notes": "General course workflow finished, clear all temp files + flag"
    },
    {
      "parameters": {
        "modelId": {
          "__rl": true,
          "value": "models/gemini-3-flash-preview",
          "mode": "list",
          "cachedResultName": "models/gemini-3-flash-preview"
        },
        "messages": {
          "values": [
            {
              "content": "=You are a professional meeting recording assistant. Please organize a clearly structured meeting minutes document based on the following meeting transcript.\n\n[Important Note]\nThis transcript was generated by AI speech recognition and may contain minor recognition errors or repeated phrases. Please use your judgment to filter out meaningless content and focus on the substantive discussion.\n\nPlease output in the following format, using Markdown:\n\n---\n\n## \ud83d\udccb Basic Information\n- **Meeting Name**: {{ $('Code in JavaScript1').item.json.body.category }}\n- **Date**: {{ $now.format('yyyy-MM-dd') }}\n- **Meeting Purpose**: (Determine from transcript)\n\n---\n\n## \ud83c\udfaf Discussion Highlights\n(List the main topics discussed, specifically noting any dissenting opinions or debates)\n\n---\n\n## \u2696\ufe0f Key Reasons / Trade-offs\n(Various viewpoints and the reasons for choosing a particular direction)\n\n---\n\n## \ud83d\udca1 Perspectives Influencing Future Decisions\n(Which ideas or information will guide the upcoming direction)\n\n---\n\n## \u2705 Resolutions\n(Explicitly list what was finally decided, using bullet points)\n\n---\n\n## \ud83d\udccc Action Items\n| Assignee | Task | Deadline |\n|--------|---------|------|\n(If the transcript does not explicitly mention the assignee or deadline, fill in 'TBD')\n\n---\n\n## \ud83d\udcc5 Next Meeting Schedule\n(Fill in if mentioned, otherwise write 'Unscheduled')\n\n---\n\n## \ud83d\uddd2\ufe0f Additional Notes\n(Other information worth recording but not categorized)\n\n---\n\n> Meeting Minutes = Decisions + Actions + Responsibilities\n\nPlease output in Traditional Chinese with Taiwanese terminology. DO NOT use the $ symbol to wrap any content.\n\n[Transcript Content]:\n{{ $('Combine Full Transcript').item.json.fullText }}"
            }
          ]
        },
        "builtInTools": {},
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "typeVersion": 1.1,
      "position": [
        -8384,
        1152
      ],
      "id": "6e6d9de9-ec18-46ff-a36e-e86f9efaed74",
      "name": "Gemini Meeting Minutes",
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "command": "=CATEGORY=\"{{ $('Code in JavaScript1').item.json.body.category }}\"\nmkdir -p \"/data/obsidian_vault/\u6703\u8b70/${CATEGORY}\" && cat > \"/data/obsidian_vault/\u6703\u8b70/${CATEGORY}/Meeting_Minutes_{{ $now.format('yyyy-MM-dd_HHmm') }}.md\" <<'OBSEOF'\n{{ $json.content.parts[0].text }}\nOBSEOF"
      },
      "id": "433ec0b6-6d8b-426d-8412-642a8eb938b2",
      "name": "Meeting_Write to Obsidian",
      "type": "n8n-nodes-base.executeCommand",
      "typeVersion": 1,
      "position": [
        -8144,
        1152
      ]
    },
    {
      "parameters": {
        "mode": "markdownToHtml",
        "markdown": "={{ $('Gemini Meeting Minutes').item.json.content.parts[0].text }}",
        "options": {}
      },
      "id": "512d4f5d-d857-4e5d-af55-8efedf5e4661",
      "name": "Meeting_Markdown to HTML",
      "type": "n8n-nodes-base.markdown",
      "typeVersion": 1,
      "position": [
        -8048,
        1152
      ]
    },
    {
      "parameters": {
        "sendTo": "411421246@gms.ndhu.edu.tw",
        "subject": "=\ud83d\udcdd Meeting Minutes | {{ $('Code in JavaScript1').item.json.body.category }} - {{ $now.format('yyyy-MM-dd') }}",
        "message": "=<h2>\ud83d\udcdd Meeting Minutes</h2>\n<p><strong>Meeting:</strong> {{ $('Code in JavaScript1').item.json.body.category }}</p>\n<p><strong>Time:</strong> {{ $now.format('yyyy-MM-dd HH:mm') }}</p>\n<hr>\n{{ $json.data }}",
        "options": {}
      },
      "id": "1f769179-8fe5-4088-9ebd-e33680c2c55f",
      "name": "Meeting_Send Gmail",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        -7872,
        1152
      ],
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "command": "rm -f /root/.n8n-files/temp_chunks/part_*.wav\nrm -f /root/.n8n-files/temp_input_course.wav\nrm -f /root/.n8n-files/.processing\necho \"Cleanup completed (Meeting workflow)\""
      },
      "type": "n8n-nodes-base.executeCommand",
      "typeVersion": 1,
      "position": [
        -7712,
        1152
      ],
      "id": "e6200166-2388-4cbe-987e-e016c9692884",
      "name": "Clear Temp Files_Meeting",
      "notesInFlow": true,
      "notes": "Meeting workflow finished, clear temp files + flag"
    },
    {
      "parameters": {
        "sendTo": "411421246@gms.ndhu.edu.tw",
        "subject": "=\ud83d\udcdd {{ $('Code in JavaScript1').item.json.body.category }} Class Transcript - {{ $now.format('yyyy-MM-dd') }}",
        "message": "=<h2>\ud83d\udcdd {{ $('Code in JavaScript1').item.json.body.category }} Class Transcript</h2>\n<p><strong>Recording Time:</strong> {{ $now.format('yyyy-MM-dd HH:mm') }}</p>\n<hr>\n<pre style=\"font-family: monospace; white-space: pre-wrap; font-size: 13px; background: #f5f5f5; padding: 16px; border-radius: 4px;\">\n{{ $('Combine Full Transcript').item.json.fullText }}\n</pre>",
        "options": {}
      },
      "id": "2790a906-2d77-4f99-8fa9-5d21cf2f833c",
      "name": "Send Class Transcript",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        -8928,
        1200
      ],
      "notesInFlow": true,
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "notes": "Permanent feature: Send transcript for all courses"
    }
  ],
  "connections": {
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Execute Command",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Execute Command": {
      "main": [
        [
          {
            "node": "Code in JavaScript1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript1": {
      "main": [
        [
          {
            "node": "Copy Audio File to Safe Zone 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Copy Audio File to Safe Zone 1": {
      "main": [
        [
          {
            "node": "Code in JavaScript",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Code in JavaScript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript": {
      "main": [
        [
          {
            "node": "touch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "touch": {
      "main": [
        [
          {
            "node": "Clear Old Chunks 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Clear Old Chunks 1": {
      "main": [
        [
          {
            "node": "FFmpeg Auto Chunking 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "FFmpeg Auto Chunking 1": {
      "main": [
        [
          {
            "node": "Confirm Chunking Completed 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Confirm Chunking Completed 1": {
      "main": [
        [
          {
            "node": "Read All Chunks 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read All Chunks 1": {
      "main": [
        [
          {
            "node": "Initialize Static Container 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Initialize Static Container 1": {
      "main": [
        [
          {
            "node": "Loop Chunk Processing 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Chunk Processing 1": {
      "main": [
        [
          {
            "node": "Combine Full Transcript",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Whisper ASR Transcription",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Whisper ASR Transcription": {
      "main": [
        [
          {
            "node": "Accumulate ASR Results 1",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Accumulate ASR Results 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Accumulate ASR Results 1": {
      "main": [
        [
          {
            "node": "Loop Chunk Processing 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Combine Full Transcript": {
      "main": [
        [
          {
            "node": "Send Class Transcript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF Meeting Condition": {
      "main": [
        [
          {
            "node": "Gemini Meeting Minutes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gemini Notes and Quiz 1": {
      "main": [
        [
          {
            "node": "Write to Obsidian 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Write to Obsidian 1": {
      "main": [
        [
          {
            "node": "Markdown to HTML 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Markdown to HTML 1": {
      "main": [
        [
          {
            "node": "Send Gmail Review Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Gmail Review Email": {
      "main": [
        [
          {
            "node": "Clear Temp Files",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gemini Meeting Minutes": {
      "main": [
        [
          {
            "node": "Meeting_Write to Obsidian",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Meeting_Write to Obsidian": {
      "main": [
        [
          {
            "node": "Meeting_Markdown to HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Meeting_Markdown to HTML": {
      "main": [
        [
          {
            "node": "Meeting_Send Gmail",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Meeting_Send Gmail": {
      "main": [
        [
          {
            "node": "Clear Temp Files_Meeting",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Class Transcript": {
      "main": [
        [
          {
            "node": "Gemini Notes and Quiz 1",
            "type": "main",
            "index": 0
          },
          {
            "node": "IF Meeting Condition",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "meta": {
    "templateCredsSetupCompleted": true
  }
}

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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

N8Nflow En. Uses executeCommand, readBinaryFiles, httpRequest, googleGemini. Scheduled trigger; 28 nodes.

Source: https://github.com/3rskine/lecture-autonoter/blob/main/n8nflow_EN.json — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

N8Nflow Zhtw. Uses executeCommand, readBinaryFiles, httpRequest, googleGemini. Scheduled trigger; 28 nodes.

Execute Command, Read Binary Files, HTTP Request +2
AI & RAG

This workflow is a complete outbound automation system that discovers local businesses, extracts contact emails, generates personalized cold emails using AI, and runs a multi-step follow-up sequence —

Stop And Error, Google Sheets, HTTP Request +2
AI & RAG

This workflow automatically fetches the latest business news, analyzes its impact on clients using AI and sends alerts for high-impact articles while logging all processed data in Google Sheets. It en

HTTP Request, Google Gemini, Gmail +1
AI & RAG

This workflow automatically fetches daily stock market news, analyzes sentiment using Gemini AI, calculates impact scores, sends alerts for high-impact news and stores structured results in Google She

HTTP Request, Google Gemini, Gmail +1
AI & RAG

&gt; n8n, Gemini AI, Nifty 50 API & Gmail

HTTP Request, Google Gemini, Gmail