CRT Scan
Make it look like it's on an old tube, badly
- image
- mask
- image
- mask
- crt_info
Nothing says "this was captured off a dying monitor" like scanlines, and x1CRTScan is a full kit for that look: scanlines, phosphor glow, bloom bleed, barrel warp and curvature, plus noise. It's from MKRShift Nodes' VFX/Concept branch - the stylized, concept-art side of the pack, not the photo-real side. Which means it's meant to be seen, not believed.
The pack is young (no impressions, no community chatter I could find), so the honest note applies: fresh deterministic code, no tutorial pile. The VFX branch is where the pack's settings_json + frontend-panel pattern is most consistent, and this node's panel is a good time.
How it works
Read the source and it's a clean stack, each layer a switch:
- Scanlines - a sine-based darkening across rows,
scanline_strengthcontrolling depth andscanline_density(0.2–4.0) the spacing. This is the layer people notice first and usually want to dial back. - Phosphor -
phosphor_strengthadds the per-channel color bleed that makes bright pixels glow like a tube's phosphor dots. - Bloom bleed -
bloom_bleedsmears brights the way a real CRT blooms where it's overloaded. - Warp + curvature -
warp_strengthandcurvature(capped at 0.8) bend the image toward the rounded-tube look; push curvature if you want the monitor-curve, keep it low for a flat-panel-scanline vibe. - Noise -
noise_strengthwith aseedadds the signal static that kills the "too clean" tell.
Outputs: image, mask (where the CRT treatment landed), crt_info (settings log). The optional mask input restricts the effect to a region - screen-shaped masks on the corners, for instance.
Inputs that matter
scanline_strength(default 0.28) - the most visible layer; most people land between 0.15 and 0.4scanline_density- 1.0 is the default; 2.0 gives the finer, more modern "capture card" lookcurvature- the difference between scanlines and a real CRT in one sliderseed- locks the noise pattern so the static is reproducible
Installing
ComfyUI Manager → search MKRShift Nodes, or:
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
Restart ComfyUI. No models, no new dependencies - pure numpy/PIL per-frame math.
Where people get burned
- Everything at once. All five layers default to nonzero, which is a great demo and a terrible starting point. Build your look layer by layer: scanlines first, then one or two others. Full-stack defaults read as "I found the filter" instantly.
- Curvature vs. warp. They overlap visually; curvature is the barrel bend, warp is the general distortion strength. Raise curvature for the tube look, leave warp low unless you want the swimming edge.
- The
maskoutput is the effect matte, not your input mask. Pack-wide convention. - Corrupted
settings_jsonsilently resets to defaults - if your perfect CRT setting vanishes, check the string.
It's a stylize node, and it knows it. For retro-game overlays, music-video texture, or "this footage was recovered from a VHS" mood, it's one drag-and-slide kit away.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| settings_json | STRING | {"scanline_strength":0.28,"scanline_density":1.0,"phosphor_strength":0.3,"bloom_bleed":0.22,"warp_strength":0.12,"curvature":0.18,"noise_strength":0.05,"seed":777,"mask_feather":12.0,"invert_mask":false} | — |
| maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| crt_info | STRING | — |