ComfyUI Node

CRT Scan

Make it look like it's on an old tube, badly

By criskb·Created 7 months ago·Updated 5 months ago· 0
CRT Scan
  • image
  • mask
  • image
  • mask
  • crt_info
settings_json{"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}

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_strength controlling depth and scanline_density (0.2–4.0) the spacing. This is the layer people notice first and usually want to dial back.
  • Phosphor - phosphor_strength adds the per-channel color bleed that makes bright pixels glow like a tube's phosphor dots.
  • Bloom bleed - bloom_bleed smears brights the way a real CRT blooms where it's overloaded.
  • Warp + curvature - warp_strength and curvature (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_strength with a seed adds 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.4
  • scanline_density - 1.0 is the default; 2.0 gives the finer, more modern "capture card" look
  • curvature - the difference between scanlines and a real CRT in one slider
  • seed - 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 mask output is the effect matte, not your input mask. Pack-wide convention.
  • Corrupted settings_json silently 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.

CategoryMKRShift Nodes/VFX/Concept

Inputs (3)

NameTypeDefaultDescription
imageIMAGE
settings_jsonSTRING{"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}
maskoptMASK

Outputs (3)

NameTypeDescription
imageIMAGE
maskMASK
crt_infoSTRING