H3 Seam Normalize (alpha)
The hidden prefix is a calibration chart, and this node reads it
- source_tail
- generated_prefix
- images
- source_tail_audio
- generated_prefix_audio
- audio
- images
- audio
- report
H3 Seam Normalize has one of the cleverer ideas in the MAINodes extension surface, and it starts from an observation most people would walk right past. When you continue an H3 clip, the model renders a hidden prefix of frames it will later throw away - but the accepted version of those same frames already exists. That means the rendered prefix is a free calibration chart: you know exactly what the continuation should have looked like, so any systematic difference between the two is measurement of how the pipeline drifts. Seam Normalize fits that difference and applies it to the new material so the new segment conforms to the accepted world - never the other way round.
How it works
Three image inputs define the experiment:
source_tail- H3 Tail Context'stail_images: the accepted world.generated_prefix- H3 Trim'sprefix_images: the same frames as the continuation actually rendered them.images- H3 Trim'simages: the new material that needs to conform.
From those it fits per-channel linear-light RGB gains (the default mode) - or a single luma gain - that map the rendered prefix onto the source tail, clamps them with max_gain (default 1.25), and applies the gains to the new frames. off (report only) exists so you can see the measurements without touching the pixels. The measured numbers are honest and specific: each VAE round-trip darkens the prefix about 2.4%, the new material lands warmer (G −7%, B −11%), and the colour gains removed the luma step (−4.2% → −0.1%) plus half the chroma shift.
The audio side is where the author went against their own instinct, and it's worth respecting. audio_mode defaults to off because the measured rms gain made the seam step worse (−8 → −11 dB) - the rendered prefix was louder than its source while the new material was quieter, so audio level isn't a uniform offset like the VAE darkening. The gain path stays available with audio_fade_ms (default 10 ms) if you want to try it on your own clips, but the default is the right call.
Outputs
images and audio come out conformed (or untouched, in report-only mode), and report tells you what the fit found. There's no model in the loop and no render - it's a numeric calibration pass, which is why it's cheap and safe to run.
Install and context
It ships in matlowai/ComfyUI-MAINodes:
cd ComfyUI/custom_nodes
git clone https://github.com/matlowai/ComfyUI-MAINodes
Restart and it appears under MAINodes/alpha. No extra Python dependencies; you do need MiniMax-H3 weights and ComfyUI's H3 support (mind the licence's US/EU/UK/Korea carve-out). Its natural neighbours are the segment-chaining nodes - H3 Tail Context upstream to build the prefix/tail pair, H3 Trim to separate the hidden prefix from the new material.
The one trap to name: this node only corrects what the fit can see. If your seam problem is spatial (a moving background, a lighting change) rather than a per-pixel tonal offset, a per-channel gain won't fix it, and the report's numbers will tell you - read it before you declare victory.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| source_tail | IMAGE | H3 Tail Context's tail_images: the accepted world | |
| generated_prefix | IMAGE | H3 Trim's prefix_images: the same frames as the continuation rendered them | |
| images | IMAGE | H3 Trim's images: the new material to conform | |
| mode | COMBO | channels (linear-light RGB gains) | 3 options: channels (linear-light RGB gains), luma (one gain), off (report only) |
| max_gain | FLOAT | 1.251–2 | — |
| source_tail_audioopt | AUDIO | — | |
| generated_prefix_audioopt | AUDIO | — | |
| audioopt | AUDIO | — | |
| audio_modeopt | COMBO | off | off by default: measured 2026-08-23 the handle-fitted rms gain made the seam step WORSE (-8 -> -11 dB); the rendered prefix was louder than its source while the new material was quieter, so audio level is not a uniform offset like the VAE darkening |
| audio_fade_msopt | INT | 100–200 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| audio | AUDIO | — |
| report | STRING | — |