ComfyUI Node

VNCCS UniCanvas

InvokeAI's infinite canvas, ported into a ComfyUI node

By AHEKOT·Created 10 months ago·Updated a day ago· 1,010
VNCCS UniCanvas
    • image
    unicanvas_state{}

    ComfyUI has a structural quirk: it's a graph, and graphs aren't canvases. Every generation is a fixed rectangle until you start stitching. VNCCS UniCanvas is a direct answer to that - an infinite-canvas image-generation and editing workspace that lives inside one node, and the author is upfront about what it is: a careful port of InvokeAI's core workflow to ComfyUI. Generate anywhere on an endless canvas, edit any region, build a composition across layers, and keep going without ever being locked to a single frame.

    If you've used InvokeAI's canvas you already know whether you want this. If you haven't: it's the difference between "crop, inpaint, paste, pray" and actually composing like you would in Photoshop - except the brush fills with a diffusion model.

    How it works

    UniCanvas is a frontend-first node. The visible work happens in the widget: an infinite canvas with raster and mask layers, visibility/opacity/selection controls, paint brushes, and SAM-powered object selection (point at a thing, get its mask). You select a region as the generation target, hit generate, and the node runs the generation on its own backend endpoint - deliberately without queueing the whole ComfyUI graph. Results come back as editable layers on the canvas, so you can move, transform, resize, snap, and undo/redo without leaving the node.

    The generation side supports several backends via presets: SDXL (via a checkpoint loader), Anima and Flux Klein (via a diffusion-model loader), Qwen-Image-Edit for instruction edits, and Z-Image Turbo. There are Turbo LoRA cards and a general LoRA stack right in the generation panel. Non-edit backends use native inpaint conditioning for masked regions; the Qwen module follows the Qwen-Image-Edit path.

    The node's socket interface is deliberately bare: a unicanvas_state input (the state JSON the widget owns) and one image output. The output is a render of the current canvas state - export what you've composed by reading that output into a SaveImage, or export a PSD with full layer support from the UI.

    Why you'd reach for it

    Three jobs it's genuinely good at:

    • Outpainting without the dance. Stretch the canvas, select the empty area, generate. No latent re-sizing tricks, no seam management.
    • Composites. Move separate subjects around as layers, mask them, blend them - instead of seven nodes of masking glue.
    • Iterative refinement in place. Keep a reference region visible while you regenerate a target region, which is the flow that keeps compositions consistent.

    Installing it

    cd ComfyUI/custom_nodes
    git clone https://github.com/AHEKOT/ComfyUI_VNCCS_Utils.git
    cd ComfyUI_VNCCS_Utils
    pip install -r requirements.txt
    

    or search VNCCS Utils in ComfyUI Manager and restart. Note the pack's requirements are heavy (transformers, pytorch-lightning, kornia, av, roma) - give it a real install time. Then load a supported model in the node's generation panel; the presets expect the model files in the usual ComfyUI model folders.

    Honest notes

    UniCanvas is ambitious and the community reaction was warm - the release thread got praise like "this works so well, the sky's the limit." But set expectations: it's a big interactive widget, so expect a browser-side footprint, and the generation happens inside the node rather than through the graph, which is a different mental model than standard ComfyUI. It's also got an appetite for VRAM because you're loading a full generation backend (or several) to serve the canvas. And as one commenter noted, the author bundles big updates as plain git commits rather than tagged releases, so if you want clean change history, watch the repo - that's a fair complaint to have about an otherwise excellent tool.

    CategoryVNCCS/canvas

    Inputs (1)

    NameTypeDefaultDescription
    unicanvas_stateSTRING{}

    Outputs (1)

    NameTypeDescription
    imageIMAGE