Nodes/LTX Director Motion Brush/LTX Director Motion Brush V2
ComfyUI Node

LTX Director Motion Brush V2

Draw the motion you want in LTX 2.3 — and keep your storyboard

By exportAnything·Created 3 months ago·Updated 2 months ago· 24
LTX Director Motion Brush V2
  • model
  • clip
  • audio_vae
  • optional_latent
  • model
  • positive
  • video_latent
  • audio_latent
  • guide_data
  • motion_guide_data
  • frame_rate
  • combined_audio
  • motion_tracks
start_second0.00
end_second5.00
duration_seconds5.00
start_frame0
end_frame120
duration_frames120
timeline_data
motion_tracks_data{"version":1,"segments":[]}
local_prompts
segment_lengths
epsilon0.0010
guide_strength
global_prompt
use_custom_audiofalse
use_custom_motiontrue
inpaint_audiotrue
frame_rate24
display_modeseconds
custom_width0
custom_height0
resize_methodmaintain aspect ratio
divisible_by32
img_compression18
override_audiofalse

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 positions
  • motion_guide_data - the per-segment motion track payload
  • motion_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

  • model and clip - 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 default 0.001 for sharp cuts; try 0.5 or 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) and guide_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.

CategoryexportAnything/LTX Motion Brush

Inputs (28)

NameTypeDefaultDescription
modelMODEL
clipCLIP
start_secondFLOAT0.000–1000Start time in seconds of the timeline generation.
end_secondFLOAT5.000–1000End time in seconds of the timeline generation.
duration_secondsFLOAT5.000.1–1000Total timeline duration in seconds (computed/synced from frames).
start_frameINT00–10000Start frame of the timeline generation.
end_frameINT1201–10000End frame of the timeline generation.
duration_framesINT1201–10000Total timeline length in pixel-space frames. Used by the editor for visual scale only.
timeline_dataSTRINGJSON state of the timeline editor (auto-managed; do not edit by hand).
motion_tracks_dataSTRING{"version":1,"segments":[]}JSON state of per-segment motion brush tracks managed by the editor.
local_promptsSTRINGAuto-populated from the timeline editor.
segment_lengthsSTRINGAuto-populated from the timeline editor (pixel-space frame counts).
epsilonFLOAT0.00100.0001–0.99Penalty decay parameter. Values below ~0.1 all produce sharp boundaries (paper default 0.001). For softer transitions, try 0.5 or higher.
guide_strengthSTRINGAuto-populated from the timeline editor (comma-separated guide strengths for image segments).
audio_vaeoptVAEOptional. Connect an Audio VAE to generate audio latents.
optional_latentoptLATENTOptional. Connect a latent to override the auto-generated one.
global_promptoptSTRINGConditions the entire video. Anchors persistent characters, objects, and scene context.
use_custom_audiooptBOOLEANfalseToggle between using timeline audio (ON) and generating audio from scratch (OFF).
use_custom_motionoptBOOLEANtrueToggle between using timeline motion guidance (ON) and ignoring motion video segments (OFF).
inpaint_audiooptBOOLEANtrueToggle whether empty gaps in the audio track are inpainted with generated audio.
frame_rateoptFLOAT241–240Frames per second — only affects how time is displayed in the timeline editor when time_units is set to 'seconds'.
display_modeoptCOMBOsecondsDisplay the ruler, segment ranges, length input, and total in frames or seconds. Internal storage is always pixel-space frames.
custom_widthoptINT00–8192Target output width for all image segments. Set to 0 to use the original image width.
custom_heightoptINT00–8192Target output height for all image segments. Set to 0 to use the original image height.
resize_methodoptCOMBOmaintain aspect ratioHow to resize image segments to fit the target dimensions.
divisible_byoptINT321–256Snap the final output image dimensions to be divisible by this number (e.g. 32 for LTX).
img_compressionoptINT180–100H.264 CRF compression to apply to each guide image. 0 = no compression, higher = more artefacts.
override_audiooptBOOLEANfalseUse the audio from the IC-LoRA video instead of using the audio track.

Outputs (9)

NameTypeDescription
modelMODEL
positiveCONDITIONING
video_latentLATENTAuto-generated LTXV empty latent (only populated when no latent is connected).
audio_latentLATENTAuto-generated audio latent (uses custom audio if enabled).
guide_dataGUIDE_DATA
motion_guide_dataMOTION_GUIDE_DATA
frame_rateFLOATThe frame rate used for the timeline.
combined_audioAUDIOCombined timeline audio layout.
motion_tracksSTRING