Scanz | GlitchNodes
Every CRT artifact, stacked in one node
- image
- image
Scanz is the all-in-one CRT-and-compression node: scanlines, wave distortion, RGB channel shift, compression artifacts, pixel sorting, static noise, color drift, and edge stretching, all stacked with individual intensity sliders. Where DataBend goes for data-bend chaos, Scanz goes for broadcast - the look of a TV being tortured by a weak antenna. If you want to build a "vintage monitor" treatment from one node instead of a chain of six, this is the one.
It's a stack of independent OpenCV/NumPy passes that add up in a predictable order: glitch_amount first (JPEG-like compression blocking), then channel shifting for chromatic aberration, then pixel sorting, then wave distortion, scanlines, and the color/static extras. Each effect has its own slider and defaults to off where it's disruptive - so you can compose the exact recipe you want rather than taking whatever the node gives you. The scanline pass is notably smart: it modulates scanline intensity with brightness so the pattern doesn't nuke bright areas, and scan_curve gives that subtle CRT barrel look.
The inputs that matter
- glitch_amount (0–1, default 0.5) - compression-artifact intensity. This is the baseline "broken" factor.
- channel_shift (0–1, default 0.2) - RGB channel displacement, i.e. chromatic aberration ghosting. Keep it under ~0.4 for subtle, higher for full color bleed.
- scan_lines (0–1) - CRT scanlines. Off by default, which is a good call; when you turn it on, pair it with
scan_driftfor moving bands. - scan_curve (0–1, default 0.2) - screen curvature. A little gives that authentic convex-CRT vibe.
- wave_amplitude (0–1), wave_frequency (0.1–5), wave_speed (0.1–5) - the wave distortion trio. Off by default; this is your "signal wobble" effect.
- pixel_sorting (0–1, default 0.3) - brightness-based sorting threshold; adds the streaky interference texture.
- color_drift / static_noise / edge_stretch - the extras.
static_noisespecifically concentrates noise in darker areas, which reads as analog rather than digital. - seed - required, so your exact artifact recipe is reproducible.
Output is image (IMAGE) → PreviewImage/SaveImage, with batch support for animating the drift and waves.
Installing it
Standard GlitchNodes install:
cd ComfyUI/custom_nodes
git clone https://github.com/pxl-pshr/GlitchNodes
# restart ComfyUI
or ComfyUI Manager → Install Custom Nodes → search "GlitchNodes". Deps: numpy, torch, Pillow, opencv-python, scipy. No models.
Gotchas
The trap with Scanz is stacking too much: with channel_shift, waves, scanlines, static, and edge_stretch all nonzero, you get a fully unreadable frame and no idea which effect ruined it. Build it up one slider at a time - that's the whole point of the design. Also, wave_speed and scan_drift only matter if you're animating; for a still, they just freeze mid-drift and can look arbitrary. And pack warning stands: "highly experimental and may break or even error" - though Scanz is one of the more complete, stable nodes, given it's basically a curated stack of classic effects.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| glitch_amount | FLOAT | 0.500–1 | — |
| channel_shift | FLOAT | 0.200–1 | — |
| pixel_sorting | FLOAT | 0.300–1 | — |
| wave_amplitude | FLOAT | 0.000–1 | — |
| wave_frequency | FLOAT | 0.50.1–5 | — |
| wave_speed | FLOAT | 1.00.1–5 | — |
| scan_lines | FLOAT | 0.000–1 | — |
| scan_drift | FLOAT | 0.000–1 | — |
| scan_curve | FLOAT | 0.200–1 | — |
| color_drift | FLOAT | 0.000–1 | — |
| static_noise | FLOAT | 0.000–1 | — |
| edge_stretch | FLOAT | 0.000–1 | — |
| seed | INT | 00–18446744073709550000 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |