Light Leak
A warm flare that never needs a texture plate
- image
- mask
- image
- mask
- lightleak_info
A light leak is what happens when light sneaks into a camera through a seam or a worn seal - a warm smear of flare across the frame, usually at an angle, usually washing out one corner. Film photographers used to curse it; now it's shorthand for "this footage has a history." Light Leak is the MKRShift node that fakes it procedurally: a seeded, animated flare you can drop on any frame in seconds, no lens-flare texture plates, no compositing a radial-gradient PNG over your image by hand.
It's in MKRShift Nodes/VFX/Optics, and it slots neatly into the same "make it read as shot, not generated" stack the KB's photorealism doc keeps returning to - after grain and vignette, a warm angled leak is one of the cheapest remaining ways to break the sterile look.
How it works
The node generates a flare from two pieces. First, a procedural streak field: noise shaped by angle (35° by default - leaks love coming in at an angle) and scale, softened by softness. Second, a color ramp across the leak: ramp_preset (default warm) gives you the classic warm amber-to-orange falloff, and custom_start_r/g/b plus custom_end_r/g/b let you build your own - a teal leak, a magenta leak, whatever your grade calls for. The ramp and streak multiply together, get scaled by strength (0.35 default), and land on the frame with blend_mode - screen by default, which is the honest flare blend: it adds light, never darkens.
seed (1337) is the workhorse control: every seed is a different streak shape, so you can audition ten leaks in ten seconds. The same seed and settings give the same leak every run - that's the property that makes a leak matchable across an entire sequence.
Using it
The settings bundle is compact: strength, angle, scale, softness, seed, ramp_preset, the six custom color stops, blend_mode, plus the standard mask_feather/invert_mask. The optional mask input lets you keep the leak off a face or subject - useful, since a leak that washes over the subject's eyes reads as damage, not vibe.
Outputs: the leaked image, a mask of the leak region (handy for blending or for a second, subtler pass), and a lightleak_info string.
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
then restart, or search MKRShift_Nodes in ComfyUI Manager. No pip requirements, no model downloads, no texture assets.
The taste knob is strength, and the default 0.35 is already close to the ceiling of tasteful. Above 0.5 you're not adding character, you're shooting through a broken camera. For video, animate angle slowly over a few frames so the leak roams like a real hand-held camera flare - static leaks are the tell that it's a filter. And when a leak looks "too pink" or "too orange," resist reaching for a new preset; dial the custom end color toward neutral first, since the ramp is doing most of the work.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| settings_json | STRING | {"strength":0.35,"angle":35.0,"scale":1.0,"softness":1.0,"seed":1337,"ramp_preset":"warm","blend_mode":"screen","custom_start_r":1.0,"custom_start_g":0.45,"custom_start_b":0.1,"custom_end_r":1.0,"custom_end_g":0.86,"custom_end_b":0.42,"mask_feather":12.0,"invert_mask":false} | — |
| maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| lightleak_info | STRING | — |