ANDRO Seam Check
Tiled decoding leaves soft frames you can't see — until this node finds them
- images
- sharpness_plot
- report
Tiled VAE decode is how long videos fit into VRAM, and it quietly leaves scars. The dangerous one is temporal tiling: cut a video along time, and the diffusion decoder has no context at the tile edge, so every seam comes out as a visibly softer frame. Smooth, not a jump - which is exactly why a frame-to-frame difference check can't see it, and why a 121-frame clip with a soft frame every 24 frames plays back fine and nobody notices until a pan starts to judder. ANDRO Seam Check measures per-frame sharpness, finds the dips, and reports only when several of them sit on one regular grid. Motion in the shot produces isolated soft frames too - regular spacing is the fingerprint of a tiling seam, and the report says which it found.
The kind of output that makes it click (real, from the README):
temporal: 121 frame(s), median sharpness 0.00738
soft frames at [12, 25, 49, 66, 73, 97]
PERIODIC: 4 of them every 24 frames ([25, 49, 73, 97]) - that is a temporal tiling seam.
off-grid, most likely motion in the shot: [12, 66]
The prediction trick
This node doesn't just find seams afterwards - it can predict where they must land before you decode. The spacing is arithmetic, not luck: a temporal tile is temporal_size / compression latent frames, consecutive tiles advance by tile minus overlap, and every advance lands one blended output frame. Set predict_from_temporal_size to the temporal_size the decode used, predict_from_temporal_overlap to its overlap, and temporal_compression to your VAE's figure (8 for LTX-2.5), and it states where soft frames must fall, then confronts that prediction with what it measured - reporting CONFIRMED, partly confirmed, or "predicted seams were NOT measurable," which means either the blend is gentler than your threshold or the compression number is wrong. It won't quietly conclude "no seam" when a prediction went unanswered.
Inputs that matter
images- the decoded sequence. Needs enough frames for a pattern to show; a handful can't prove periodicity.dip_threshold(0.93 default) - a frame is called soft when its sharpness drops below this fraction of the previous frame's (0.93 = a 7% fall). Lower it to catch fainter seams at the cost of flagging motion blur; raise it if a fast-moving shot reports dips everywhere.check_spatial- also hunt for vertical/horizontal seams from spatial tiling. Only regular, repeating peaks are reported - a single strong edge is content, not a seam. Spatial seams are the easy kind: they measure 1.03–1.05× excess at the boundaries with sane overlap, far below the 1.30× the node needs before calling something a peak.
Outputs: a sharpness_plot image (per-frame sharpness with soft frames marked - a seam shows up as evenly spaced dips) and the text report.
The fix it points you to
When a seam is confirmed, the answer is almost never what beginners reach for. Raising overlap softens a temporal seam but never removes it - the decoder still had no context at that edge. The fix is to not cut along time at all: leave temporal_size at 4096 (the ANDRO VAE Decode default, meaning nothing is cut temporally) and cut tile_size to fit memory instead. The spatial seam is the one overlap can genuinely blend away.
Install
ANDRO Seam Check is one node in the comfyui-vae-float32 pack. ComfyUI-Manager → search comfyui-vae-float32 → install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/AndreiOrehov/comfyui-vae-float32
Restart, then look under the ANDRO category. It's a sibling of ANDRO VAE Decode, sharing its author (Andrei Orehov / Andromediastudio) and Apache-2.0 licence. If you only ever decode stills, you don't need it - this is for the moment you tile a video decode and start trusting "it looks fine," when what you actually needed was a periodic soft-frame check you didn't know existed.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | The decoded sequence to inspect. Needs enough frames for a pattern to show - a handful of frames cannot prove periodicity. | |
| dip_threshold | FLOAT | 0.9300.5–0.999 | A frame is called soft when its sharpness drops below this fraction of the previous frame's - 0.93 means a 7% fall. Lower it to catch fainter seams at the cost of flagging ordinary motion blur; raise it if a fast-moving shot reports dips everywhere. Isolated dips are usually content: only REGULARLY spaced ones are a tiling seam, and the report says which it found. |
| check_spatial | BOOLEAN | true | Also look for vertical/horizontal seams left by SPATIAL tiling. Only regular, repeating peaks are reported - a single strong edge is content, not a seam. |
| predict_from_temporal_sizeopt | INT | 00–4096 | Set this to the temporal_size the decode used and the node will PREDICT where soft frames must land, instead of only finding them afterwards. The spacing is arithmetic, not luck: tile_t = temporal_size / the VAE's temporal compression, and a seam falls every (tile_t - overlap_t) x compression frames. 0 = predict nothing, just measure what is in the batch. |
| predict_from_temporal_overlapopt | INT | 80–4096 | The temporal_overlap that went with it. Only read when predict_from_temporal_size is not 0. |
| temporal_compressionopt | INT | 81–64 | How many output frames the VAE packs into one latent frame - 8 for LTX-2.5. Wrong value here shifts the predicted spacing by the same factor, so check it against your VAE rather than assuming. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| sharpness_plot | IMAGE | Per-frame sharpness as a plot, with the soft frames marked - a temporal seam shows up as evenly spaced dips. |
| report | STRING | Which frames went soft, whether their spacing is regular enough to be a tiling seam rather than motion, and what to change if it is. |