SamplerLtxv23
The two-pass LTX 2.3 sampler that does hires-fix in one node
- model
- video_vae
- positive
- negative
- video_latent
- audio_latent
- start_image
- end_image
- upscale_model
- video_latent
- audio_latent
LTX 2.3's best-looking output doesn't come from rendering at target resolution. It comes from a two-stage trick: denoise a low-res latent, upscale it, then run a short refinement pass at the new size. SamplerLTXV_2.3 packages that whole thing into one sampler node, which is why it's the second half of the pack's flagship LTX pipeline alongside FMLFLTX_2.3. The code is essentially a distillation of WhatDreamsCost's PainterLTX nodes and princepainter's LTX2 workflows - so if you've used either of those, you already know what this is trying to do.
How it works
Pass 1 - full denoise. It takes the video_latent and audio_latent from FMLFLTX, merges them into a NestedTensor, and runs a complete denoise with its own sampler settings. This is the "generate the whole clip at low resolution" step, and it behaves like PainterSamplerLTXV.
Pass 2 - upscale + refine. Three things happen: the latent gets spatially upscaled through the optional upscale_model (a latent upscale model, loaded like any other); your start_image and end_image get re-embedded at the upscaled resolution so the anchors stay sharp; then a short refinement denoise runs with independent sampler settings. denoise_2 controls how much the refinement is allowed to change the upscaled latent - the README's guidance is the lower the better, since the whole point is sharpening, not re-generating.
Every parameter comes in a pass-1 and pass-2 variant - steps_1/steps_2, cfg_1/cfg_2, sampler_name_1/sampler_name_2, scheduler_1/scheduler_2, noise_seed_1/noise_seed_2, add_noise_1/add_noise_2, denoise_1/denoise_2. Defaults are euler / linear_quadratic / CFG 1, which is the right ballpark for a distilled 2.3 model - distilled checkpoints want 8 steps at CFG 1, and 2.3's CFG is a "1.0 baseline, nudge to 1.1–2.0 only if lights blow out" sort of dial.
The README's recommended settings by resolution target:
| Target | steps_1 | steps_2 | denoise_2 | |---|---|---|---| | up to 960×544 | 8 | 3–4 | 0.4 | | 1280×720 | 8–12 | 4–6 | 0.4 | | 1920×1080 | 12 | 6 | 0.4 |
Inputs and outputs
Required pins: model, video_vae (needed for image encoding and upscale statistics), positive, negative, plus video_latent and audio_latent straight from FMLFLTX. Optional: start_image / end_image (re-embedded after upscale) and upscale_model. Outputs are video_latent - upscaled and refined, ready for VAE Decode - and audio_latent for the audio VAE decode.
Installing it
Part of ComfyUI-rogala:
cd ComfyUI/custom_nodes
git clone https://github.com/rogala/ComfyUI-rogala
Restart, find it under rogala → Video → SamplerLTXV_2.3. ComfyUI Manager works too - search "rogala". It's a pure-python node; no downloads beyond the LTX 2.3 models your workflow already loads.
Where people get burned
Two things, both worth flagging. First, if you're running the distilled 2.3 checkpoint, make sure you're on the distilled LoRA 1.1, not 1.0 - the 1.0 release produced mumbling audio out of the first sampler stage, and this node does have two passes that audio runs through. Second, the two-pass design means your output resolution is a product of the upscaler and the input size, not something you type in. Feed it a video_latent whose dimensions came from LTX Resolution Selector in the matching distilled mode, or the upscale target silently disagrees with what you think you're rendering. Get those two right and this node is about the most reliable way to make LTX 2.3 look like it belongs on the "best locally runnable video model" list the community keeps putting it on.
Inputs (23)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| video_vae | VAE | — | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| video_latent | LATENT | — | |
| audio_latent | LATENT | — | |
| add_noise_1 | COMBO | enable | 2 options: enable, disable |
| noise_seed_1 | INT | 00–18446744073709550000 | Noise seed for pass 1. |
| steps_1 | INT | 81–10000 | Denoising steps for pass 1. |
| cfg_1 | FLOAT | 1.00–100 | CFG scale for pass 1. |
| sampler_name_1 | COMBO | euler | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
| scheduler_1 | COMBO | linear_quadratic | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 |
| denoise_1 | FLOAT | 1.000–1 | Denoise strength for pass 1. |
| add_noise_2 | COMBO | enable | 2 options: enable, disable |
| noise_seed_2 | INT | 00–18446744073709550000 | Noise seed for pass 2. |
| steps_2 | INT | 31–10000 | Denoising steps for pass 2 (refinement after upscale). |
| cfg_2 | FLOAT | 1.00–100 | CFG scale for pass 2. |
| sampler_name_2 | COMBO | euler | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
| scheduler_2 | COMBO | linear_quadratic | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 |
| denoise_2 | FLOAT | 0.400–1 | Denoise strength for pass 2. Lower = less change to upscaled latent. |
| start_imageopt | IMAGE | — | |
| end_imageopt | IMAGE | — | |
| upscale_modelopt | LATENT_UPSCALE_MODEL | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video_latent | LATENT | — |
| audio_latent | LATENT | — |