Custom n8n node doesn't appear in local development environment

I’ve been working on developing a custom node for my n8n workflow automation setup. After completing the build process, I expected to see my new node available in the n8n interface running locally, but it’s nowhere to be found in the node list. I’ve double-checked my configuration files and the build seemed to complete without errors. Has anyone encountered this problem before? I’m not sure if I’m missing a registration step or if there’s an issue with my implementation. Any guidance would be really helpful.

import { INodeType, INodeTypeDescription } from 'n8n-workflow';

export class ChatBot implements INodeType {
    description: INodeTypeDescription = {
        displayName: 'ChatBot Helper',
        name: 'chatBotHelper',
        icon: 'file:bot.svg',
        group: ['communication'],
        version: 1,
        description: 'Communicate with ChatBot service',
        defaults: {
            name: 'ChatBot Helper',
        },
        inputs: ['main'],
        outputs: ['main'],
        credentials: [
            {
                name: 'chatBotCredentials',
                required: true,
            }
        ],
        requestDefaults: {
            baseURL: 'SERVICE_URL',
            headers: {
                // custom headers
            }
        },
        properties: [
        {
            displayName: 'Query Text',
            name: 'queryText',
            type: 'string',
            placeholder: 'Type your query here',
            required: true,
            description: 'Input text for processing',
            routing: {
                request: {
                    method: 'POST',
                    url: 'ENDPOINT_URL'
                },
            },
            default: 'process',
        }, 
        ]
    };
}

Here’s my chatbot.node.ts implementation.

{
    "node": "n8n-nodes-custom.ChatBot",
    "nodeVersion": "1.0",
    "codexVersion": "1.0",
    "categories": ["Communication"],
    "resources": {
        "credentialDocumentation": [],
        "primaryDocumentation": []
    }
}

This is my chatbot.node.json configuration.

import {
    IAuthenticateGeneric,
    ICredentialType,
    INodeProperties,
} from 'n8n-workflow';

export class ChatBotCredentials implements ICredentialType {
    name = 'ChatBotCredentials';
    displayName = 'ChatBot API Access';
    documentationUrl = 'https://example.com/api-docs';
    properties: INodeProperties[] = [
        {
            displayName: 'Access Token',
            name: 'accessToken',
            type: 'string',
            default: '',
        },
    ];
    authenticate = {
        type: 'generic',
        properties: {
            headers: {
                'Authorization': 'Bearer ={{$credentials.accessToken}}'
            }
        },
    } as IAuthenticateGeneric;
}

And here’s my chatbot.credentials.ts file setup.

did u restart n8n after the build? I ran into the same problem, and it turned out the local server needed a full restart 2 recognize new nodes. Also, make sure your package.json has correct entry points for node discovery.

Check your package.json main entry and n8n config - this screwed me over for hours when I started building custom nodes. The n8n field has to point to your compiled JS files, not the TypeScript sources. Like this: “n8n”: { “nodes”: [“dist/nodes/ChatBot/ChatBot.node.js”], “credentials”: [“dist/credentials/ChatBotCredentials.credentials.js”] }. Make sure your tsconfig.json outputs to the right dist directory too. Your node class name needs to match the file name exactly - you’ve got ChatBot class so keep that consistent everywhere. Run npm run build again and double-check the dist folder actually has your compiled files before restarting n8n.

Your file naming might be the issue. I had the same problem - my custom node wouldn’t show up even though everything looked right. Turns out n8n is picky about naming patterns. Make sure your files are named exactly ChatBot.node.ts and ChatBotCredentials.credentials.ts - capitalization matters. Also check that your package.json has the n8n field with a nodes array pointing to your compiled files. Last thing - verify your node files are actually compiling to the right directory that n8n scans. Sometimes TypeScript dumps files in weird places.