Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
b13d788
feat: add Custom Node Manager for installing and managing node packs …
Pfannkuchensack Apr 12, 2026
2e8e7c1
Chore typegen
Pfannkuchensack Apr 13, 2026
865cdae
Chore Typegen without Node
Pfannkuchensack Apr 13, 2026
e477b08
Merge branch 'main' into feature/custom-node-manager
Pfannkuchensack Apr 14, 2026
acaec2e
Merge branch 'main' into feature/custom-node-manager
JPPhoto Apr 14, 2026
0af0747
feat(custom-nodes): detect deps instead of auto-installing
Pfannkuchensack Apr 16, 2026
79a4405
Chore ruff
Pfannkuchensack Apr 16, 2026
4e18502
custom nodes: require admin auth, share imported workflows, and local…
Pfannkuchensack Apr 16, 2026
b70008a
test(custom_nodes): update _import_workflows_from_pack tests for owne…
Pfannkuchensack Apr 16, 2026
ef316d3
custom nodes: track imported workflows via manifest and harden pack l…
Pfannkuchensack Apr 16, 2026
407658a
Chore typegen
Pfannkuchensack Apr 16, 2026
9af1fcf
ui: hide Custom Nodes tab for non-admin users in multiuser mode
Pfannkuchensack Apr 16, 2026
024f39e
Merge branch 'main' into feature/custom-node-manager
Pfannkuchensack Apr 17, 2026
e4dcfc9
Merge branch 'main' into feature/custom-node-manager
JPPhoto Apr 17, 2026
15596cc
ui: guard Custom Nodes tab content for non-admin persisted state and …
Pfannkuchensack Apr 17, 2026
d03813d
Merge branch 'feature/custom-node-manager' of https://github.com/Pfan…
Pfannkuchensack Apr 17, 2026
2e7fe83
test: add shared helper for custom-nodes gate + admin happy-path tests
Pfannkuchensack Apr 17, 2026
51be4d8
Merge branch 'main' into feature/custom-node-manager
JPPhoto Apr 18, 2026
ea7db3b
fix(custom-nodes): return optimistic default while setup status loads
Pfannkuchensack Apr 18, 2026
5d92bf4
Merge branch 'feature/custom-node-manager' of https://github.com/Pfan…
Pfannkuchensack Apr 18, 2026
7f5c44d
Merge branch 'main' into feature/custom-node-manager
Pfannkuchensack Apr 18, 2026
67d3d2c
ui: split custom nodes permission into isKnown/isAllowed to close loa…
Pfannkuchensack Apr 18, 2026
329142e
Merge branch 'main' into feature/custom-node-manager
Pfannkuchensack Apr 19, 2026
c60229d
Merge branch 'main' into feature/custom-node-manager
Pfannkuchensack Apr 19, 2026
97fb98d
refactor(custom-nodes): extract permission derivation into shared helper
Pfannkuchensack Apr 19, 2026
659bdad
Chore Knit fix
Pfannkuchensack Apr 19, 2026
47a34c5
fix(custom-nodes): purge full module subtree on uninstall
Pfannkuchensack Apr 19, 2026
dabc709
fix(custom-nodes): purge full module subtree on uninstall
Pfannkuchensack Apr 19, 2026
b9faaec
Merge branch 'main' into feature/custom-node-manager
Pfannkuchensack Apr 20, 2026
187b93a
Merge branch 'main' into feature/custom-node-manager
Pfannkuchensack Apr 20, 2026
93e68ba
Merge branch 'main' into feature/custom-node-manager
JPPhoto Apr 20, 2026
70f1ccc
Merge branch 'main' into feature/custom-node-manager
Pfannkuchensack Apr 21, 2026
2de26c2
Merge branch 'main' into feature/custom-node-manager
Pfannkuchensack Apr 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
154 changes: 154 additions & 0 deletions docs/nodes/creatingNodePack.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
# Creating a Node Pack for the Custom Node Manager

This guide explains how to structure your Git repository so it can be installed via InvokeAI's Custom Node Manager.

## Repository Structure

Your repository **is** the node pack. When a user installs it, the entire repo is cloned into the `nodes` directory.

### Minimum Required Structure

```
my-node-pack/
├── __init__.py # Required: imports your node classes
├── my_node.py # Your node implementation(s)
└── README.md # Recommended: describe your nodes
```

The `__init__.py` at the root is **mandatory**. Without it, the pack will not be loaded.

### Recommended Structure

```
my-node-pack/
├── __init__.py # Imports all node classes
├── requirements.txt # Python dependencies (user-installed)
├── README.md # Description, usage, examples
├── node_one.py # Node implementation
├── node_two.py # Node implementation
├── utils.py # Shared utilities
└── workflows/ # Optional: workflow files
├── example_workflow.json
└── advanced_workflow.json
```

## The `__init__.py` File

This file must import all invocation classes you want to register. Only classes imported here will be available in InvokeAI.

```python
from .node_one import MyFirstInvocation
from .node_two import MySecondInvocation
```

If you have nodes in subdirectories:

```python
from .nodes.image_tools import CropInvocation, ResizeInvocation
from .nodes.text_tools import ConcatInvocation
```

## Dependencies (`requirements.txt` or `pyproject.toml`)

If your nodes require additional Python packages, list them in a `requirements.txt` (or `pyproject.toml`) at the repository root:

```
numpy>=1.24
opencv-python>=4.8
```

The Custom Node Manager **does not** install these dependencies automatically — auto-installing into the running InvokeAI environment risks pulling in incompatible versions and breaking the application. After install, the UI shows the user a toast telling them that manual installation is required, and your README should document the exact install command (e.g. `pip install -r requirements.txt` from inside an activated InvokeAI environment).

**Important:** Avoid pinning versions too tightly. InvokeAI has its own dependencies, and version conflicts can cause issues. Use minimum version constraints (`>=`) where possible.

## Including Workflows

If your repository contains workflow `.json` files, they will be **automatically imported** into the user's workflow library during installation.

### Workflow Detection

The installer recursively scans your repository for `.json` files. A file is recognized as a workflow if it contains both `nodes` and `edges` keys at the top level.

### Tagging

Imported workflows are automatically tagged with `node-pack:<your-repo-name>` so users can filter for them in the workflow library. When the node pack is uninstalled, these workflows are also removed.

### Workflow Format

Workflows should follow the standard InvokeAI workflow format:

```json
{
"name": "My Example Workflow",
"author": "Your Name",
"description": "Demonstrates how to use MyFirstInvocation",
"version": "1.0.0",
"contact": "",
"tags": "example, my-node-pack",
"notes": "",
"meta": {
"version": "3.0.0",
"category": "user"
},
"exposedFields": [],
"nodes": [...],
"edges": [...]
}
```

**Tip:** The easiest way to create a workflow file is to build the workflow in InvokeAI's workflow editor, then export it via **Save As** and copy the `.json` file into your repository.

## Node Implementation

Each node is a Python class decorated with `@invocation()`. Here's a minimal example:

```python
from invokeai.app.invocations.baseinvocation import BaseInvocation, invocation
from invokeai.app.invocations.fields import InputField, OutputField
from invokeai.invocation_api import BaseInvocationOutput, invocation_output


@invocation_output("my_output")
class MyOutput(BaseInvocationOutput):
result: str = OutputField(description="The result")


@invocation(
"my_node",
title="My Node",
tags=["example", "custom"],
category="custom",
version="1.0.0",
)
class MyInvocation(BaseInvocation):
"""Does something useful."""

input_text: str = InputField(default="", description="Input text")

def invoke(self, context) -> MyOutput:
return MyOutput(result=f"Processed: {self.input_text}")
```

For full details on the invocation API, see the [Invocation API documentation](invocation-api.md).

## Best Practices

- **Use a descriptive repository name** — it becomes the pack name shown in the UI
- **Include a README.md** with description, screenshots, and usage instructions
- **Version your nodes** using semver in the `@invocation()` decorator
- **Don't include large binary files** in your repository (models, weights, etc.)
- **Test your nodes** by placing the repo in the `nodes` directory before publishing
- **Include example workflows** so users can get started quickly
- **Tag your GitHub repository** with `invokeai-node` for discoverability
- **Avoid name collisions** — choose unique invocation type strings (e.g. `my_pack_resize` instead of just `resize`)

## Testing Your Pack

Before publishing, verify your pack works with the Custom Node Manager:

1. Create a Git repository with your node pack
2. Push it to GitHub (or any Git host)
3. In InvokeAI, go to the Nodes tab and install it via the Git URL
4. Verify your nodes appear in the workflow editor
5. Verify any included workflows are imported
6. Test uninstalling — nodes and workflows should be removed
78 changes: 78 additions & 0 deletions docs/nodes/customNodeManager.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# Custom Node Manager

The Custom Node Manager allows you to install, manage, and remove community node packs directly from the InvokeAI UI — no manual file copying required.

## Accessing the Node Manager

Click the **Nodes** tab (circuit icon) in the left sidebar, between Models and Queue.

## Installing a Node Pack

1. Navigate to the **Nodes** tab
2. On the right panel, select the **Git Repository URL** tab
3. Paste the Git URL of the node pack (e.g. `https://github.com/user/my-node-pack.git`)
4. Click **Install**

The installer will:

- Clone the repository into your `nodes` directory
- Load the nodes immediately — no restart needed
- Import any workflow `.json` files found in the repository into your workflow library (tagged with `node-pack:<name>` for easy filtering)

The install progress and results are shown in the **Install Log** at the bottom of the panel.

### Installing Python Dependencies

The installer does **not** automatically run `pip install` for `requirements.txt` or `pyproject.toml`. Auto-installing dependencies into the running InvokeAI environment can pull in incompatible package versions and break the application.

If a node pack ships a `requirements.txt` or `pyproject.toml`, you'll see a warning toast after installation. Install the dependencies yourself by following the instructions in the node pack's documentation (typically `pip install -r requirements.txt` from inside an activated InvokeAI environment, but check the pack's README first). After installing, click the **Reload** button so the new dependencies take effect.

### Security Warning

Custom nodes execute arbitrary Python code on your system. **Only install node packs from authors you trust.** Malicious nodes could harm your system or compromise your data.

## Managing Installed Nodes

The left panel shows all installed node packs with:

- **Pack name**
- **Number of nodes** provided
- **Individual node types** as badges
- **File path** on disk

### Reloading Nodes

Click the **Reload** button to re-scan the nodes directory. This picks up any node packs that were manually added to the directory without using the installer.

### Uninstalling a Node Pack

Click the **Uninstall** button on any node pack. This will:

- Remove the node pack directory
- Unregister the nodes from the system immediately
- Remove any workflows that were imported from the pack
- Update the workflow editor so the nodes are no longer available

No restart is required.

## Scan Folder Tab

The **Scan Folder** tab shows the location of your nodes directory. Node packs placed there manually (e.g. via `git clone`) are automatically detected at startup. Use the **Reload** button to detect newly added packs without restarting.

## Troubleshooting

### Node pack fails to install

- Verify the Git URL is correct and accessible
- Check that the repository contains an `__init__.py` file at the top level
- Review the Install Log for error details

### Nodes don't appear after install

- Click the **Reload** button
- Check that the node pack's `__init__.py` imports its node classes
- Check the server console for error messages

### Workflows show errors after uninstalling

If you have user-created workflows that reference nodes from an uninstalled pack, those workflows will show errors for the missing node types. Reinstall the pack or remove the affected nodes from the workflow.
Loading
Loading