Krita Canvas
The input bridge from your Krita canvas into ComfyUI
- image
- width
- height
- seed
- mask
First thing to know if you landed here confused: this node isn't really meant to be wired up by hand in a normal ComfyUI graph. It's an integration node. ETN_KritaCanvas is the entry point that feeds your live Krita canvas - the pixels, the dimensions, the active selection - into a ComfyUI workflow, and it's designed to be driven by Acly's Krita AI Diffusion plugin, not clicked together in the editor.
Context helps here. Acly wrote the ComfyUI Nodes for External Tooling pack specifically so ComfyUI can act as a headless backend for other apps, and the flagship app is his own Krita AI Diffusion plugin - one of the most-used ways to run Stable Diffusion for people who paint, because it lives inside an application they already have open. This node is where the plugin hands the canvas to ComfyUI at the start of a generation.
How it works
It has no inputs and no settings, which is the tell that something external fills it in. When the Krita plugin submits a workflow, it injects the current canvas image, its width and height, a seed, and the current selection mask into this node's outputs. The rest of your graph then treats those exactly like any other image/mask/int sources. In a bare ComfyUI session with no plugin driving it, this node has nothing to give - it's a placeholder the external tool populates at runtime.
So the mental model is: ETN_KritaCanvas is the "read from Krita" node. Everything downstream - samplers, inpaint nodes, upscalers - is a normal ComfyUI workflow. The Krita side of the plugin is what makes this node produce real data.
The inputs and outputs that matter
No inputs. Five outputs, and you'll use whichever your workflow needs:
image(IMAGE) - the current canvas content. Feed it into VAE Encode for img2img, or a preprocessor.width/height(INT) - the canvas dimensions, so your latent and sizing follow the canvas instead of being hardcoded.seed(INT) - a seed supplied by the plugin, so the plugin controls reproducibility. Wire it into your sampler's seed.mask(MASK) - the active selection as a mask, for inpainting or region-limited generation. Straight into Set Latent Noise Mask.
How to install it
The node ships in the tooling-nodes pack. ComfyUI Manager: search ComfyUI Nodes for External Tooling, install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/Acly/comfyui-tooling-nodes.git
then restart. But note: to actually use this node the way it's meant to be used, you install the Krita AI Diffusion plugin on the Krita side, which connects to your ComfyUI server and drives these nodes for you.
Common issues & troubleshooting
The outputs are empty when I run it in ComfyUI directly. Expected. This node is populated by the Krita plugin at submission time; run standalone, it has no canvas to read. If you want to test the graph without Krita, temporarily swap in a Load Image node.
Do I build this graph myself? Usually not. The Krita plugin generates and manages the workflows that contain these Krita nodes. You'd only hand-edit one if you're doing custom workflow authoring for the plugin - which is an advanced path, not the default experience.
The mask is empty. That output carries the current selection. No selection in Krita means no mask. Make a selection in Krita first, or feed a mask from elsewhere if you want full-image generation with a mask.
Inputs (0)
No inputs
Outputs (5)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| width | INT | — |
| height | INT | — |
| seed | INT | — |
| mask | MASK | — |