Chroma Shift
RGB-split glitch and lens fringe, one channel offset at a time
- video
- video
If you've watched any synthwave video or glitch edit in the last decade, you've seen this effect: the red and blue channels peeled away from the green, edges dripping with color. Chroma Shift is the ComfyTV node that does it directly - it moves the red and blue channels independently, horizontally and vertically, and leaves green locked in place as the reference. Small offsets read as believable lens aberration; big offsets are full RGB-split retro-VHS energy.
The KB's post-processing essay makes a point that applies here: almost none of this layer is AI, and that's fine. Chroma shift is a deterministic, milliseconds-costing pixel op, and doing it in a node instead of a diffusion pass is exactly the right call - the "subtle red channel aberration" that the community keeps listing as one of the tricks that makes AI video read as real is this, done carefully.
How it works
It's a rendered stage with a ▶ Run that uses an ffmpeg chromashift filter - the pack's own docs are explicit about the backend. All four offsets at zero and the clip passes through untouched (the source even short-circuits to identity before building the spec). COMFYTV_VIDEO in, COMFYTV_VIDEO out; Bridge out to native nodes if you need to.
The inputs that matter
- shift_rh / shift_rv - red channel shift, horizontal and vertical, each −255 to 255 in 1px steps, default 0.
- shift_bh / shift_bv - blue channel shift, same ranges, default 0.
- shift_edge -
smear(default) orwrap. This is what happens to the exposed edge when a channel moves:smearstretches the edge pixels;wrapwraps the channel around from the opposite side.
That's the whole control surface. Output is video (COMFYTV_VIDEO).
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/jtydhr88/ComfyTV
Restart the backend, not the tab; nodes appear under ComfyTV. ComfyUI Manager finds the pack by searching "ComfyTV". The README's two recurring gotchas: on Desktop/macOS/multi-install setups the relative cd can clone into the wrong instance - read the startup log for the real base path and clone into that absolute path, quoted - and the first level of custom_nodes/ComfyTV/ must contain __init__.py, not a nested ComfyTV/ComfyTV/ folder. No Python dependencies to install; ffmpeg is ComfyUI's own.
Troubleshooting and tips
- Symmetric looks better. Nudge red one way and blue the opposite for a believable aberration instead of a smear in one direction.
- No effect on Run? All four offsets are 0 - that's a deliberate pass-through.
- Wrapping vs smearing on strong shifts. Big offsets with
smearcan stretch weirdly;wrapkeeps it cleaner for the full glitch look. - The subtle version is the classy one. A few pixels of opposing shift reads as lens character; a big split reads as glitch. Both are one slider away.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| force_run_token | INT | 00–2147483647 | Internal — bumped on Run to invalidate ComfyUI's input cache. |
| project_id | STRING | Internal — populated by the projectStore on the frontend. | |
| parent_output_id | INT | 00–2147483647 | Internal — lineage parent set by spawn handlers on the frontend. |
| shift_rh | FLOAT | 0-255–255 | — |
| shift_rv | FLOAT | 0-255–255 | — |
| shift_bh | FLOAT | 0-255–255 | — |
| shift_bv | FLOAT | 0-255–255 | — |
| shift_edge | COMBO | smear | 2 options: smear, wrap |
| videoopt | COMFYTV_VIDEO | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video | COMFYTV_VIDEO | — |