Node file structure#
Following best practices and standards in your node structure makes your node easier to maintain. It's helpful if other people need to work with the code.
The file and directory structure of your node is affected by:
- Your node's complexity.
- Whether you use node versioning.
- How many nodes you include in the npm package.
Required files and directories#
Your node must include:
- A
package.json
file at the root of the project. This is required for any npm module. - A
nodes
directory, containing the code for your node:- This directory must contain the base file, in the format
<node-name>.node.ts
. For example,MyNode.node.ts
. - n8n recommends including a codex file, containing metadata for your node. The codex filename must match the node base filename. For example, given a node base file named
MyNode.node.ts
, the codex name isMyNode.node.json
. - The
nodes
directory can contain other files and subdirectories, including directories for versions, and node code split across more than one file to create a modular structure.
- This directory must contain the base file, in the format
- A
credentials
directory, containing your credentials code. This code lives in a single credentials file. The filename format is<node-name>.credentials.ts
. For example,MyNode.credentials.ts
.
Modular structure#
You can choose whether to place all your node's functionality in one file, or split it out into a base file and other modules, which the base file then imports. Unless your node is very simple, it's a best practice to split it out.
A basic pattern is to separate out operations. Refer to the HttpBin starter node for an example of this.
For more complex nodes, n8n recommends the following structure:
actions
: directory with description and implementation of each possible resource and operation.- In the
actions
folder, n8n recommends usingresources
andoperations
as the names of the sub-folders. - For the implementation and description you can use separate files. Use
execute.ts
anddescription.ts
as filenames. This makes browsing through the code a lot easier. You can simplify this for nodes that have a less complicated structure.
- In the
methods
: an optional directory dynamic parameters' functions.transport
: a directory containing the communication implementation.
Versioning#
If your node has more than one version, and you're using full versioning, this makes the file structure more complex. You need a directory for each version, along with a base file that sets the default version. Refer to Node versioning for more information on working with versions, including types of versioning.
Decide how many nodes to include in a package#
There are two possible setups when building a node:
- One node in one npm package.
- More than one node in a single npm package.
n8n supports both approaches. If you include more than one node, each node should have its own directory in the nodes
directory.
A best-practice example for programmatic nodes: The Mattermost node#
n8n's built-in Mattermost node implements a modular structure and versioning, following recommended patterns.