Inpaint (full-pipe)
Two-pass inpainting with a full-pipe front door
- full_pipe
- mask
- image
- full_pipe
- image
Inpaint (full-pipe) is the pack's answer to "I need to fix this one region without touching the rest of the image." It does what the community still calls real inpainting - mask in, regenerate just the masked area - wrapped in a two-pass routine that is noticeably smarter than a single masked pass, and it plugs straight into a full-pipe workflow.
If you arrived here in 2026 wondering why you'd use a mask at all when Qwen-Edit and friends can edit from a sentence: the KB's inpainting essay makes the case better than I can. Edit models take the whole image into context and emit a whole new image, so unmasked regions come back close-but-not-identical, and the drift compounds across a chain of edits. Mask-based inpainting still owns bit-identical unmasked pixels and the denoise dial. That's what this node is for: leave everything else alone.
How the two passes work
The node is called "full-pipe" because its guts are shared with the plain InpaintNode; the pipe version just reads model, VAE, conditioning, and seed from the FULL_PIPE instead of asking for them separately.
- Pass 1 - coarse fill at 1MP. It downscales the image and mask to roughly a megapixel (rounded to multiples of 8), attaches the mask as a latent noise mask, and samples at full
inpaint_denoise(default 1.0). Small image, cheap-ish sample, gets the region filled. - Pass 2 - detail and blend at full resolution. The pass-1 result is upscaled back to the original resolution (optionally through an upscale model), composited onto the original image through the original mask, then re-sampled at low
detail_denoise(default 0.2) with a Gaussian-blurred mask (blur_radius, default 20) so the seams blend into the surroundings.
The two-pass structure is the whole point: you get a full-denoise reconstruction where it matters and a low-denoise blend everywhere the mask fringes out, instead of a hard-edged patch.
The inputs that matter
Required: full_pipe and a mask. Then two full sets of sampler controls - inpaint_sampler/scheduler/steps/cfg/denoise for pass 1, detail_... for pass 2 - plus upscale_model and blur_radius. The defaults (euler_ancestral_cfg_pp, karras, 20 steps, CFG 1.5) are sensible for SDXL-family; only tune if you know why.
inpaint_denoise(default 1.0) - how completely pass 1 rewrites the masked area. Lower it for img2img-style partial fills.detail_denoise(default 0.2) - the seam-blending pass. Too high and you'll regenerate beyond the mask; too low and you'll see the boundary.- Optional
imageinput overrides the pipe's image; otherwise it uses whatever image the pipe is carrying.
Outputs: the updated full_pipe (with the result stored as image) and the image itself, which is the one to wire into a Save or a preview.
Installing
Part of the mudknight utils pack. ComfyUI Manager → search comfyui-mudknight-utils, or:
cd ComfyUI/custom_nodes
git clone https://github.com/mudknight/comfyui-mudknight-utils
Restart. No model downloads for this node. It leans on core ComfyUI nodes (VAEEncode/Decode, SetLatentNoiseMask, ImageScale), so no Impact Pack required here.
Gotchas
- "No image provided and full_pipe has no image." - the pipe is empty of an image. Load one first with Load Image to Latent (full-pipe) or wire the optional
imageinput. - Seams visible - raise
detail_denoisea bit or bumpblur_radius; a 20px blur on a 2K image is conservative. - The mask semantics - the mask is the kept-or-replaced region depending on how you draw it; if it looks like you're inpainting the background instead of the subject, your mask is inverted relative to what you expect. This node does not flip masks for you.
It's a small pack with zero comfy.icu impressions, but if you're already on the full-pipe train this is the cleanest way to do masked edits without bolting a separate inpaint workflow onto the side.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| full_pipe | FULL_PIPE | — | |
| mask | MASK | — | |
| inpaint_sampler | COMBO | euler_ancestral_cfg_pp | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
| inpaint_scheduler | COMBO | karras | 10 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +4 |
| inpaint_steps | INT | 201–10000 | — |
| inpaint_cfg | FLOAT | 1.50–100 | — |
| inpaint_denoise | FLOAT | 1.000–1 | — |
| detail_sampler | COMBO | euler_ancestral_cfg_pp | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
| detail_scheduler | COMBO | karras | 10 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +4 |
| detail_steps | INT | 201–10000 | — |
| detail_cfg | FLOAT | 1.50–100 | — |
| detail_denoise | FLOAT | 0.200–1 | — |
| upscale_model | COMBO | 1 options: none | |
| blur_radius | INT | 200–512 | Gaussian blur radius applied to mask before pass 2. |
| imageopt | IMAGE | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| full_pipe | FULL_PIPE | — |
| image | IMAGE | — |