Restore Archival Footage - LTX 2.3 Dearchive LoRA
Upload an input video or archival footage and restore it with 1 click.
Inside the workflow
A read-only preview of the source template. Open it in Cloud to explore the nodes and make changes.
Loading the graph
Open full-size workflow preview- Output
- Video
- Author
- Rob
Call this model from your code
The request below uses the same prepared graph and settings as the Playground. Each submission can start a paid run; do not automatically retry a submission whose outcome is unknown.
What you need
- Runs on
- Comfy Cloud
- Key
- COMFY_API_KEY
- Your files
- Uploaded by the code from their urls
Needs a paid Cloud plan and credits.
# Python 3.10+: pip install comfy-sdk==0.4.0
import os
from comfy_sdk import Comfy
api_key = os.environ.get("COMFY_API_KEY", "").strip()
if not api_key: raise RuntimeError("Set COMFY_API_KEY")
os.environ.setdefault("COMFY_BASE_URL", "https://cloud.comfy.org")
client = Comfy(api_key=api_key)
workflow = client.workflows.from_json({
"5187": {
"class_type": "SaveVideo",
"inputs": {
"filename_prefix": "video",
"format": "auto",
"format.codec": "auto",
"video": [
"5189:5062",
0
]
},
"_meta": {
"title": "Save Video"
}
},
"5188": {
"class_type": "LoadVideo",
"inputs": {
"file": "UPLOADED_video_FILENAME"
},
"_meta": {
"title": "Load Video"
}
},
"5190": {
"class_type": "GetVideoComponents",
"inputs": {
"video": [
"5188",
0
]
},
"_meta": {
"title": "Get Video Components"
}
},
"5192": {
"class_type": "SaveVideo",
"inputs": {
"filename_prefix": "video_compare",
"format": "auto",
"format.codec": "auto",
"video": [
"5191:80",
0
]
},
"_meta": {
"title": "Save Comparison Video"
}
},
"5189:5057": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"5189:5084",
0
],
"text": "pc game, console game, video game, cartoon, childish, ugly"
},
"_meta": {
"title": "CLIP Text Encode (Negative Prompt)"
}
},
"5189:5058": {
"class_type": "RandomNoise",
"inputs": {
"noise_seed": 234967385442993
},
"_meta": {
"title": "RandomNoise"
}
},
"5189:5059": {
"class_type": "LatentUpscaleModelLoader",
"inputs": {
"model_name": "ltx-2.3-spatial-upscaler-x2-1.1.safetensors"
},
"_meta": {
"title": "Load Latent Upscale Model"
}
},
"5189:5060": {
"class_type": "LTXVConditioning",
"inputs": {
"frame_rate": [
"5189:5088",
2
],
"negative": [
"5189:5057",
0
],
"positive": [
"5189:5091",
0
]
},
"_meta": {
"title": "LTXVConditioning"
}
},
"5189:5061": {
"class_type": "CFGGuider",
"inputs": {
"cfg": 1,
"model": [
"5189:5087",
0
],
"negative": [
"5189:5098",
1
],
"positive": [
"5189:5098",
0
]
},
"_meta": {
"title": "CFG Guider"
}
},
"5189:5062": {
"class_type": "CreateVideo",
"inputs": {
"audio": [
"5190",
1
],
"bit_depth": "auto",
"codec": "none",
"color_space": "sRGB",
"fps": [
"5189:5088",
2
],
"images": [
"5189:5090",
0
]
},
"_meta": {
"title": "Create Video"
}
},
"5189:5063": {
"class_type": "KSamplerSelect",
"inputs": {
"sampler_name": "euler"
},
"_meta": {
"title": "KSamplerSelect"
}
},
"5189:5064": {
"class_type": "ManualSigmas",
"inputs": {
"sigmas": "1.0, 0.99375, 0.9875, 0.98125, 0.975, 0.909375, 0.725, 0.421875, 0.0"
},
"_meta": {
"title": "ManualSigmas"
}
},
"5189:5065": {
"class_type": "LTXVEmptyLatentAudio",
"inputs": {
"audio_vae": [
"5189:5086",
0
],
"batch_size": 1,
"frame_rate": [
"5189:5095",
0
],
"frames_number": [
"5189:5097",
1
]
},
"_meta": {
"title": "Empty LTXV Latent Audio"
}
},
"5189:5066": {
"class_type": "LTXVConcatAVLatent",
"inputs": {
"audio_latent": [
"5189:5065",
0
],
"video_latent": [
"5189:5094",
2
]
},
"_meta": {
"title": "Concat AV Latent"
}
},
"5189:5067": {
"class_type": "SamplerCustomAdvanced",
"inputs": {
"guider": [
"5189:5061",
0
],
"latent_image": [
"5189:5066",
0
],
"noise": [
"5189:5058",
0
],
"sampler": [
"5189:5063",
0
],
"sigmas": [
"5189:5064",
0
]
},
"_meta": {
"title": "SamplerCustomAdvanced"
}
},
"5189:5068": {
"class_type": "ResizeImageMaskNode",
"inputs": {
"input": [
"5189:5088",
0
],
"resize_type": "scale dimensions",
"resize_type.crop": "disabled",
"resize_type.height": 1088,
"resize_type.width": 1920,
"scale_method": "area"
},
"_meta": {
"title": "Resize Image/Mask (s2 size)"
}
},
"5189:5069": {
"class_type": "LTXVLatentUpsampler",
"inputs": {
"samples": [
"5189:5082",
2
],
"upscale_model": [
"5189:5059",
0
],
"vae": [
"5189:5085",
2
]
},
"_meta": {
"title": "LTXVLatentUpsampler"
}
},
"5189:5070": {
"class_type": "LTXVSeparateAVLatent",
"inputs": {
"av_latent": [
"5189:5067",
0
]
},
"_meta": {
"title": "Separate AV Latent"
}
},
"5189:5071": {
"class_type": "LTXAddVideoICLoRAGuide",
"inputs": {
"crop": "disabled",
"frame_idx": 0,
"image": [
"5189:5068",
0
],
"latent": [
"5189:5069",
0
],
"latent_downscale_factor": 1,
"negative": [
"5189:5099",
1
],
"positive": [
"5189:5099",
0
],
"strength": 1,
"tile_frames": 97,
"tile_overlap": 64,
"tile_size": 256,
"use_streaming": False,
"use_tiled_encode": True,
"vae": [
"5189:5085",
2
]
},
"_meta": {
"title": "🅛🅣🅧 Add Video IC-LoRA Guide"
}
},
"5189:5072": {
"class_type": "KSamplerSelect",
"inputs": {
"sampler_name": "euler"
},
"_meta": {
"title": "KSamplerSelect"
}
},
"5189:5073": {
"class_type": "SamplerCustomAdvanced",
"inputs": {
"guider": [
"5189:5076",
0
],
"latent_image": [
"5189:5077",
0
],
"noise": [
"5189:5078",
0
],
"sampler": [
"5189:5072",
0
],
"sigmas": [
"5189:5075",
0
]
},
"_meta": {
"title": "SamplerCustomAdvanced"
}
},
"5189:5074": {
"class_type": "LTXVCropGuides",
"inputs": {
"latent": [
"5189:5080",
0
],
"negative": [
"5189:5071",
1
],
"positive": [
"5189:5071",
0
]
},
"_meta": {
"title": "LTXVCropGuides"
}
},
"5189:5075": {
"class_type": "ManualSigmas",
"inputs": {
"sigmas": "0.909375, 0.725, 0.421875, 0.0"
},
"_meta": {
"title": "ManualSigmas"
}
},
"5189:5076": {
"class_type": "CFGGuider",
"inputs": {
"cfg": 1,
"model": [
"5189:5087",
0
],
"negative": [
"5189:5071",
1
],
"positive": [
"5189:5071",
0
]
},
"_meta": {
"title": "CFG Guider"
}
},
"5189:5077": {
"class_type": "LTXVConcatAVLatent",
"inputs": {
"audio_latent": [
"5189:5099",
2
],
"video_latent": [
"5189:5071",
2
]
},
"_meta": {
"title": "Concat AV Latent"
}
},
"5189:5078": {
"class_type": "RandomNoise",
"inputs": {
"noise_seed": 29
},
"_meta": {
"title": "RandomNoise"
}
},
"5189:5079": {
"class_type": "LTXVAudioVAEDecode",
"inputs": {
"audio_vae": [
"5189:5086",
0
],
"samples": [
"5189:5080",
1
]
},
"_meta": {
"title": "LTXV Audio VAE Decode"
}
},
"5189:5080": {
"class_type": "LTXVSeparateAVLatent",
"inputs": {
"av_latent": [
"5189:5073",
0
]
},
"_meta": {
"title": "Separate AV Latent"
}
},
"5189:5082": {
"class_type": "LTXVCropGuides",
"inputs": {
"latent": [
"5189:5070",
0
],
"negative": [
"5189:5094",
1
],
"positive": [
"5189:5094",
0
]
},
"_meta": {
"title": "LTXVCropGuides"
}
},
"5189:5083": {
"class_type": "LTXVAudioVAEEncode",
"inputs": {
"audio": [
"5189:5088",
1
],
"audio_vae": [
"5189:5086",
0
]
},
"_meta": {
"title": "LTXV Audio VAE Encode"
}
},
"5189:5084": {
"class_type": "LTXAVTextEncoderLoader",
"inputs": {
"ckpt_name": "ltx-2.3-22b-dev.safetensors",
"device": "default",
"text_encoder": "gemma_3_12B_it.safetensors"
},
"_meta": {
"title": "Load LTXV Audio Text Encoder"
}
},
"5189:5085": {
"class_type": "CheckpointLoaderSimple",
"inputs": {
"ckpt_name": "ltx-2.3-22b-dev.safetensors"
},
"_meta": {
"title": "Load Checkpoint"
}
},
"5189:5086": {
"class_type": "LTXVAudioVAELoader",
"inputs": {
"ckpt_name": "ltx-2.3-22b-dev.safetensors"
},
"_meta": {
"title": "Load LTXV Audio VAE"
}
},
"5189:5087": {
"class_type": "LTXICLoRALoaderModelOnly",
"inputs": {
"lora_name": "ltx-2.3-dearchive-lora_weights_step_05000.safetensors",
"model": [
"5189:5085",
0
],
"strength_model": 1
},
"_meta": {
"title": "🅛🅣🅧 IC-LoRA Loader Model Only"
}
},
"5189:5088": {
"class_type": "GetVideoComponents",
"inputs": {
"video": [
"5188",
0
]
},
"_meta": {
"title": "Get Video Components"
}
},
"5189:5089": {
"class_type": "ResizeImageMaskNode",
"inputs": {
"input": [
"5189:5088",
0
],
"resize_type": "scale dimensions",
"resize_type.crop": "disabled",
"resize_type.height": 544,
"resize_type.width": 960,
"scale_method": "area"
},
"_meta": {
"title": "Resize Image/Mask (s1 size)"
}
},
"5189:5090": {
"class_type": "LTXVTiledVAEDecode",
"inputs": {
"horizontal_tiles": 2,
"last_frame_fix": False,
"latents": [
"5189:5074",
2
],
"overlap": 6,
"vae": [
"5189:5085",
2
],
"vertical_tiles": 2,
"working_device": "auto",
"working_dtype": "auto"
},
"_meta": {
"title": "🅛🅣🅧 LTXV Tiled VAE Decode"
}
},
"5189:5091": {
"class_type": "CLIPTextEncode",
"inputs": {
"clip": [
"5189:5084",
0
],
"text": "A modern, high-resolution colour video of a busy 1920s harbour street, shot with sharp detail and contemporary cinematography. Dock workers in faded blue cotton tunics and brown canvas trousers haul pale burlap sacks across grey granite cobbles, a cream and maroon streetcar rolls along polished steel rails, and an elderly man in a long black silk robe walks calmly through the crowd. Red brick warehouses with green canvas awnings line the street, wooden crates and coiled ropes sit beside black iron bollards, and tugboats with red funnels release white steam over the blue-grey water. Clean, stable frames with natural skin tones, soft daylight from an overcast sky, crisp edges, no grain, no scratches, no flicker."
},
"_meta": {
"title": "CLIP Text Encode (Positive Prompt)"
}
},
"5189:5093": {
"class_type": "EmptyLTXVLatentVideo",
"inputs": {
"batch_size": 1,
"height": 544,
"length": [
"5189:5097",
1
],
"width": 960
},
"_meta": {
"title": "Empty LTXV Latent Video"
}
},
"5189:5094": {
"class_type": "LTXAddVideoICLoRAGuide",
"inputs": {
"crop": "disabled",
"frame_idx": 0,
"image": [
"5189:5089",
0
],
"latent": [
"5189:5093",
0
],
"latent_downscale_factor": 1,
"negative": [
"5189:5060",
1
],
"positive": [
"5189:5060",
0
],
"strength": 1,
"tile_frames": 97,
"tile_overlap": 64,
"tile_size": 256,
"use_streaming": False,
"use_tiled_encode": True,
"vae": [
"5189:5085",
2
]
},
"_meta": {
"title": "🅛🅣🅧 Add Video IC-LoRA Guide"
}
},
"5189:5095": {
"class_type": "LTXFloatToInt",
"inputs": {
"a": [
"5189:5088",
2
]
},
"_meta": {
"title": "🅛🅣🅧 Float To Int"
}
},
"5189:5096": {
"class_type": "GetImageSizeAndCount",
"inputs": {
"image": [
"5189:5089",
0
]
},
"_meta": {
"title": "Get Image Size & Count"
}
},
"5189:5097": {
"class_type": "ComfyMathExpression",
"inputs": {
"expression": "(int((a - 1) / 8)) * 8 + 1",
"values.a": [
"5189:5096",
3
]
},
"_meta": {
"title": "Math Expression"
}
},
"5189:5098": {
"class_type": "LTXVSetAudioRefTokens",
"inputs": {
"audio_latent": [
"5189:5083",
0
],
"negative": [
"5189:5094",
1
],
"positive": [
"5189:5094",
0
]
},
"_meta": {
"title": "🅛🅣🅧 Set Audio Ref Tokens"
}
},
"5189:5099": {
"class_type": "LTXVSetAudioRefTokens",
"inputs": {
"audio_latent": [
"5189:5070",
1
],
"negative": [
"5189:5082",
1
],
"positive": [
"5189:5082",
0
]
},
"_meta": {
"title": "🅛🅣🅧 Set Audio Ref Tokens"
}
},
"5191:77": {
"class_type": "GetVideoComponents",
"inputs": {
"video": [
"5188",
0
]
},
"_meta": {
"title": "Get Video Components"
}
},
"5191:78": {
"class_type": "GetVideoComponents",
"inputs": {
"video": [
"5189:5062",
0
]
},
"_meta": {
"title": "Get Video Components"
}
},
"5191:79": {
"class_type": "ImageStitch",
"inputs": {
"direction": "down",
"image1": [
"5191:77",
0
],
"image2": [
"5191:78",
0
],
"match_image_size": False,
"spacing_color": "white",
"spacing_width": 0
},
"_meta": {
"title": "Stitch Images"
}
},
"5191:80": {
"class_type": "CreateVideo",
"inputs": {
"audio": [
"5191:77",
1
],
"bit_depth": "auto",
"codec": "none",
"color_space": "sRGB",
"fps": [
"5191:77",
2
],
"images": [
"5191:79",
0
]
},
"_meta": {
"title": "Create Video"
}
}
})
workflow.set_input("5188", "file", client.assets.from_url("https://comfy.org/catalog-media/1c731953-3989-4103-ab64-6e34cd226332/73ad917e-c935-4746-be03-2c478b979f32"))
# run() also passes api_key to the partner nodes in this workflow.
job = client.run(workflow, api_key=api_key)
for output in job.get_outputs("5187"):
output.to_file(output.name)
for output in job.get_outputs("5192"):
output.to_file(output.name)Try an example
About this workflow
This workflow restores archival or degraded footage in one pass using an LTX 2.3 backbone guided by a Dearchive LoRA. It starts by decoding your clip with LoadVideo and reading timing/size data via GetVideoComponents, then routes frames through the restoration core before re-encoding to a clean MP4 with SaveVideo. The defaults are tuned to reduce common archive artifacts such as heavy grain, flicker, scratches, and compression noise, while keeping the original framing and timing intact.
Under the hood, two custom nodes (IDs: 14beb77c-6207-496b-9559-1eeb98b2ee76 and 5784f1cc-cf8c-4289-9c5b-2e837048198f) implement the LTX 2.3 model pass and apply the Dearchive LoRA. GetVideoComponents feeds FPS and resolution forward so the SaveVideo node can encode at the correct timing, helping maintain temporal consistency. If the custom nodes expose a LoRA weight/strength parameter, you can fine-tune the level of restoration: higher values push stronger cleaning, lower values retain more original texture.
Questions & answers
The restoration is performed by two custom nodes in this graph (IDs: 14beb77c-6207-496b-9559-1eeb98b2ee76 and 5784f1cc-cf8c-4289-9c5b-2e837048198f). They run the LTX 2.3 model with a Dearchive LoRA to clean frames. LoadVideo/GetVideoComponents handle decoding and timing; SaveVideo encodes the result.
ComfyUI’s SaveVideo typically exports without audio unless the graph explicitly routes audio to it. This template uses GetVideoComponents for FPS/size; if audio is not wired to SaveVideo, export will be silent. If you need audio, remux the original track with the cleaned video using a tool like ffmpeg, or add audio passthrough in the graph.
If the custom restoration node exposes a LoRA weight/strength parameter, lower values preserve more original grain/texture (e.g., 0.5–0.7), while higher values apply stronger cleanup (e.g., 0.8–1.0). If no strength control is visible, use the defaults and adjust resolution or encode settings to balance sharpness and cleanliness.
Performance depends on your GPU. 720p–1080p clips of a few minutes are a good starting point. For longer or 4K material, process in segments or downscale first, then upscale after restoration. Reducing resolution or clip length helps avoid VRAM limits and speeds up processing.