OminiControl Fill
Mask Inpainting on FLUX That Actually Stays Put
- ori_image
- mask
- image
OminiControl Fill is mask-based inpainting built on FLUX.1-schnell, and it's the node from this pack I'd actually reach for day to day. You draw a mask over the part of an image you want regenerated, type what should go there, and everything outside the mask stays pixel-for-pixel untouched. That second half is the point, and it's exactly what the newer instruction-editing models (Qwen-Image-Edit, Kontext, Klein) can't promise - they take the whole image in and emit a whole new one, so the parts you didn't ask to change come back slightly different.
This is old-school mask inpainting, and in 2026 that's a feature, not a bug. Want a region replaced and nothing else moved? A mask is the only tool that guarantees it.
How it works
The node composites your original image over a black canvas using the (inverted) mask, so the masked area becomes empty canvas, then runs the OminiControl fill control LoRA against FLUX.1-schnell with that composite as the condition. The model fills the hole, guided by your prompt, while the surrounding pixels act as context. Like the rest of this pack it's one self-contained node - prompt encode, condition encode, 8 sampling steps, VAE decode all happen inside, and you get a finished IMAGE out. No KSampler anywhere in the graph.
It works on standard ComfyUI mask semantics: paint the mask white where you want the image changed. A LoadImage node's built-in mask output works fine if your source PNG carries an alpha channel.
The inputs
- ori_image (
IMAGE) - the source image. It gets resized to 512×512 internally, so mask and image should match. - mask (
MASK) - white where you want regeneration, black where the image is sacred. - prompt (
STRING) - what should appear in the hole. "an apple on the desktop", per the example workflow. - seed (
INT) - the noise seed.
Output is a single image (IMAGE) at 512×512 → SaveImage.
Installing it
Same story as the rest of the pack - ComfyUI Manager search ComfyUI_RH_OminiControl, or:
cd ComfyUI/custom_nodes
git clone https://github.com/HM-RunningHub/ComfyUI_RH_OminiControl
# restart ComfyUI
Models are the real install. You need FLUX.1-schnell in diffusers format at ComfyUI/models/flux/FLUX.1-schnell (transformer shards, T5-XXL, CLIP-L, VAE, tokenizers), plus the fill LoRA at ComfyUI/models/flux/OminiControl/experimental/fill.safetensors. No requirements.txt ships in the repo; the README recommends diffusers 0.31.0, and the pipeline is bf16 throughout, so a modern NVIDIA card (the author targets a 4090) is effectively required.
Common issues
- FileNotFoundError = a model isn't in the exact path from the README tree. The paths are hardcoded, not configurable.
- The mask seems backwards. The node inverts your mask internally to build the black composite - if your result fills the wrong region, your mask was inverted to begin with. Keep white = change.
- The seed range is effectively tiny. The code does
seed % (2 ^ 16), and^is bitwise XOR in Python, so that's modulo 18. Roughly 18 distinct seeds exist. Move on. - 512×512 only. No resolution knob. Small fixes on a big image will look blocky when pasted back; plan to upscale or work at matching resolution.
- Batch size is 1 - one image and one mask per run.
The honest caveat: FLUX.1-schnell at 8 steps is fast, not flawless, and detail-heavy masks can come back soft. But for object insertion, "remove this and put that there", and any job where bit-identical unmasked pixels matter, this is the cleanest FLUX inpainting this pack offers.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| ori_image | IMAGE | — | |
| mask | MASK | — | |
| prompt | STRING | — | |
| seed | INT | 00–18446744073709550000 | The random seed used for creating the noise. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |