Nodes/ComfyUI-Beyond_nodes/🦾 Compositor V3
ComfyUI Node

🦾 Compositor V3

The canvas you always wanted inside ComfyUI

By beyondprompting·Created 9 months ago·Updated 7 months ago· 0
🦾 Compositor V3
  • config
  • extendedConfig
  • transforms
  • image
  • layer_outputs
fabricData{}
imageNamenew.png
toolstrue

Compositor V3 is the node that made this pack worth installing: an actual interactive canvas inside ComfyUI where you drag, scale, rotate, flip, and layer up to eight images before they ever touch a sampler. Instead of guessing pixel coordinates, you place a subject where you want it, hit continue, and the graph renders your scene.

The community use case that keeps coming up is "put this person into that scene." A classic r/comfyui answer to "how do I insert faces into a specific scene?" is literally: use the Compositor node, cut your subjects out first, place them, then run the composite through an img2img pass to blend. That's the workflow this node exists for. It's the Photoshop-lite layer you can't get from the core node set.

How it works

V3 is the classic-API compositor. You feed it a config object (from the pack's Compositor Config V3 node, which holds your up-to-eight images, canvas size, and settings), and it opens a browser-side canvas. On first run the node stops execution - ExecutionBlocker - until you've arranged your layers; the green border shows the export area, and moving your mouse out of the canvas auto-saves with an orange flash. Your transforms (position, scale, rotation, z-order) are remembered and reapplied on later runs, so swapping an image in doesn't reset your layout.

The state lives in fabricData (a JSON string of the layout) and imageName (the saved snapshot file). Out the other side you get three things: transforms (a JSON string describing every layer's position/size/angle - feed it to the pack's transforms-output node to get raw numbers), image (the flattened composite, ready to wire to a sampler or img2img), and layer_outputs, which unpacks the individual layers for the masks-output companion node.

The inputs that matter

  • config (required) - the COMPOSITOR_CONFIG from Compositor Config V3. There's no point wiring this node without it.
  • fabricData / imageName (required) - auto-managed state. Leave them alone until you're comfortable.
  • tools (optional, default true) - toggles the toolbar helpers.
  • extendedConfig (optional) - the config node's second output, for advanced setups.

Outputs: transforms (STRING), image (IMAGE), layer_outputs (COMPOSITOR_OUTPUT_MASKS).

Install

Part of ComfyUI-Beyond_nodes. ComfyUI Manager → search "Beyond_nodes" → install → restart. Manual:

cd ComfyUI/custom_nodes
git clone https://github.com/beyondprompting/ComfyUI-Beyond_nodes

Restart. Note the README's clone instructions still point at the old erosDiffusion URL - use the one above. No pip requirements; the heavy lifting is in the browser (fabric.js ships with the pack).

Common issues

  • Nothing shows until you run once. The canvas needs a first execution to load your images. Run the workflow once, then compose.
  • The flow stops and won't continue. That's by design - it's waiting for you to finish arranging and mouse-out to save. If it loops forever, check the onConfigChangedContinue setting in the config node; and be careful with random seeds upstream of the node, because stopping and re-enqueueing will re-roll them.
  • Big canvases get slow. The README's own warning: don't drop eight 4K images into a 4K canvas. Keep the buffer zone reasonable.
  • Missing images after reload. Save placement uses stable filenames based on the config node; if the input folder the config writes to is temp, it won't persist across restarts.

V3 is the battle-tested version. V4 exists and is prettier, but V3 is where the polish accumulated first - and it's still what most sample workflows use.

Categoryimage

Inputs (5)

NameTypeDefaultDescription
configCOMPOSITOR_CONFIG
fabricDataSTRING{}
imageNameSTRINGnew.png
toolsoptBOOLEANtrue
extendedConfigoptCOMPOSITOR_CONFIG

Outputs (3)

NameTypeDescription
transformsSTRING
imageIMAGE
layer_outputsCOMPOSITOR_OUTPUT_MASKS