LTX Director Motion Brush V2
Draw the motion you want in LTX 2.3 — and keep your storyboard
- model
- clip
- audio_vae
- optional_latent
- model
- positive
- video_latent
- audio_latent
- guide_data
- motion_guide_data
- frame_rate
- combined_audio
- motion_tracks
LTX 2.3 is the fastest local video model that's actually good, but controlling what moves has always been its weak spot. You type "camera pushes in, character looks up" and get five static seconds of a slowly zooming image. This node is the answer: a storyboard timeline where you drop keyframe images, then literally draw motion tracks on top of them with your mouse, and the timeline turns your scribbles into LTX 2.3's IC-LoRA motion-track conditioning.
It's the rebuilt "Motion Brush" edition of WhatDreamsCost's LTX Director v2, packaged by exportAnything for the LTX 2.3 era. Fair warning: this is the nightly channel (v0.1.x), for people comfortable testing new nodes - the author was upfront about that at release. Still very usable; don't expect a finished product.
How it works
You build a timeline in the node's UI: one storyboard image per segment, each with its own prompt, duration, and guide strength. Motion Brush mode lets you draw per-image motion tracks - brush strokes that represent where things (or the camera) should move across that segment's frames. The node packages all of that into structured outputs:
guide_data- the Director keyframes, strengths, and insert-frame positionsmotion_guide_data- the per-segment motion track payloadmotion_tracks- the raw track JSON that a sibling Guide node renders into the sparse-track control video IC-LoRA eats
It also encodes your storyboard prompts into the positive conditioning - that's the "Prompt Relay" mechanism inherited from Director, and epsilon controls how hard the segment boundaries are (see below).
The inputs that matter
modelandclip- your LTX 2.3 model and text encoder, same as any LTXVideo workflow.start_second/end_second- the friendly way to set your clip. The frame equivalents exist but you mostly won't touch them.global_prompt- conditions the entire video. This is where you anchor a persistent character or scene so the storyboard doesn't reinvent them per segment.epsilon- penalty decay at segment boundaries. Leave it at the paper default0.001for sharp cuts; try0.5or higher for soft, blended transitions.guide_strength- auto-populated from the editor, comma-separated per image segment. This is how hard each keyframe is held.use_custom_motion- ON keeps your drawn motion tracks in play, OFF ignores them.- Carry Motion - lives in the timeline, defaults to 0 for anti-bleed. Leave it there until you want one image's motion to deliberately spill into the next; the samples push it to 16–32 frames for "motion carry" transitions.
Two guardrails worth knowing: while Motion Brush is active, resize_method is locked to "maintain aspect ratio", and divisible_by snaps to 32 for LTX's grid. Retake Mode (re-generating a section of an existing video) enforces a 6-second minimum selection.
What comes out
The outputs are model (with timeline conditioning baked in), positive, video_latent and audio_latent (auto-generated empties unless you connect overrides), guide_data, motion_guide_data, frame_rate, combined_audio, and motion_tracks. LTX 2.3 generates synchronized audio, so audio_vae, use_custom_audio, and inpaint_audio let you blend in real audio and fill gaps. The wiring from here: motion_tracks → the Guide node, guide_data → the Director Guide / Retake Source Preview, positive + audio → your sampler.
Install
Install through ComfyUI Manager (search "LTX Director Motion Brush"), via the Comfy CLI, or clone it:
comfy node install ltx-director-motion-brush
# or
cd ComfyUI/custom_nodes
git clone https://github.com/exportAnything/ComfyUI-LTX-Director-Motion-Brush.git
Restart ComfyUI after installing. The pack itself has no Python dependencies - the real requirements are sibling custom nodes: ComfyUI-LTXVideo, comfyui-kjnodes, and ComfyUI-Impact-Pack (ComfyUI-GGUF only for the very-low-VRAM GGUF workflow). Model side, you need your usual LTX 2.3 checkpoint/text encoders/VAE plus Lightricks' IC-LoRA Ingredients and IC-LoRA Motion-Track-Control LoRAs from HuggingFace. Timeline uploads land in ComfyUI/input/exportanything.
Common issues
- Segments ignoring their timing. This is the inherited Director complaint. The author reworked the node with "hard barriers" per image - if one segment still bleeds, check
epsilon(lower = harder boundary) andguide_strength. - Ghosting/trails on distilled models at low quality settings. Known behavior; it clears up at higher settings or on the full model.
- Tracks not showing up. Turn Motion Brush on before drawing, not after - the editor only saves what it recorded in the right mode.
- "Missing node" on load. Check the three required packs above first; this is usually an LTXVideo/kjnodes/Impact-Pack problem, not a Motion Brush problem.
It's a nightly pack, so updating will occasionally change behavior - that's the deal. For output, it's the most direct control you'll get over an LTX 2.3 shot without leaving ComfyUI.
Inputs (28)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| clip | CLIP | — | |
| start_second | FLOAT | 0.000–1000 | Start time in seconds of the timeline generation. |
| end_second | FLOAT | 5.000–1000 | End time in seconds of the timeline generation. |
| duration_seconds | FLOAT | 5.000.1–1000 | Total timeline duration in seconds (computed/synced from frames). |
| start_frame | INT | 00–10000 | Start frame of the timeline generation. |
| end_frame | INT | 1201–10000 | End frame of the timeline generation. |
| duration_frames | INT | 1201–10000 | Total timeline length in pixel-space frames. Used by the editor for visual scale only. |
| timeline_data | STRING | JSON state of the timeline editor (auto-managed; do not edit by hand). | |
| motion_tracks_data | STRING | {"version":1,"segments":[]} | JSON state of per-segment motion brush tracks managed by the editor. |
| local_prompts | STRING | Auto-populated from the timeline editor. | |
| segment_lengths | STRING | Auto-populated from the timeline editor (pixel-space frame counts). | |
| epsilon | FLOAT | 0.00100.0001–0.99 | Penalty decay parameter. Values below ~0.1 all produce sharp boundaries (paper default 0.001). For softer transitions, try 0.5 or higher. |
| guide_strength | STRING | Auto-populated from the timeline editor (comma-separated guide strengths for image segments). | |
| audio_vaeopt | VAE | Optional. Connect an Audio VAE to generate audio latents. | |
| optional_latentopt | LATENT | Optional. Connect a latent to override the auto-generated one. | |
| global_promptopt | STRING | Conditions the entire video. Anchors persistent characters, objects, and scene context. | |
| use_custom_audioopt | BOOLEAN | false | Toggle between using timeline audio (ON) and generating audio from scratch (OFF). |
| use_custom_motionopt | BOOLEAN | true | Toggle between using timeline motion guidance (ON) and ignoring motion video segments (OFF). |
| inpaint_audioopt | BOOLEAN | true | Toggle whether empty gaps in the audio track are inpainted with generated audio. |
| frame_rateopt | FLOAT | 241–240 | Frames per second — only affects how time is displayed in the timeline editor when time_units is set to 'seconds'. |
| display_modeopt | COMBO | seconds | Display the ruler, segment ranges, length input, and total in frames or seconds. Internal storage is always pixel-space frames. |
| custom_widthopt | INT | 00–8192 | Target output width for all image segments. Set to 0 to use the original image width. |
| custom_heightopt | INT | 00–8192 | Target output height for all image segments. Set to 0 to use the original image height. |
| resize_methodopt | COMBO | maintain aspect ratio | How to resize image segments to fit the target dimensions. |
| divisible_byopt | INT | 321–256 | Snap the final output image dimensions to be divisible by this number (e.g. 32 for LTX). |
| img_compressionopt | INT | 180–100 | H.264 CRF compression to apply to each guide image. 0 = no compression, higher = more artefacts. |
| override_audioopt | BOOLEAN | false | Use the audio from the IC-LoRA video instead of using the audio track. |
Outputs (9)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| positive | CONDITIONING | — |
| video_latent | LATENT | Auto-generated LTXV empty latent (only populated when no latent is connected). |
| audio_latent | LATENT | Auto-generated audio latent (uses custom audio if enabled). |
| guide_data | GUIDE_DATA | — |
| motion_guide_data | MOTION_GUIDE_DATA | — |
| frame_rate | FLOAT | The frame rate used for the timeline. |
| combined_audio | AUDIO | Combined timeline audio layout. |
| motion_tracks | STRING | — |