Blur Mask
The one-knob node that turns hard mask edges into soft ones
- mask
- MASK
Every mask that comes out of ComfyUI is binary: pure white where you want something to happen, pure black everywhere else. And the moment you feed a hard-edged mask into an inpainting pass, a composite, or region-locked conditioning, you get seams. Blur Mask exists to fix that, and it does it with exactly one knob. No dependency soup, no model downloads, no settings you have to read a forum post to understand. In the category of "node that does one thing and gets out of the way," this is close to ideal.
It's a tiny pack from rookiepsi (the author goes by "psi"), GPLv3, and it ships a single node under comfypsi/mask. Brand new as of mid-2025, so you won't find a big community writeup - but there's also nothing to get wrong here.
How it actually works
Under the hood it's ~30 lines of pure PyTorch, and it's worth knowing what the blur number means. The node builds a normalized 1D Gaussian kernel whose width is 6 × blur, rounds it to an odd size, then applies it as two separable convolutions (horizontal, then vertical) with torch.nn.functional.conv2d. So blur is effectively the Gaussian's standard deviation - not a pixel count.
That trips people up. In A1111 or ADetailer, "mask blur 5" means roughly 5 pixels of feathered edge. Here, blur = 5 gives a kernel 31 pixels wide with a transition zone of about ±15 pixels around the edge. It's a much softer result than the number suggests. Start around 2–4 unless you want something genuinely diffuse; the typical 4–12 pixel feathering range from the classic inpainting playbook maps to a much smaller blur value here.
Two behaviors worth knowing:
blur = 0(or negative) short-circuits and returns your mask untouched. Handy when you want to toggle the effect without deleting the node.- The kernel is clamped to the mask's dimensions, so on a tiny cropped mask the effective blur shrinks automatically. No crash, just less softening.
The two inputs that matter
There are only two, which is the whole point.
- mask (MASK): the mask to soften. It needs to be a mask, not an image - wire it from the Mask Editor, a SAM/segmentation pass, or anything else that outputs
MASK. If you drag an image connection over and it won't click into place, that's the MASK vs IMAGE data-type mismatch, not a broken node. - blur (FLOAT): strength of the blur, default 5.0, range 0–100, step 0.1. See the sigma caveat above.
The single MASK output keeps the same shape and plugs into anything that accepted the input mask: inpainting, compositing, ControlNet/region conditioning, IPAdapter masking. Because the blur dims the center (the peak drops below 1.0), if your downstream node needs a near-binary mask you'll want to threshold after this rather than expect a hard white.
Why not ComfyUI's built-in feather?
Fair question. Core ComfyUI already has FeatherMask, which feathers just the outer edge with a linear falloff over a pixel count. The difference: that node only touches the boundary, while this Gaussian smooths the whole mask - internal gradients and noise get softened too, and there's a single knob instead of four. If you just want a flat edge falloff, FeatherMask is genuinely fine. If you want the entire mask softened in one move, reach for this.
Install
Either way is painless. Through ComfyUI Manager: Manager > Install Custom Nodes, search Blur Mask, install, restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/rookiepsi/comfypsi_blur_mask.git
Then restart ComfyUI. That's the entire install - pyproject.toml declares zero runtime dependencies and it ships no model files. It's a nice change of pace from packs that want you to pull 2 GB of weights first.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| mask | MASK | — | |
| blur | FLOAT | 5.00–100 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| MASK | MASK | — |