AutomationFlowsGeneral › Auto Generate Descriptive Node Names with AI for Workflow Readability

Auto Generate Descriptive Node Names with AI for Workflow Readability

ByAnan @mohamed3nan on n8n.io

This workflow uses AI to automatically generate clear and descriptive names for every node in your n8n workflows. It analyzes each node's type, parameters, and connections to create meaningful names, making your workflows instantly readable.

Event trigger★★★★★ complexityAI-powered33 nodesn8nChain LlmOutput Parser StructuredFormStop And ErrorOpenRouter ChatForm Trigger
General Trigger: Event Nodes: 33 Complexity: ★★★★★ AI nodes: yes Added:

This workflow corresponds to n8n.io template #10889 — we link there as the canonical source.

This workflow follows the Chainllm → Form Trigger 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": [
    {
      "id": "f2e3aaed-518d-49cc-92e4-2dfab710fc2c",
      "name": "Save Renamed Workflow Version",
      "type": "n8n-nodes-base.n8n",
      "position": [
        3344,
        -1232
      ],
      "parameters": {
        "operation": "update",
        "workflowId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Set Target Workflow Id').item.json.workflow_id }}"
        },
        "requestOptions": {},
        "workflowObject": "={{ $json.new_workflow.toJsonString() }}"
      },
      "credentials": {
        "n8nApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "3551fc54-1ac2-4c50-a445-d3cff828a636",
      "name": "Prepare LLM Validation Data",
      "type": "n8n-nodes-base.set",
      "position": [
        2464,
        -1216
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "ba5c59f1-4de6-460d-9685-037d791962cc",
              "name": "old_workflow",
              "type": "object",
              "value": "={{ $(\"Extract Workflow Nodes Connections\").item.json.old_workflow }}"
            },
            {
              "id": "7a6c8968-70db-4c1b-8592-1a98cfcef4fc",
              "name": "nodes_name",
              "type": "array",
              "value": "={{ $('Extract Workflow Nodes Connections').item.json.nodes.map(node => node.name) }}"
            },
            {
              "id": "9ee4702e-533f-4999-b9ea-fb6bdaf4e1f7",
              "name": "connections_nodes_name_reference",
              "type": "array",
              "value": "={{\n  (() => {\n    const names = [];\n    \n    // Get source nodes (keys)\n    names.push(...Object.keys($('Extract Workflow Nodes Connections').item.json.connections));\n    \n    // Get target nodes\n    for (const conn of Object.values($('Extract Workflow Nodes Connections').item.json.connections)) {\n      for (const type of Object.values(conn)) {          // main, error, etc.\n        for (const outputArray of type) {                // [[...]]\n          for (const target of outputArray) {            // [{node: \"...\"}]\n            if (target.node) names.push(target.node);\n          }\n        }\n      }\n    }\n    \n    return names;\n  })()\n}}"
            },
            {
              "id": "caf69cb1-6d78-4aec-8180-d3bad85529bf",
              "name": "parameters_names",
              "type": "array",
              "value": "={{\n  (() => {\n    const allNodeNames = $('Extract Workflow Nodes Connections').item.json.nodes.map(node => node.name);\n    const nodesString = JSON.stringify($('Extract Workflow Nodes Connections').item.json.nodes);\n    const foundPatterns = [];\n    \n    allNodeNames.forEach(nodeName => {\n      const patterns = [\n        `$('${nodeName}')`,\n        `$(\"${nodeName}\")`\n      ];\n      \n      patterns.forEach(pattern => {\n        if (nodesString.includes(pattern)) {\n          foundPatterns.push(pattern);\n        }\n      });\n    });\n    \n    return foundPatterns;\n  })()\n}}"
            },
            {
              "id": "b2ab8b7a-ffd0-413e-9a68-27d5466fe181",
              "name": "AI_output",
              "type": "array",
              "value": "={{ $json.output }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "5e6bad59-0f8d-41d1-9d7e-b515cccf664c",
      "name": "Generate Node Rename Mapping",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        2160,
        -1216
      ],
      "parameters": {
        "text": "=<system>\nYou are renaming nodes in an n8n workflow to make their purpose immediately clear.\n</system>\n\n<instructions>\n1. Extract ALL node names from the workflow's `nodes` array\n2. For each node, create a descriptive name based on:\n   - Its `type` (what kind of node it is)\n   - Its `parameters` (what it's configured to do)\n   - Its connections/position in the workflow flow (input from where, output to where)\n3. Return a mapping for EVERY SINGLE NODE\n\nRules:\n- Maximum 5 words per name\n- Use Title Case\n- Each name must be unique\n- Keep technical accuracy while being human-readable\n- If a name is already good, you can keep it (but still include it in output)\n</instructions>\n\n<critical>\nYour output array MUST have exactly the same number of items as the input workflow has nodes.\n\nBefore responding:\n- Count nodes in input: ___\n- Count items in your output: ___\n- If these don't match, you've made an error\n\nThe `old_name` must match the exact node name character-for-character (including spaces, capitals, etc.)\n</critical>\n\n<workflow>\n```json\n{{ JSON.stringify($json.old_workflow) }}\n```\n</workflow>",
        "batching": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.7
    },
    {
      "id": "fc194f98-996a-4eda-903d-96b8d475ab45",
      "name": "Apply Renamed Nodes Connections",
      "type": "n8n-nodes-base.set",
      "position": [
        2896,
        -1232
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "de87c369-7ca7-4242-8278-effec174c191",
              "name": "new_nodes",
              "type": "array",
              "value": "={{ $json.old_workflow.nodes.map(node => {\n  // Find mapping for the node name\n  const mapping = $json.AI_output.find(item => item.old_name === node.name);\n  \n  // Update parameters by replacing all node name references\n  let updatedParameters = JSON.stringify(node.parameters);\n  $json.AI_output.forEach(aiMapping => {\n    const pattern = new RegExp(aiMapping.old_name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'g');\n    updatedParameters = updatedParameters.replace(pattern, aiMapping.new_name);\n  });\n  \n  return {\n    ...node,\n    name: mapping ? mapping.new_name : node.name,\n    parameters: JSON.parse(updatedParameters)\n  };\n}) }}"
            },
            {
              "id": "90f8a9c1-e9a1-46ae-8af9-2130993a51f3",
              "name": "new_connections",
              "type": "object",
              "value": "={{\n  (() => {\n    const newConnections = {};\n    \n    for (const [sourceNode, connections] of Object.entries($json.old_workflow.connections)) {\n      // Find mapping for the source node (key)\n      const sourceMapping = $json.AI_output.find(item => item.old_name === sourceNode);\n      const newSourceNode = sourceMapping ? sourceMapping.new_name : sourceNode;\n      \n      // Deep copy and update target nodes\n      const updatedConnections = {};\n      for (const [connectionType, connectionArrays] of Object.entries(connections)) {\n        updatedConnections[connectionType] = connectionArrays.map(connArray => \n          connArray.map(conn => {\n            const targetMapping = $json.AI_output.find(item => item.old_name === conn.node);\n            return {\n              ...conn,\n              node: targetMapping ? targetMapping.new_name : conn.node\n            };\n          })\n        );\n      }\n      \n      newConnections[newSourceNode] = updatedConnections;\n    }\n    \n    return newConnections;\n  })()\n}}"
            },
            {
              "id": "3bf1958f-17e9-4719-824c-2282f807e4a6",
              "name": "new_workflow_without",
              "type": "object",
              "value": "={{\n  $json.old_workflow\n    .removeField('nodes')\n    .removeField('connections')\n}}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "00a41b6e-e61a-4aea-9c89-d9222fd860f3",
      "name": "Parse LLM Mapping ToJson",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        2320,
        -1040
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"type\": \"array\",\n  \"items\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"old_name\": {\n        \"type\": \"string\",\n        \"description\": \"The exact match original node name\"\n      },\n      \"new_name\": {\n        \"type\": \"string\",\n        \"description\": \"The new node name\"\n      }\n    },\n    \"required\": [\n      \"old_name\",\n      \"new_name\"\n    ]\n  }\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "b13bb440-55c2-4409-ad39-3c15a28b4de9",
      "name": "Extract Workflow Nodes Connections",
      "type": "n8n-nodes-base.set",
      "position": [
        3744,
        -1568
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "77460441-6e86-4940-ac7c-76dd99cb0de4",
              "name": "old_workflow",
              "type": "object",
              "value": "={{\n  $json\n    .removeField('pinData')\n    .removeField('shared')\n}}"
            },
            {
              "id": "88723b17-bb0e-437d-8ed3-8d412c4491b1",
              "name": "nodes",
              "type": "array",
              "value": "={{ $json.nodes }}"
            },
            {
              "id": "7464b93e-e357-4ed3-a933-6aab1f1d606a",
              "name": "connections",
              "type": "object",
              "value": "={{ $json.connections }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "2cf14043-22f5-4b12-8b0c-1468795f18bd",
      "name": "Assemble New Workflow Object",
      "type": "n8n-nodes-base.set",
      "position": [
        3120,
        -1232
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "bb6e8c56-60dd-42ad-9e13-695478a6891a",
              "name": "new_workflow",
              "type": "object",
              "value": "={{\n  Object.assign($json.new_workflow_without, {\n    nodes: $json.new_nodes,\n    connections: $json.new_connections,\n  })\n}}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "ed79df1c-7ca6-4e06-a618-0ca8fde24848",
      "name": "Validate All Nodes Renamed",
      "type": "n8n-nodes-base.if",
      "position": [
        2688,
        -1216
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "79e8a51f-63f7-4624-bf8b-6c529f0363db",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ [...$json.nodes_name].sort().toJsonString() }}",
              "rightValue": "={{ [...$json.AI_output.map(item => item.old_name)].sort().toJsonString() }}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "81999de4-0521-4a2d-8f0b-bdd6a1d16935",
      "name": "Build Workflow Version Links",
      "type": "n8n-nodes-base.set",
      "position": [
        3552,
        -1232
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "b9ddd66c-a4b6-4738-8cd1-4f1bb398e955",
              "name": "Link_to_new_version",
              "type": "string",
              "value": "={{ $execution.resumeUrl.split('/').slice(0, 3).join('/') + \"/workflow\" + \"/\" + $('Set Target Workflow Id').item.json.workflow_id + \"/history/\" + $json.versionId }}"
            },
            {
              "id": "969e8ea8-7dbd-4ddc-9ddf-d0c44284463f",
              "name": "Link_to_previous_version",
              "type": "string",
              "value": "={{ $execution.resumeUrl.split('/').slice(0, 3).join('/') + \"/workflow\" + \"/\" + $('Set Target Workflow Id').item.json.workflow_id + \"/history/\" + $('Assemble New Workflow Object').item.json.new_workflow.versionId }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "870e3349-1555-44da-9159-e97778b09830",
      "name": "Parse Selected Workflow Id",
      "type": "n8n-nodes-base.set",
      "position": [
        3072,
        -1568
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "2e17c48e-c158-42b7-a8ff-6fce97ff1003",
              "name": "id",
              "type": "string",
              "value": "={{ $json[\"Select a Workflow:\"].match(/\\(#([^)]+)\\)/)[1] }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "d5055f2c-3856-43e5-adfa-09b3f9b4ed56",
      "name": "Check Trigger Source Type",
      "type": "n8n-nodes-base.if",
      "position": [
        3744,
        -1232
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "3ad65d54-64d5-4f62-a435-09b931e8d066",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $('Form Trigger').isExecuted }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "108c03f7-d3c5-4623-9c3d-017c2577d58b",
      "name": "Display Workflow Version Links",
      "type": "n8n-nodes-base.form",
      "position": [
        3968,
        -1328
      ],
      "parameters": {
        "options": {},
        "operation": "completion",
        "completionTitle": "Terminate Workflow Execution!",
        "completionMessage": "=<a href='{{ $json.Link_to_new_version }}'>Go to new version</a>\n<br>\n<a href='{{ $json.Link_to_previous_version }}'>Go to previous version</a>"
      },
      "typeVersion": 2.3
    },
    {
      "id": "55880d85-0acc-49ca-9b17-f58639a3fc62",
      "name": "Set Target Workflow Id",
      "type": "n8n-nodes-base.set",
      "position": [
        3296,
        -1568
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "c6058f80-386c-4f10-aa27-a71c43124a64",
              "name": "workflow_id",
              "type": "string",
              "value": "={{ $json.id }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "80666d64-a7ad-42ce-975e-55edc66e0088",
      "name": "LLM Flow Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3216,
        -1696
      ],
      "parameters": {
        "color": 7,
        "width": 944,
        "height": 304,
        "content": "## Get & Prepare Workflow\nGet target workflow JSON, extract nodes and connections, prepare clean structure for processing."
      },
      "typeVersion": 1
    },
    {
      "id": "c6e24481-be32-49bb-9ed7-7b2610ba47eb",
      "name": "Post Processing Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2112,
        -1376
      ],
      "parameters": {
        "color": 7,
        "width": 528,
        "height": 480,
        "content": "## AI Rename Generation\nSend workflow to the AI, generate rename mapping for every node, parse structured JSON output."
      },
      "typeVersion": 1
    },
    {
      "id": "aaac1e61-1971-4a51-af91-1361bbeeebc6",
      "name": "Select a Workflow",
      "type": "n8n-nodes-base.n8n",
      "position": [
        3040,
        -1888
      ],
      "parameters": {
        "operation": "get",
        "workflowId": {
          "__rl": true,
          "mode": "list",
          "value": "MImEVkDXF7TQkggJ",
          "cachedResultName": "Auto Rename n8n Workflow Nodes with AI (#MImEVkDXF7TQkggJ)"
        },
        "requestOptions": {}
      },
      "credentials": {
        "n8nApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "62f4b399-d1dd-4e45-afd1-d15c13559187",
      "name": "Triggers Section Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2112,
        -1696
      ],
      "parameters": {
        "color": 7,
        "width": 1088,
        "height": 304,
        "content": "## Form Trigger\nLaunch a form where you can select from a dropdown of all available workflows."
      },
      "typeVersion": 1
    },
    {
      "id": "7ddb750f-98ab-4ec0-8591-1c37bf74a1f7",
      "name": "Post Processing Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2656,
        -1376
      ],
      "parameters": {
        "color": 7,
        "width": 624,
        "height": 480,
        "content": "## Validate & Apply Renames\nVerify all nodes are covered, update node names in nodes array, connections object, and parameter references."
      },
      "typeVersion": 1
    },
    {
      "id": "25bfed4f-2dff-47cf-919d-ce7ff30c7c82",
      "name": "Post Processing Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3296,
        -1376
      ],
      "parameters": {
        "color": 7,
        "width": 864,
        "height": 480,
        "content": "## Save & Display Results\nPublish updated workflow version, generate history links, show completion form or end execution."
      },
      "typeVersion": 1
    },
    {
      "id": "5b73f213-2953-4a7e-84e5-07b63d342b41",
      "name": "Triggers Section Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3504,
        -2000
      ],
      "parameters": {
        "color": 4,
        "width": 656,
        "height": 288,
        "content": "## Mohamed Anan\n![Anan](https://1.gravatar.com/avatar/2c212891367a29a481ce306de2a3c936abab9dd120e11aae24782b47f5d856bd?size=64)\nA curious EnGiNeEr who enjoys `SoLviNg` PrObLeMs..\n___\n- [x] [Top Supporter](https://community.n8n.io/u/mohamed3nan/badges) in the [n8n community](https://community.n8n.io/u/mohamed3nan/summary) with **200+ hours** of contribution and **+200 solutions** provided, ranked **12th** on the [all-time leaderboard](https://community.n8n.io/leaderboard/1#:~:text=12-,mohamed3nan,-4%2C078).\n\n___\n\u26a1[n8n Workflows](https://n8n.io/creators/mohamed3nan/)\n\ud83d\udcbc[LinkedIn](https://link.anan.dev/Linkedin)"
      },
      "typeVersion": 1
    },
    {
      "id": "8186aadb-a749-4352-98b4-19eabe9c6b52",
      "name": "Triggers Section Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2112,
        -2000
      ],
      "parameters": {
        "color": 7,
        "width": 1376,
        "height": 288,
        "content": "## Manual Trigger\nSelect workflow directly from the n8n node, then execute manually for quick testing."
      },
      "typeVersion": 1
    },
    {
      "id": "dbf1280b-a216-445a-9fae-495cc142fbeb",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2992,
        -1936
      ],
      "parameters": {
        "color": 3,
        "width": 192,
        "height": 208,
        "content": "### Select a workflow"
      },
      "typeVersion": 1
    },
    {
      "id": "f3a7b4d9-161d-425c-9bc8-af2d67c76c27",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3008,
        -1040
      ],
      "parameters": {
        "color": 3,
        "width": 192,
        "height": 112,
        "content": "### Stop workflow\nYou can modify the error handling to retry or loop back to the AI node."
      },
      "typeVersion": 1
    },
    {
      "id": "363007bf-06eb-48e5-8447-a50cd4c854a1",
      "name": "Post Processing Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1264,
        -2000
      ],
      "parameters": {
        "width": 832,
        "height": 1104,
        "content": "## \u26a1Auto Rename n8n Workflow Nodes with AI\u2728\nThis workflow uses AI to automatically generate clear and descriptive names for every node in your n8n workflows.\nIt analyzes each node's type, parameters, and connections to create meaningful names, making your workflows instantly readable.\n\n### Who is it for?\nThis workflow is for n8n users who manage complex workflows with dozens of nodes. If you've ever:\n- Built workflows full of generic names like `HTTP Request 2` or `Edit Fields 1`\n- Struggled to understand your own work after a few weeks\n- Copied workflows from others with unclear node names\n- Spent hours manually renaming nodes one by one\n\n...then this workflow will save you significant time and effort.\n\n### Requirements\n- **n8n API Credentials**: Must be configured to allow listing and updating workflows\n- **AI Provider Credentials**: An API key for your preferred AI provider (OpenRouter is used currently)\n\n### How it works\n1. **Trigger**: Launch via form (select from dropdown) or manual trigger (quick testing with pre-selected workflow)\n2. **Fetch**: Retrieve the target workflow's JSON and extract nodes and connections\n3. **Generate**: Send the workflow JSON to the AI, which creates a unique, descriptive name for every node\n4. **Validate**: Verify the AI mapping covers all original node names\n5. **Apply**: If valid, update all node names, parameter references, and connections throughout the workflow\n6. **Save**: Save/Update the workflow with renamed nodes and provide links to both new and previous versions\n\n\nIf validation fails (e.g., AI missed nodes), the workflow stops with an error. You can modify the error handling to retry or loop back to the AI node.\n\n###  Setup\n1. **Connect n8n API credentials**\n   - Open any n8n node in the workflow and make sure your n8n API credentials is connected\n\n2. **Configure AI provider credentials**\n   - Open the \"OpenRouter\" node (or replace with your preferred AI)\n   - Add your API credentials\n   - Adjust the model if needed (current: `openai/gpt-5.1-codex-mini`)\n\n3. **Test the workflow**\n   - Use Manual Trigger for quick testing with a pre-selected workflow\n   - Use Form Trigger for a user-friendly interface with workflow selection\n\n###  Important notice\n**If you're renaming a currently opened workflow**, you must **reload the page** after execution to see the latest version, n8n doesn't automatically refresh the canvas when workflow versions are updated via API."
      },
      "typeVersion": 1
    },
    {
      "id": "37d5ac74-40db-41ca-8d3c-fec7a6436d90",
      "name": "Stop",
      "type": "n8n-nodes-base.stopAndError",
      "position": [
        2896,
        -1040
      ],
      "parameters": {
        "errorMessage": "Validation Error"
      },
      "typeVersion": 1
    },
    {
      "id": "dc55d2ce-fe63-49ff-b386-9693618c715b",
      "name": "Fetch Target Workflow JSON",
      "type": "n8n-nodes-base.n8n",
      "position": [
        3520,
        -1568
      ],
      "parameters": {
        "operation": "get",
        "workflowId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.workflow_id }}"
        },
        "requestOptions": {}
      },
      "credentials": {
        "n8nApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "17893598-d830-4327-a5a8-da039497d85f",
      "name": "Aggregate Workflow List",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        2624,
        -1568
      ],
      "parameters": {
        "include": "specifiedFields",
        "options": {},
        "aggregate": "aggregateAllItemData",
        "fieldsToInclude": "id,name",
        "destinationFieldName": "workflows"
      },
      "typeVersion": 1
    },
    {
      "id": "aa5a4b04-6a0c-4e30-8778-93867d673bb3",
      "name": "Form Dynamic Workflow List",
      "type": "n8n-nodes-base.form",
      "position": [
        2848,
        -1568
      ],
      "parameters": {
        "options": {},
        "defineForm": "json",
        "jsonOutput": "={{\n  [\n    {\n      \"fieldLabel\": \"Select a Workflow:\",\n      \"fieldType\": \"dropdown\",\n      \"fieldOptions\": {\n        \"values\": $json.workflows.map(option => ({ option: `${option.name} (#${option.id})` })),\n      },\n      \"requiredField\": true\n    }\n  ]\n}}",
        "limitWaitTime": true
      },
      "typeVersion": 2.3
    },
    {
      "id": "853e6e01-3621-4158-8d25-e6428de9608c",
      "name": "OpenRouter Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        2144,
        -1040
      ],
      "parameters": {
        "model": "openai/gpt-5.1-codex-mini",
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "6b5f97cd-182e-4ff9-ace8-47aacde6bd23",
      "name": "Fetch All Workflows",
      "type": "n8n-nodes-base.n8n",
      "position": [
        2400,
        -1568
      ],
      "parameters": {
        "filters": {},
        "requestOptions": {}
      },
      "credentials": {
        "n8nApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "0330fafd-9637-491d-8841-662bcb8457e4",
      "name": "Form Trigger",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        2176,
        -1568
      ],
      "parameters": {
        "options": {
          "buttonLabel": "Select a Workflow"
        },
        "formTitle": "\u26a1Auto Rename n8n Workflow Nodes with AI\u2728",
        "formDescription": "This workflow uses AI to automatically generate clear and descriptive names for every node in your n8n workflows.\nIt analyzes each node's type, parameters, and connections to create meaningful names, making your workflows instantly readable."
      },
      "typeVersion": 2.3
    },
    {
      "id": "4c49d752-3179-46b2-899b-55f8c4a7c5c2",
      "name": "Manual Trigger",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        2176,
        -1888
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "ec4dd2d0-8b33-4265-a8bb-267bd999893a",
      "name": "Done",
      "type": "n8n-nodes-base.set",
      "position": [
        3968,
        -1104
      ],
      "parameters": {
        "options": {},
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    }
  ],
  "connections": {
    "Form Trigger": {
      "main": [
        [
          {
            "node": "Fetch All Workflows",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Manual Trigger": {
      "main": [
        [
          {
            "node": "Select a Workflow",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Select a Workflow": {
      "main": [
        [
          {
            "node": "Set Target Workflow Id",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch All Workflows": {
      "main": [
        [
          {
            "node": "Aggregate Workflow List",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Generate Node Rename Mapping",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Set Target Workflow Id": {
      "main": [
        [
          {
            "node": "Fetch Target Workflow JSON",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate Workflow List": {
      "main": [
        [
          {
            "node": "Form Dynamic Workflow List",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse LLM Mapping ToJson": {
      "ai_outputParser": [
        [
          {
            "node": "Generate Node Rename Mapping",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Check Trigger Source Type": {
      "main": [
        [
          {
            "node": "Display Workflow Version Links",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Done",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Target Workflow JSON": {
      "main": [
        [
          {
            "node": "Extract Workflow Nodes Connections",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Form Dynamic Workflow List": {
      "main": [
        [
          {
            "node": "Parse Selected Workflow Id",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Selected Workflow Id": {
      "main": [
        [
          {
            "node": "Set Target Workflow Id",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validate All Nodes Renamed": {
      "main": [
        [
          {
            "node": "Apply Renamed Nodes Connections",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Stop",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare LLM Validation Data": {
      "main": [
        [
          {
            "node": "Validate All Nodes Renamed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Assemble New Workflow Object": {
      "main": [
        [
          {
            "node": "Save Renamed Workflow Version",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Workflow Version Links": {
      "main": [
        [
          {
            "node": "Check Trigger Source Type",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Node Rename Mapping": {
      "main": [
        [
          {
            "node": "Prepare LLM Validation Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Save Renamed Workflow Version": {
      "main": [
        [
          {
            "node": "Build Workflow Version Links",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Apply Renamed Nodes Connections": {
      "main": [
        [
          {
            "node": "Assemble New Workflow Object",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Workflow Nodes Connections": {
      "main": [
        [
          {
            "node": "Generate Node Rename Mapping",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

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

About this workflow

This workflow uses AI to automatically generate clear and descriptive names for every node in your n8n workflows. It analyzes each node's type, parameters, and connections to create meaningful names, making your workflows instantly readable.

Source: https://n8n.io/workflows/10889/ — original creator credit. Request a take-down →

More General workflows → · Browse all categories →

Related workflows

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

General

This workflow generates a Product Requirements Document (PRD) and test scenarios from structured form inputs. It uses OpenRouter LLMs (GPT/Claude) for natural language generation and APITemplate.io fo

OpenRouter Chat, Chain Llm, Form Trigger +2
General

Image to license plate number. Uses chainLlm, form, lmChatOpenRouter, formTrigger. Event-driven trigger; 5 nodes.

Chain Llm, Form, OpenRouter Chat +1
General

This is a simplistic demo workflow showing how to extract a license plate number from an image of a car submitted via a form – or in more general terms showcasing how you can: use a form trigger to up

Chain Llm, Form, OpenRouter Chat +1
General

YouTube Video Analyzer with AI. Uses manualTrigger, lmChatOpenAi, lmChatOpenRouter, lmChatDeepSeek. Event-driven trigger; 21 nodes.

OpenAI Chat, OpenRouter Chat, Lm Chat Deep Seek +4
General

HR-focused automation pipeline with AI. Uses formTrigger, extractFromFile, informationExtractor, chainSummarization. Event-driven trigger; 18 nodes.

Form Trigger, Information Extractor, Chain Summarization +5