Behöver ert företag hjälp med att implementera AI? Kontakta oss och få prisoffert här →
AI Skolan
januari 22, 2026

Docsify + OpenAI: självu p pdaterad arbetsflödesdokumentation

Rickard Andersson Partner, Nodenordic.se

Din n8n-instans växer. Din dokumentation gör det inte. Efter några veckor litar ingen på wikin, nyanställda DM:ar dig för ”de riktiga stegen”, och varje liten workflow-justering gör i tysthet att dokumentet som brukade stämma inte längre gör det.

Det här är den typen av röra som ops-ansvariga till slut sitter med, men byråägare och marknadsteam känner av det också. Med Docsify OpenAI docs kan du göra ”tyst kunskap” till en levande portal som håller sig uppdaterad utan att du blir en teknisk skribent på heltid.

Nedan ser du workflowet som driver allt, vad det automatiserar och vad du får på andra sidan: sökbar dokumentation, redigerbara sidor och Mermaid-diagram som förklarar workflows med en snabb blick.

Så här fungerar automationen

Hela n8n-workflowet, från trigger till slutlig output:

n8n Workflow Template: Docsify + OpenAI: självu p pdaterad arbetsflödesdokumentation

Problemet: workflow-dokumentation blir snabbt inaktuell

De flesta team dokumenterar automationer en gång och rör sedan aldrig dokumentet igen. Inte för att de inte bryr sig, utan för att det är ett osmidigt jobb. Du måste öppna n8n, klicka dig igenom noder, sammanfatta vad som ändrats, ta skärmbilder och sedan publicera det någonstans där folk faktiskt hittar det. Under tiden fortsätter workflows att utvecklas: en ny gren läggs till, inloggningsuppgifter ändras, en webhook byter namn eller en extra ”If”-nod ändrar i tysthet vad som händer i edge cases. Dokumentet blir ”tillräckligt nära”, vilket ärligt talat är värre än att inte ha något alls.

Friktionen byggs på. Här är var det faller sönder.

  • Du tappar runt 2 timmar varje vecka på att svara på ”vad gör det här workflowet?” i Slack eller via mejl.
  • När någon redigerar ett workflow uppdateras dokumentet sällan i samma stund, så din single source of truth delas i två.
  • Nya teammedlemmar vågar inte röra automationer eftersom de inte kan se logiken i klartext.
  • Revisioner och incidentgenomgångar tar längre tid eftersom ingen snabbt kan förklara vad som kördes, varför det kördes och vad det skrev.

Lösningen: en Docsify-portal som genererar och serverar workflow-dokumentation

Det här workflowet gör din n8n-instans till en levande dokumentationssajt byggd på Docsify.js. Det börjar med att servera ett Docsify-webbgränssnitt via webhook-endpoints, så att din dokumentation alltid är tillgänglig på ett ställe. När någon öppnar en workflow-sida kan automationen läsa in en befintlig Markdown-fil om den redan finns; annars hämtar den workflowet från n8n, genererar ett Mermaid-diagram från workflow-strukturen och ber OpenAI skriva tydlig dokumentation i ett konsekvent format. Du får också en inbyggd editor med live-förhandsvisning av Markdown, vilket innebär att en människa kan rätta formuleringar, lägga till verksamhetskontext eller justera namngivning utan att lämna portalen. Till sist sparas Markdown tillbaka till disk så att dokumentationen består och är enkel att versionshantera.

Workflowet startar vid Docsify-webhooken, routar förfrågningar baserat på filtyp och åtgärd (visa, generera, redigera, spara) och sammanfogar sedan rätt flöden. I mitten producerar OpenAI den berättande Markdown-texten och n8n-kodnoder bygger Mermaid-diagram. I slutet serverar Docsify den färdiga sidan eller editorn och Markdown-filen skrivs till din projektkatalog.

Det du får: automation vs. resultat

Exempel: så här ser det ut i praktiken

Säg att du kör en n8n-instans med cirka 40 workflows. Att dokumentera bara 10 av dem manuellt per månad (läsa noder, skriva en sammanfattning, lägga till ett diagram) kan lätt ta 30 minuter styck, så du lägger cirka 5 timmar i månaden bara på att ”hänga med”. Med det här workflowet skapas en ny docs-sida när du öppnar den: kanske 1 minut för att klicka in i portalen, sedan en kort väntan medan OpenAI genererar Markdown och Mermaid-diagrammet renderas. Du granskar, klickar spara och går vidare. Tiden flyttas från skrivande till snabb godkänning.

Det här behöver du

  • n8n-instans (prova n8n Cloud gratis)
  • Alternativ för self-hosting om du föredrar det (Hostinger fungerar bra)
  • Docsify.js för webbgränssnittet till dokumentationssajten.
  • OpenAI för att generera Markdown-dokumentationen.
  • OpenAI API-nyckel (hämta den i OpenAI-dashboarden).

Kunskapsnivå: Mellan. Du klistrar in inloggningsuppgifter, sätter miljövariabler och säkerställer att n8n kan läsa/skriva till en katalog.

Vill du inte sätta upp det här själv? Prata med en automationsexpert (gratis 15-minuters konsultation).

Så fungerar det

En Docsify-förfrågan träffar en webhook. Noden Docsify Webhook tar emot sidförfrågningar, och din Settings Hub sätter grundkonfiguration som n8n-URL och projektmapp för filer.

Workflowet avgör vad användaren försöker göra. En switch för filtyp och en router för ”doc action” separerar ”servera huvudportalen”, ”returnera Markdown”, ”öppna editorn” och ”spara ändringar”. Inga mystiska klick.

Befintliga dokument läses in, annars genereras dokument. Om en Markdown-fil finns läses den och returneras. Om den inte finns hämtar n8n workflow-detaljerna, en kodnod bygger ett Mermaid-diagram och OpenAI-kedjan genererar en korrekt formaterad berättande text enligt din mall.

Output serveras och ändringar skrivs tillbaka. HTML-sidor (portal, editor) returneras via webhook-svar, medan Markdown sparas till disk via läs/skriv-filnoden efter konvertering till en textfil.

Du kan enkelt justera dokumentationsmallen så att den matchar era interna standarder efter behov. Se hela implementationsguiden nedan för alternativ för anpassning.

Steg-för-steg-guide för implementation

Steg 1: konfigurera webhook-triggern

Det här arbetsflödet levererar en dokumentationsportal via webhook-endpoints för huvudgränssnittet och filrutter.

  1. Lägg till en Docsify Webhook-nod och ställ in Path135bc21f-c7d0-4afe-be73-f984d444b43b med Response Mode inställt på responseNode.
  2. Lägg till en Workflow File Webhook-nod och ställ in Path/:file, aktivera Multiple Methods och ställ in Response ModeresponseNode.
  3. Koppla Docsify Webhook så att den skickar output till både Settings Hub och Branch Merge Four parallellt.
  4. Koppla Workflow File Webhook så att den skickar output till både Settings Hub och Branch Merge Five parallellt.

⚠️ Vanlig fallgrop: Om Response Mode inte är inställt på responseNode kommer era svar från Return Markdown Reply och Reply Main Page HTML inte att skickas till webbläsaren.

Steg 2: konfigurera globala inställningar och parallell routning

Noden Settings Hub centraliserar miljövärden och HTML-mallhuvuden som används i hela portalen.

  1. I Settings Hub lägger ni till följande fält i Assignments: project_path satt till ./.n8n/test_docs, instance_url satt till ={{$env["N8N_PROTOCOL"]}}://{{$env["N8N_HOST"]}}, och inkludera de fullständiga HTML-blocken för HTML_headers, HTML_styles_editor och HTML_docsify_include.
  2. Säkerställ att Settings Hub skickar output till både Branch Merge Four och Branch Merge Five parallellt.
  3. I Detect File Type konfigurerar ni regeln att kontrollera Ends With och sätter vänstervärdet till ={{ $json.params.file.toLowerCase() }} och högervärdet till .md.
  4. I Route Markdown Files sätter ni regler för att routa README.md, summary.md, filnamn som börjar med docs_ och filnamn som börjar med tag- från ={{ $json.params.file }}.

Tips: Eftersom Settings Hub matar flera HTML-noder, håll HTML-värdena på ett ställe för att undvika avvikelser i stilar eller skript.

Steg 3: anslut n8n API-datakällor

Dessa noder hämtar arbetsflödesmetadata och taggar för att bygga dokumentationsindexet.

  1. I Retrieve All Workflows ställer ni in Filters → Tags till ={{ decodeURIComponent(($json.params.file?.match(/^tag-(.+)\.md$/))?.[1] || '') }}.
  2. Konfigurera Order Workflows att sortera på updatedAt i descending ordning.
  3. I Build Workflow Table behåller ni formeln för fältet content som den är angiven för att bygga raderna i sammanfattningstabellen.
  4. Koppla Retrieve Workflow Tags till Tag Navigation List för att bygga taggfiltermenyn.
  5. Autentiseringsuppgifter krävs: Anslut era n8nApi-uppgifter till Retrieve All Workflows, Retrieve Workflow Tags och Retrieve Single Workflow.

Steg 4: sätt upp AI-generatorn för dokumentation

AI-grenen genererar en arbetsflödesbeskrivning och dokumentation av nodinställningar med hjälp av LLM-kedjan och output-parsers.

  1. I LLM Documentation Chain ställer ni in Text till det angivna arbetsflödes-JSON-uttrycket, som börjar med =Here's the workflow data:.
  2. Bekräfta att LLM Documentation Chain har Has Output Parser aktiverat och använder undernoderna Structured Response Parser och Auto-Correct Parser.
  3. I OpenAI Chat Engine ställer ni in Model till gpt-4-turbo och konfigurerar alternativ som timeout och temperature enligt exemplet.
  4. Autentiseringsuppgifter krävs: Anslut era openAiApi-uppgifter till OpenAI Chat Engine.
  5. Observera att Structured Response Parser och Auto-Correct Parser är AI-undernoder—autentiseringsuppgifter läggs till i OpenAI Chat Engine, inte i parsrarna.

⚠️ Vanlig fallgrop: Om OpenAI Chat Engine inte är ansluten kommer LLM Documentation Chain att fallera utan tydligt fel och Assemble Generated Doc kommer att falla tillbaka till “SORRY”-platshållarna.

Steg 5: konfigurera filläsning, skrivning och redigering

Det här flödet hanterar att läsa befintlig dokumentation, generera markdown och spara redigeringar.

  1. I Create Directory ställer ni in Command till =mkdir -p {{$('Settings Hub').first().json.project_path}} för att säkerställa att dokumentationsmappen finns.
  2. I Load Documentation File ställer ni in File Selector till ={{ $('Settings Hub').first().json.project_path }}/{{ $json.params.file }}.
  3. I Read File Content ställer ni in Operation till text och Destination Key till workflowdata.
  4. I Text File Converter ställer ni in Operation till toText och Source Property till workflowdata.
  5. I Write Documentation File ställer ni in File Name till ={{ $('Settings Hub').first().json.project_path }}/{{ $('Settings Hub').first().json.params.file }} och Operation till write.
  6. I Map Edited Fields ställer ni in workflowdata till ={{ $json.body.content }} för att spara redigeringar.

Tips: Route Doc Action skickar output till Create Directory, Load Documentation File och Pass-Through Node parallellt, så se till att de tre grenarna är kopplade innan ni testar.

Steg 6: bygg HTML- och markdown-svar

Dessa noder renderar portalens UI och returnerar markdown eller HTML baserat på den begärda filen/åtgärden.

  1. I Primary HTML Page behåller ni mall-HTML:en och de inbäddade uttrycken som refererar till Settings Hub, inklusive {{ $('Settings Hub').first().json.HTML_headers }} och {{ $('Settings Hub').first().json.HTML_docsify_include }}.
  2. I Markdown Editor Page behåller ni textarea-bindningen till {{ $json.workflowdata }} och Docsify-editorinställningen för liveförhandsgranskning.
  3. I Workflow Summary Page behåller ni uttrycket som bygger tabellen {{ $jmespath($input.all(),'[].json.content').join('\n') }}.
  4. Skicka HTML via Reply Main Page HTML och Return HTML Reply, och skicka markdown via Return Markdown Reply.

Steg 7: koppla villkorslogik och parallella merges

Villkorsnoder avgör när dokumentation ska genereras, när editorn ska visas eller när markdown ska returneras.

  1. Konfigurera Check File Exists med villkoret ={{ Object.keys($json).length }} större än 0.
  2. Säkerställ att Check Edit Action A och Check Edit Action B utvärderar ={{ $json.query.action }} lika med edit.
  3. Bekräfta att Check Save Action kontrollerar att ={{ $json?.query?.action }} är lika med save och att det finns.
  4. Behåll merge-beteendet över Branch Merge One, Branch Merge Two, Branch Merge Three, Branch Merge Four, Branch Merge Five och Branch Merge Six för att kombinera output innan routning.
  5. Retrieve Single Workflow skickar output till både Create Mermaid Diagram och Combine Streams parallellt; säkerställ att Combine Streams är inställd på combineByPosition med numberInputs inställt på 3.

⚠️ Vanlig fallgrop: Om någon av merge-noderna är felkopplad kan Assemble Generated Doc få ofullständiga indata och markdown-editorn kommer att visa saknade sektioner.

Steg 8: testa och aktivera ert arbetsflöde

Gå igenom portalens endpoints för att verifiera UI:t, markdown-rutterna och spara-åtgärder.

  1. Använd Docsify Webhook i manuellt läge och öppna test-URL:en för att bekräfta att portalen laddar och att Reply Main Page HTML returnerar HTML.
  2. Begär summary.md via Workflow File Webhook och bekräfta att Return Markdown Reply returnerar markdown-tabellen från Workflow Summary Page.
  3. Begär en specifik dokumentationsfil (till exempel docs_123.md?action=edit) och bekräfta att Markdown Editor Page laddar med sparat innehåll.
  4. Trigga en spara-begäran med ?action=save och verifiera att Acknowledge Save svarar med en 200-kod.
  5. När allt fungerar, slå om arbetsflödet till Active för produktion.
🔒

Lås upp fullständig steg-för-steg-guide

Få den kompletta implementeringsguiden + nedladdningsbar mall

Vanliga fallgropar

  • OpenAI-uppgifter kan löpa ut eller slå i användningsgränser. Om genereringen plötsligt misslyckas, kontrollera först status för din OpenAI API-nyckel och fakturering i OpenAI-dashboarden.
  • Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om noder längre ned i kedjan fallerar på tomma svar.
  • Att skriva till lokala filer kräver behörigheter. Om Docsify-sidor laddar men sparningar inte fastnar, bekräfta att n8n har skrivrättigheter till den konfigurerade projektkatalogen på din server.

Vanliga frågor

Hur lång tid tar det att sätta upp den här automationen för Docsify OpenAI docs?

Räkna med cirka 1–2 timmar om server och nycklar är klara.

Behöver jag kunna koda för att automatisera Docsify OpenAI docs?

Nej. Du kommer främst att konfigurera noder, inloggningsuppgifter och en mappsökväg. Lätta justeringar av prompts eller mallar är valfria, inte ett krav.

Är n8n gratis att använda för det här workflowet för Docsify OpenAI docs?

Ja. n8n har ett gratis self-hosted-alternativ och en gratis provperiod på n8n Cloud. Cloud-planer börjar på 20 USD/månad för högre volymer. Du behöver också räkna med OpenAI API-kostnader, som vanligtvis är några cent per genererad docs-sida.

Var kan jag hosta n8n för att köra den här automationen?

Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller self-hosting på en VPS. För self-hosting är Hostinger VPS prisvärd och klarar n8n bra. Self-hosting ger dig obegränsade körningar men kräver grundläggande serverhantering.

Kan jag anpassa det här workflowet för Docsify OpenAI docs för en privat editor med autentisering?

Ja, men du behöver lägga till en auth-kontroll framför edit/spara-rutterna. De flesta team lägger basic authentication eller SSO framför Docsify-webhooken och begränsar sedan åtgärdsvägen för ”spara” så att bara godkända användare kan skriva filer. Du kan också justera avsnittet Template Doc Content så att det matchar ert interna format och tweaka AI-prompten för dokumentation så att den följer era namngivningsregler och ton.

Varför misslyckas min OpenAI-anslutning i det här workflowet?

Oftast handlar det om en utgången eller ogiltig API-nyckel, så skapa en ny nyckel och uppdatera den i OpenAI-uppgiften i n8n. Det kan också vara ett faktureringsproblem eller att du slår i rate limits när du genererar många docs på kort tid. Om felet bara dyker upp för vissa workflows, kontrollera även promptstorleken; mycket stora workflows kan ge stora payloads som behöver trimmas.

Hur många workflows kan den här automationen för Docsify OpenAI docs hantera?

Om du self-hostar n8n finns ingen körningsgräns (det beror främst på din server). På n8n Cloud sätter din plans körningskvot ett tak för hur ofta du kan regenerera eller servera docs i hög volym. I praktiken kan portalen lista hundratals workflows, och du genererar vanligtvis docs först när en sida öppnas första gången eller när du väljer att uppdatera den.

Är den här automationen för Docsify OpenAI docs bättre än att använda Zapier eller Make?

För det här användningsfallet, ja, eftersom du serverar webbsidor, förgrenar på åtgärder, skriver filer och genererar diagram. Det här är inte ”tvåstegs-Zap”-problem. n8n hanterar komplex routing (som dina edit/spara-åtgärder), sammanfogning av flera flöden (workflow-data plus Mermaid-output) och att köra kodnoder utan krångliga workarounds. Du får också en väg för self-hosting, vilket spelar roll när dokumentationen innehåller interna systemdetaljer. Zapier eller Make kan fortfarande hjälpa till med enklare dokumentationsnotiser eller engångssynkar, men de är inte särskilt bra som motor för en docs-portal. Om du är osäker, prata med en automationsexpert så får du en rak rekommendation.

När det här väl rullar slutar dokumentation att vara ett kvartalsvis städprojekt. Det blir en del av hur dina automationer fungerar, tyst, i bakgrunden.

Kontakta oss

Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.

×

Använd mall

Få direkt tillgång till denna n8n-arbetsflödes JSON-fil

\n
\n
\n
\n
\n
\n \n\n{{ $('Settings Hub').first().json.HTML_docsify_include }}\n \n" }, "typeVersion": 1.2 }, { "id": "71e136d5-bb5b-4eab-8cab-bfc50ea2a5a5", "name": "Workflow Markdown Body", "type": "n8n-nodes-base.html", "position": [ 1260, 1000 ], "parameters": { "html": "{{ $json.workflowdata }}" }, "executeOnce": true, "typeVersion": 1.2 }, { "id": "6cb6f3b8-de65-43a5-9df3-48299ba7fcce", "name": "Check Edit Action A", "type": "n8n-nodes-base.if", "position": [ 860, 1200 ], "parameters": { "options": [], "conditions": { "options": { "version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "id": "856cdb3b-a187-4db5-b77b-43ee086780ee", "operator": { "name": "filter.operator.equals", "type": "string", "operation": "equals" }, "leftValue": "={{ $json.query.action }}", "rightValue": "edit" } ] } }, "typeVersion": 2.2 }, { "id": "aff9ed71-bb49-4170-9ae3-5f05f89bab05", "name": "Check Edit Action B", "type": "n8n-nodes-base.if", "position": [ 1050, 860 ], "parameters": { "options": [], "conditions": { "options": { "version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "id": "e3648023-8cb7-4b82-bd35-1ba196458327", "operator": { "name": "filter.operator.equals", "type": "string", "operation": "equals" }, "leftValue": "={{ $json.query.action }}", "rightValue": "edit" } ] } }, "typeVersion": 2.2 }, { "id": "7b3d31a9-ee01-4bce-bc5b-78161536999d", "name": "Create Mermaid Diagram", "type": "n8n-nodes-base.code", "position": [ 1050, 980 ], "parameters": { "jsCode": "const workflow = $input.first().json;\n\n// Extract nodes from the workflow\nconst nodes = workflow.nodes || [];\n\n// Node types to exclude\nconst excludedNodeTypes = ['n8n-nodes-base.stickyNote'];\n\n// Define shapes and their corresponding brackets\nconst shapes = {\n 'rect': ['[', ']'],\n 'rhombus': ['{', '}'],\n 'circle': ['((', '))'],\n 'hexagon': ['{{', '}}'],\n 'subroutine': ['[[', ']]'],\n 'parallelogram': ['[\\/', '\\/]'],\n 'wait': ['(', ')']\n // Add more shapes here as needed\n};\n\n// Define special shapes for specific node types\nconst specialShapes = {\n 'n8n-nodes-base.if': 'rhombus',\n 'n8n-nodes-base.switch': 'rhombus',\n 'n8n-nodes-base.code': 'subroutine',\n 'n8n-nodes-base.executeWorkflow': 'subroutine',\n 'n8n-nodes-base.httpRequest':'parallelogram',\n 'n8n-nodes-base.wait':'wait'\n // List more special node types\n};\n\n// Function to get the shape for a node type\nfunction getNodeShape(nodeType) {\n return specialShapes[nodeType] || 'rect';\n}\n\n// Create a map of node names to their \"EL\" identifiers, disabled status, and shape\nconst nodeMap = {};\nlet nodeCounter = 1;\nnodes.forEach((node) => {\n if (!excludedNodeTypes.includes(node.type)) {\n const shape = getNodeShape(node.type);\n nodeMap[node.name] = {\n id: `EL${nodeCounter}`,\n disabled: node.disabled || false,\n shape: shape,\n brackets: shapes[shape] || shapes['rect'] // Default to rect if shape not found\n };\n nodeCounter++;\n }\n});\n\n// Function to convert special characters to HTML entities\nfunction convertToHTMLEntities(str) {\n return str.replaceAll('\"',\"'\").replace(/[^\\w\\s-]/g, function(char) {\n return '&#' + char.charCodeAt(0) + ';';\n });\n}\n\n// Function to format node text (with strike-through if disabled)\nfunction formatNodeText(nodeName, isDisabled) {\n const escapedName = convertToHTMLEntities(nodeName);\n return isDisabled ? `${escapedName}` : escapedName;\n}\n\n// Generate connections and isolated nodes\nconst connections = [];\nconst isolatedNodes = new Set(Object.keys(nodeMap));\n\nif (workflow.connections) {\n Object.entries(workflow.connections).forEach(([sourceName, targetConnections]) => {\n Object.entries(targetConnections).forEach(([connectionType, targets]) => {\n targets.forEach(targetArray => {\n targetArray.forEach(target => {\n const sourceNode = nodeMap[sourceName];\n const targetNode = nodeMap[target.node];\n if (sourceNode && targetNode) {\n let connectionLine = ` ${sourceNode.id}${sourceNode.brackets[0]}${formatNodeText(sourceName, sourceNode.disabled)}${sourceNode.brackets[1]}`;\n if (connectionType === 'main') {\n connectionLine += ` -->`;\n } else {\n connectionLine += ` -.- |${connectionType}|`;\n }\n connectionLine += ` ${targetNode.id}${targetNode.brackets[0]}${formatNodeText(target.node, targetNode.disabled)}${targetNode.brackets[1]}`;\n connections.push(connectionLine);\n isolatedNodes.delete(sourceName);\n isolatedNodes.delete(target.node);\n }\n });\n });\n });\n });\n}\n\n// Add isolated nodes to the connections array\nisolatedNodes.forEach(nodeName => {\n const node = nodeMap[nodeName];\n connections.push(` ${node.id}${node.brackets[0]}${formatNodeText(nodeName, node.disabled)}${node.brackets[1]}`);\n});\n\n// Generate the Mermaid flowchart string\nconst mermaidChart = `---\nconfig:\n look: neo\n theme: default\n---\nflowchart LR\n${connections.join('\\n')}`;\n\n// Output the result\nreturn {\n json: {\n mermaidChart: mermaidChart\n }\n};" }, "typeVersion": 2 }, { "id": "77a35cd5-cb8f-4ac5-a699-dff5e65cda09", "name": "Branch Merge Two", "type": "n8n-nodes-base.merge", "position": [ 860, 1320 ], "parameters": { "mode": "combine", "options": [], "combineBy": "combineByPosition" }, "typeVersion": 3 }, { "id": "f8119590-e9d7-4513-9da4-fa911165baff", "name": "Assemble Generated Doc", "type": "n8n-nodes-base.set", "position": [ 1050, 1460 ], "parameters": { "options": [], "assignments": { "assignments": [ { "id": "7693348d-5129-4a07-809d-b0619b9fc44b", "name": "workflowdata", "type": "string", "value": "=# {{ $json.name }}\n\n{{ $json?.output?.workflow_description || \"## \" }}\n\n## Workflow schematic\n\n```mermaid\n{{ $json.mermaidChart }}\n```\n\n{{ $json?.output?.nodes_settings || \"## \" }}" } ] } }, "typeVersion": 3.4 }, { "id": "92565206-6cf2-4243-9143-4f6def4b524d", "name": "Pass-Through Node", "type": "n8n-nodes-base.noOp", "position": [ 640, 980 ], "parameters": [], "typeVersion": 1 }, { "id": "73081fc3-9554-4a12-b985-da02b356616f", "name": "Branch Merge Three", "type": "n8n-nodes-base.merge", "position": [ 860, 860 ], "parameters": { "mode": "combine", "options": [], "combineBy": "combineByPosition" }, "typeVersion": 3 }, { "id": "f50e72f8-9027-4ca7-9df7-700e828f48eb", "name": "Branch Merge Four", "type": "n8n-nodes-base.merge", "position": [ 420, 130 ], "parameters": { "mode": "combine", "options": [], "combineBy": "combineByPosition" }, "typeVersion": 3 }, { "id": "306820ac-7c87-45c2-b76f-55d772ac7300", "name": "Branch Merge Five", "type": "n8n-nodes-base.merge", "position": [ 220, 360 ], "parameters": { "mode": "combine", "options": [], "combineBy": "combineByPosition" }, "typeVersion": 3 }, { "id": "96fd7265-7920-453f-8309-bdbd10880d03", "name": "Map Edited Fields", "type": "n8n-nodes-base.set", "position": [ 430, 900 ], "parameters": { "options": [], "assignments": { "assignments": [ { "id": "8bc55c5b-e09a-459b-bbb6-ed5f70d4f353", "name": "workflowdata", "type": "string", "value": "={{ $json.body.content }}" } ] }, "includeOtherFields": true }, "typeVersion": 3.4 }, { "id": "2fffb547-1c11-4663-aed5-29b9557e8738", "name": "Check Save Action", "type": "n8n-nodes-base.if", "position": [ 860, 1600 ], "parameters": { "options": [], "conditions": { "options": { "version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "id": "e3648023-8cb7-4b82-bd35-1ba196458327", "operator": { "name": "filter.operator.equals", "type": "string", "operation": "equals" }, "leftValue": "={{ $json?.query?.action }}", "rightValue": "save" }, { "id": "a44c9cc5-5717-4c34-978b-e644219a9cc1", "operator": { "type": "string", "operation": "exists", "singleValue": true }, "leftValue": "={{ $json?.query?.action }}", "rightValue": "" } ] } }, "typeVersion": 2.2 }, { "id": "15825037-a8e2-4fbc-b529-2bf89810a116", "name": "Branch Merge Six", "type": "n8n-nodes-base.merge", "position": [ 1050, 1600 ], "parameters": { "mode": "chooseBranch", "useDataOfInput": 2 }, "typeVersion": 3 }, { "id": "b47f18a4-9b59-4278-890d-b6f6c596c554", "name": "Acknowledge Save", "type": "n8n-nodes-base.respondToWebhook", "position": [ 640, 1600 ], "parameters": { "options": { "responseCode": 200 }, "respondWith": "noData" }, "typeVersion": 1.1 }, { "id": "273dfd58-abef-49b7-8f12-5abc3d3515a6", "name": "Workflow File Webhook", "type": "n8n-nodes-base.webhook", "position": [ 0, 340 ], "webhookId": "135bc21f-c7d0-4afe-be73-f984d444b43b", "parameters": { "path": "/:file", "options": [], "responseMode": "responseNode", "multipleMethods": true }, "typeVersion": 2 }, { "id": "d505d2ec-33e9-4983-8265-ff55f0df3da8", "name": "Detect File Type", "type": "n8n-nodes-base.switch", "position": [ 430, 330 ], "parameters": { "rules": { "values": [ { "outputKey": ".md", "conditions": { "options": { "version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "operator": { "type": "string", "operation": "endsWith" }, "leftValue": "={{ $json.params.file.toLowerCase() }}", "rightValue": ".md" } ] }, "renameOutput": true } ] }, "options": { "fallbackOutput": "extra", "renameFallbackOutput": "unknown" } }, "typeVersion": 3.2 }, { "id": "83189146-4d1f-454e-9591-bdbfda676683", "name": "Retrieve All Workflows", "type": "n8n-nodes-base.n8n", "position": [ 860, 520 ], "parameters": { "filters": { "tags": "={{ decodeURIComponent(($json.params.file?.match(/^tag-(.+)\\.md$/))?.[1] || '') }}" }, "requestOptions": [] }, "credentials": { "n8nApi": { "id": "credential-id", "name": "" } }, "typeVersion": 1, "alwaysOutputData": true }, { "id": "2d087c25-b998-4abc-b0ce-ede8e62e28b4", "name": "Route Markdown Files", "type": "n8n-nodes-base.switch", "position": [ 640, 340 ], "parameters": { "rules": { "values": [ { "outputKey": "README.md", "conditions": { "options": { "version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "operator": { "type": "string", "operation": "equals" }, "leftValue": "={{ $json.params.file }}", "rightValue": "README.md" } ] }, "renameOutput": true }, { "outputKey": "docs", "conditions": { "options": { "version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "id": "c1c1aecc-8faa-47ea-b831-4674c3c0db61", "operator": { "type": "string", "operation": "contains" }, "leftValue": "={{ $json.params.file }}", "rightValue": "docs_" } ] }, "renameOutput": true }, { "outputKey": "summary.md", "conditions": { "options": { "version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "id": "fde643c9-31cd-4cbd-b4de-99a8ad6202af", "operator": { "name": "filter.operator.equals", "type": "string", "operation": "equals" }, "leftValue": "={{ $json.params.file }}", "rightValue": "summary.md" } ] }, "renameOutput": true }, { "outputKey": "tags", "conditions": { "options": { "version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "id": "df4bc9f8-9285-49a6-b31c-d7173bf42901", "operator": { "type": "string", "operation": "startsWith" }, "leftValue": "={{ $json.params.file }}", "rightValue": "tag-" } ] }, "renameOutput": true } ] }, "options": { "fallbackOutput": "extra" } }, "typeVersion": 3.2 }, { "id": "08524df2-d555-42ca-8440-57ca5a780b74", "name": "Retrieve Workflow Tags", "type": "n8n-nodes-base.n8n", "position": [ 860, 760 ], "parameters": { "filters": [], "requestOptions": [] }, "credentials": { "n8nApi": { "id": "credential-id", "name": "" } }, "typeVersion": 1 }, { "id": "6953bf0c-3122-4d80-9e74-1c07a892bf31", "name": "Docsify Webhook", "type": "n8n-nodes-base.webhook", "position": [ 0, 160 ], "webhookId": "8b719afe-8be3-4cd5-84ed-aca521b31a89", "parameters": { "path": "135bc21f-c7d0-4afe-be73-f984d444b43b", "options": [], "responseMode": "responseNode" }, "typeVersion": 2 } ], "active": true, "pinData": [], "settings": { "callerPolicy": "workflowsFromSameOwner", "executionOrder": "v1", "executionTimeout": 120, "saveManualExecutions": true, "saveDataSuccessExecution": "all" }, "versionId": "", "connections": { "Combine Streams": { "main": [ [ { "node": "Check Edit Action A", "type": "main", "index": 0 } ] ] }, "Create Directory": { "main": [ [ { "node": "Branch Merge One", "type": "main", "index": 1 } ] ] }, "Settings Hub": { "main": [ [ { "node": "Branch Merge Four", "type": "main", "index": 1 }, { "node": "Branch Merge Five", "type": "main", "index": 0 } ] ] }, "Branch Merge One": { "main": [ [ { "node": "Check File Exists", "type": "main", "index": 0 } ] ] }, "Branch Merge Two": { "main": [ [ { "node": "Assemble Generated Doc", "type": "main", "index": 0 } ] ] }, "Branch Merge Three": { "main": [ [ { "node": "Check Edit Action B", "type": "main", "index": 0 } ] ] }, "Branch Merge Four": { "main": [ [ { "node": "Primary HTML Page", "type": "main", "index": 0 } ] ] }, "Branch Merge Five": { "main": [ [ { "node": "Detect File Type", "type": "main", "index": 0 } ] ] }, "Branch Merge Six": { "main": [ [ { "node": "Check Save Action", "type": "main", "index": 0 } ] ] }, "Docsify Webhook": { "main": [ [ { "node": "Settings Hub", "type": "main", "index": 0 }, { "node": "Branch Merge Four", "type": "main", "index": 0 } ] ] }, "Check File Exists": { "main": [ [ { "node": "Read File Content", "type": "main", "index": 0 } ], [ { "node": "Retrieve Single Workflow", "type": "main", "index": 0 } ] ] }, "Route Markdown Files": { "main": [ [ { "node": "Retrieve All Workflows", "type": "main", "index": 0 } ], [ { "node": "Route Doc Action", "type": "main", "index": 0 } ], [ { "node": "Retrieve Workflow Tags", "type": "main", "index": 0 } ], [ { "node": "Retrieve All Workflows", "type": "main", "index": 0 } ], [ { "node": "No-Op Placeholder", "type": "main", "index": 0 } ] ] }, "Markdown Editor Page": { "main": [ [ { "node": "Return HTML Reply", "type": "main", "index": 0 } ] ] }, "Blank Payload": { "main": [ [ { "node": "Branch Merge One", "type": "main", "index": 0 } ] ] }, "Primary HTML Page": { "main": [ [ { "node": "Reply Main Page HTML", "type": "main", "index": 0 } ] ] }, "Route Doc Action": { "main": [ [ { "node": "Create Directory", "type": "main", "index": 0 }, { "node": "Load Documentation File", "type": "main", "index": 0 }, { "node": "Pass-Through Node", "type": "main", "index": 0 } ], [ { "node": "Create Directory", "type": "main", "index": 0 }, { "node": "Load Documentation File", "type": "main", "index": 0 }, { "node": "Pass-Through Node", "type": "main", "index": 0 } ], [ { "node": "Create Directory", "type": "main", "index": 0 }, { "node": "Blank Payload", "type": "main", "index": 0 }, { "node": "Pass-Through Node", "type": "main", "index": 0 } ], [ { "node": "Map Edited Fields", "type": "main", "index": 0 } ] ] }, "Detect File Type": { "main": [ [ { "node": "Route Markdown Files", "type": "main", "index": 0 } ] ] }, "Map Edited Fields": { "main": [ [ { "node": "Text File Converter", "type": "main", "index": 0 }, { "node": "Branch Merge Six", "type": "main", "index": 1 } ] ] }, "Pass-Through Node": { "main": [ [ { "node": "Branch Merge Three", "type": "main", "index": 1 }, { "node": "Combine Streams", "type": "main", "index": 0 } ] ] }, "Assemble Generated Doc": { "main": [ [ { "node": "Text File Converter", "type": "main", "index": 0 }, { "node": "Check Edit Action B", "type": "main", "index": 0 } ] ] }, "Load Documentation File": { "main": [ [ { "node": "Branch Merge One", "type": "main", "index": 0 } ] ] }, "Tag Navigation List": { "main": [ [ { "node": "Return Markdown Reply", "type": "main", "index": 0 } ] ] }, "Template Doc Content": { "main": [ [ { "node": "Check Edit Action B", "type": "main", "index": 0 } ] ] }, "Order Workflows": { "main": [ [ { "node": "Build Workflow Table", "type": "main", "index": 0 } ] ] }, "LLM Documentation Chain": { "main": [ [ { "node": "Branch Merge Two", "type": "main", "index": 1 } ] ] }, "Text File Converter": { "main": [ [ { "node": "Write Documentation File", "type": "main", "index": 0 } ] ] }, "Check Save Action": { "main": [ [ { "node": "Acknowledge Save", "type": "main", "index": 0 } ] ] }, "Workflow File Webhook": { "main": [ [ { "node": "Settings Hub", "type": "main", "index": 0 }, { "node": "Branch Merge Five", "type": "main", "index": 1 } ], [ { "node": "Settings Hub", "type": "main", "index": 0 }, { "node": "Branch Merge Five", "type": "main", "index": 1 } ] ] }, "Check Edit Action A": { "main": [ [ { "node": "Template Doc Content", "type": "main", "index": 0 } ], [ { "node": "LLM Documentation Chain", "type": "main", "index": 0 }, { "node": "Branch Merge Two", "type": "main", "index": 0 } ] ] }, "Check Edit Action B": { "main": [ [ { "node": "Markdown Editor Page", "type": "main", "index": 0 } ], [ { "node": "Workflow Markdown Body", "type": "main", "index": 0 } ] ] }, "Read File Content": { "main": [ [ { "node": "Branch Merge Three", "type": "main", "index": 0 } ] ] }, "Retrieve All Workflows": { "main": [ [ { "node": "Order Workflows", "type": "main", "index": 0 } ] ] }, "Retrieve Workflow Tags": { "main": [ [ { "node": "Tag Navigation List", "type": "main", "index": 0 } ] ] }, "Workflow Summary Page": { "main": [ [ { "node": "Return Markdown Reply", "type": "main", "index": 0 } ] ] }, "OpenAI Chat Engine": { "ai_languageModel": [ [ { "node": "LLM Documentation Chain", "type": "ai_languageModel", "index": 0 }, { "node": "Auto-Correct Parser", "type": "ai_languageModel", "index": 0 } ] ] }, "Write Documentation File": { "main": [ [ { "node": "Branch Merge Six", "type": "main", "index": 0 } ] ] }, "Fallback Filename Note": { "main": [ [ { "node": "Return Markdown Reply", "type": "main", "index": 0 } ] ] }, "Build Workflow Table": { "main": [ [ { "node": "Workflow Summary Page", "type": "main", "index": 0 } ] ] }, "Workflow Markdown Body": { "main": [ [ { "node": "Return Markdown Reply", "type": "main", "index": 0 } ] ] }, "Retrieve Single Workflow": { "main": [ [ { "node": "Create Mermaid Diagram", "type": "main", "index": 0 }, { "node": "Combine Streams", "type": "main", "index": 1 } ] ] }, "Create Mermaid Diagram": { "main": [ [ { "node": "Combine Streams", "type": "main", "index": 2 } ] ] }, "No-Op Placeholder": { "main": [ [ { "node": "Fallback Filename Note", "type": "main", "index": 0 } ] ] }, "Structured Response Parser": { "ai_outputParser": [ [ { "node": "Auto-Correct Parser", "type": "ai_outputParser", "index": 0 } ] ] }, "Auto-Correct Parser": { "ai_outputParser": [ [ { "node": "LLM Documentation Chain", "type": "ai_outputParser", "index": 0 } ] ] } } }
Få prisoffert redan idag!
Få prisoffert redan idag!

Berätta vad ni behöver hjälp med så hör vi av oss inom en arbetsdag!

Få prisoffert redan idag!
Få prisoffert redan idag!

Berätta vad ni behöver hjälp med så hör vi av oss inom en arbetsdag!

Launch login modal Launch register modal