Nodes/ComfyTV/Chroma Shift
ComfyUI Node

Chroma Shift

RGB-split glitch and lens fringe, one channel offset at a time

By jtydhr88·Created 3 months ago·Updated about 15 hours ago· 725
Chroma Shift
  • video
  • video
force_run_token0
project_id
parent_output_id0
shift_rh0
shift_rv0
shift_bh0
shift_bv0
shift_edgesmear

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) or wrap. This is what happens to the exposed edge when a channel moves: smear stretches the edge pixels; wrap wraps 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 smear can stretch weirdly; wrap keeps 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.
CategoryComfyTV/VideoFX

Inputs (9)

NameTypeDefaultDescription
force_run_tokenINT00–2147483647Internal — bumped on Run to invalidate ComfyUI's input cache.
project_idSTRINGInternal — populated by the projectStore on the frontend.
parent_output_idINT00–2147483647Internal — lineage parent set by spawn handlers on the frontend.
shift_rhFLOAT0-255–255
shift_rvFLOAT0-255–255
shift_bhFLOAT0-255–255
shift_bvFLOAT0-255–255
shift_edgeCOMBOsmear2 options: smear, wrap
videooptCOMFYTV_VIDEO

Outputs (1)

NameTypeDescription
videoCOMFYTV_VIDEO