Nodes/ComfyTV/Inpaint
ComfyUI Node

Inpaint

Paint a mask, describe the fix, and the rest of the frame doesn't move

By jtydhr88·Created 3 months ago·Updated about 15 hours ago· 725
Inpaint
  • image
  • image
force_run_token0
project_id
parent_output_id0
workflowFlux Fill Inpaint
mask_data
main_prompt
custom_params{}

Inpaint is ComfyTV's mask-based image fixer, and it's swimming against the current on purpose. The whole-image edit models (Qwen-Image-Edit, Flux Kontext, that crowd) will rewrite your entire frame from a sentence - impressive, but every pixel outside the edit comes back close-but-not-identical, and the drift compounds if you edit a chain of images. This stage is the old-school version: you paint exactly what should change, and nothing else moves. The unmasked pixels come out bit-identical every time, which is the one thing no edit model offers.

ComfyTV is the canvas-style app layer that turns ComfyUI into something closer to a LibTV/TapNow-style workbench - every operation is its own node, and Inpaint is the Image-category stage for the fix-it step of a generate → pick → edit → composite flow.

How it works. This isn't a canned API call. Drop an image in, paint a mask in the node body with the brush widget, type what should appear there (the prompt placeholder suggests "a wooden chair", "an empty wall"), pick a workflow from the workflow combo (default Flux Fill Inpaint), and hit Run. ComfyTV binds the mask into the image's alpha channel and runs a real local ComfyUI workflow against your own models. Flux Fill uses InpaintModelConditioning at full denoise=1.0, so the masked region is regenerated from scratch while the surroundings stay pinned. There's also a Fooocus SDXL Inpaint workflow in the dropdown if you have Acly's comfyui-inpaint-nodes plugin installed.

The inputs that matter. Most of what you see is plumbing you never touch: force_run_token, project_id, parent_output_id, mask_data (the hidden painter output), and custom_params are all internal, driven by the node body and the project store. What you actually set:

  • workflow - which inpaint workflow to run; the combo lists what you've got installed.
  • main_prompt - what the masked region should become. This is the whole creative input.
  • image (optional) - the source image from an upstream stage.

The only output is image, a COMFYTV_IMAGE you wire into a Picker, an upscale stage, or straight into a video node.

Install. Install the pack once - all ~190 ComfyTV stages ship together:

cd ComfyUI/custom_nodes
git clone https://github.com/jtydhr88/ComfyTV

Restart ComfyUI (a real backend restart, not a browser refresh) and the stage appears under ComfyTV → Image. ComfyUI Manager works too - search "ComfyTV". There are zero Python dependencies (the pack's pyproject.toml ships an empty dependencies list), which is a genuinely refreshing break from dependency hell. What you do need is model files for whichever workflow you pick. Flux Fill Inpaint wants flux1-fill-dev_fp8.safetensors in models/diffusion_models/, plus clip_l.safetensors and t5xxl_fp16.safetensors in models/clip/ and ae.safetensors in models/vae/ - the pack's docs/models.md has the exact list and download URLs.

Where people get burned. The node not showing up after install is almost always the Desktop/multiple-installs trap - the clone landed in the wrong ComfyUI, not the running one (check the startup log for the base path, and verify custom_nodes/ComfyTV/__init__.py exists, not a nested ComfyTV/ComfyTV/). If Run completes but the region comes back wrong, it's the classic inpaint failure: hard seams around the mask edge. The inpainting playbook applies here - the workflow presets handle blending, but if you've imported your own workflow, don't drop the denoise too low if you actually want a full replacement. And don't hunt for the mask as a node input; it lives in the painter inside the node body, which surprises people coming from bare ComfyUI.

CategoryComfyTV/Image

Inputs (8)

NameTypeDefaultDescription
force_run_tokenINT00–2147483647Internal — bumped on Run to invalidate ComfyUI's input cache.
project_idSTRINGInternal — populated by the projectStore on the frontend.
parent_output_idINT00–2147483647Internal — lineage parent set by spawn handlers on the frontend.
workflowCOMBOFlux Fill InpaintWhich inpaint workflow to run.
mask_dataSTRING
main_promptSTRING
custom_paramsSTRING{}Internal — JSON of user-defined parameter attachments/values for this node.
imageoptCOMFYTV_IMAGE

Outputs (1)

NameTypeDescription
imageCOMFYTV_IMAGE