Nodes/Difforum/Difforum · Director (timeline)
ComfyUI Node

Difforum · Director (timeline)

The Difforum Director Is the Whole Shot, Drawn With a Mouse

By chillithebillis·Created 4 months ago·Updated 11 days ago· 10
Difforum · Director (timeline)
  • params
  • clip
  • audio
  • images
  • image_1
  • image_2
  • image_3
  • image_4
  • image_5
  • image_6
  • direction
  • camera
  • strength
  • prompts
  • camera_text
  • info
  • keyframes
  • indices
◄timeline{"version": 2, "scenes": [{"start": 0, "mood": "calm", "prompt": "misty ancient forest at dawn, volumetric light, wide shot"}, {"start": 30, "mood": "build", "prompt": "glowing roots and moss, bioluminescent details, macro"}, {"start": 60, "mood": "climax", "prompt": "explosion of light, cosmic transformation, high contrast"}, {"start": 90, "mood": "resolve", "prompt": "embers becoming stars, calm, vast cosmic scale"}], "camera": [{"start": 0, "move": "zoom_in", "speed": 0.8, "intensity": 0.8, "ease": "ease_in_out"}, {"start": 30, "move": "pan_right", "speed": 1.0, "intensity": 0.8, "ease": "ease_in_out"}, {"start": 60, "move": "spiral", "speed": 1.4, "intensity": 1.1, "ease": "ease_in"}, {"start": 90, "move": "zoom_out", "speed": 0.6, "intensity": 0.5, "ease": "ease_out"}], "keys": [{"start": 60, "label": "the light breaks"}], "energy": [], "guidance": []}►
◄camera_mode2d►
◄lookcinematic►
◄transition1.00►
◄camera_scale1.00►
◄energy_bias0.00►
◄variation0.00►
◄variation_seed0►
◄timeline_in—►
◄externalreplace►
◄images_atscene starts►

Deforum's original sin was that you expressed a camera move as a text schedule - 0:(0), 60:(2*sin(2*pi*t/30)) - and then waited four minutes to find out you typed it wrong. The Director is Difforum's answer to that: three tracks you edit with the mouse, a play button, and a preview that uses the same engine that renders.

What it actually is

One node holds the entire creative brief for a clip. Scenes are prompt + mood (calm, build, climax, resolve). Camera is a list of blocks, each one a preset move picked from the pack's 25 (zoom_in, orbit_right, dolly_zoom, spiral, handheld, vortex...) with speed, intensity, lens and easing. Energy is the denoise curve - how hard each moment gets re-imagined. There's also a Keys track for "something must happen here" moments.

The timeline widget is JSON, and yes, it looks intimidating. Ignore it. The timeline editor below writes it for you, and the tooltip says as much. What you do need to know is that everything downstream reads this node and nothing else until you deliberately override it.

The wire that matters

direction is a single cable carrying camera, energy curve, scene prompts, keys and look. Feedback Sampler takes it, so do H3 Guides, H3 Shot, Guide Frames, Keyframes, Camera → Prompt and Camera Export. The separate camera, strength, prompts and camera_text outputs exist for custom graphs where you want just one slice.

Two settings decide whether you're happy with it:

  • camera_mode - 2d is flat moves you can express as an affine warp. 3d gives real parallax, but only if a depth map reaches the renderer. Without depth, 3D moves degrade to pseudo-3D (dolly becomes zoom) and the run report tells you so instead of silently freezing, which is the behaviour that made old Deforum 3D mode a coin flip.
  • energy_bias - shifts the whole denoise curve. +0.1 is more re-imagining everywhere. It's the fastest way to turn a shot from "drifting photograph" into "melting dream" without redrawing the curve.

look is the sleeper here: cinematic, documentary, deforum_morph, animatediff_dream, disco_diffusion, vqgan_clip, flicker_experimental, psychedelic, music_video, stop_motion, hand_drawn. The Feedback Sampler reads it as colour lock, detail and energy; H3 and LTX get it as a style sentence at the head of the prompt. Pick it once and the same aesthetic survives a renderer swap. variation + variation_seed then nudge each block's speed and amount so you can roll five takes off one drawing.

The optional clip input is worth wiring if you're using an image model: the Director encodes the scene prompts itself, and the sampler travels through them. Skip it and you get one prompt for the whole clip. The audio input only enables per-block reactions - without Audio Analyzer connected there's no audio to react to.

Outputs, briefly

direction goes to a renderer or bridge. camera goes to Guide Frames, Storyboard or Export. strength is a ready schedule you can drop straight into the Feedback Sampler's strength socket to override the energy curve by hand.

Install

Manager → search "Difforum", or:

cd ComfyUI/custom_nodes && git clone https://github.com/chillithebillis/Difforum.git difforum

Restart, then open Templates → Difforum and start with 01_storyboard_no_model - that one needs no model at all. requirements.txt is numpy; everything else is optional and lazily imported.

Where people get burned

The most common failure is wiring the Director but not Setup. Every Difforum node wants params - frames, fps, width, height - and the nodes raise a plain error rather than guessing. The same Setup should feed the whole graph. The other trap is 3D mode on a flat image with no depth map; it works, it just isn't 3D, and it's easy to spend an afternoon wondering why the parallax feels wrong.

CategoryDifforum/2 · Direction

Inputs (21)

NameTypeDefaultDescription
paramsDIFFORUM_PARAMSFrom Setup: the timeline length and fps.
timelineSTRING{"version": 2, "scenes": [{"start": 0, "mood": "calm", "prompt": "misty ancient forest at dawn, volumetric light, wide shot"}, {"start": 30, "mood": "build", "prompt": "glowing roots and moss, bioluminescent details, macro"}, {"start": 60, "mood": "climax", "prompt": "explosion of light, cosmic transformation, high contrast"}, {"start": 90, "mood": "resolve", "prompt": "embers becoming stars, calm, vast cosmic scale"}], "camera": [{"start": 0, "move": "zoom_in", "speed": 0.8, "intensity": 0.8, "ease": "ease_in_out"}, {"start": 30, "move": "pan_right", "speed": 1.0, "intensity": 0.8, "ease": "ease_in_out"}, {"start": 60, "move": "spiral", "speed": 1.4, "intensity": 1.1, "ease": "ease_in"}, {"start": 90, "move": "zoom_out", "speed": 0.6, "intensity": 0.5, "ease": "ease_out"}], "keys": [{"start": 60, "label": "the light breaks"}], "energy": [], "guidance": []}Written by the timeline editor below (scenes, camera, keys, energy). Edit it there.
camera_modeCOMBO2d2d: flat moves (zoom, pan, roll). 3d: real parallax when a depth map reaches the renderer; 3D moves without depth become pseudo-3D.
lookCOMBOcinematicOne aesthetic for every renderer. Feedback Sampler: colour lock, detail, grain and extra energy. H3 / LTX: a style sentence at the head of the prompt.
transitionFLOAT1.000–1How much of each camera block eases into the next. 1 = one continuous crane move, 0 = hard cuts between blocks.
camera_scaleFLOAT1.000–4Master multiplier on every move. 0.5 = everything half as far, 2 = twice.
energy_biasFLOAT0.00-0.3–0.3Moves the whole energy (denoise) curve up or down. +0.1 = more re-imagining everywhere.
variationFLOAT0.000–10 = exactly as drawn. Above 0, each block gets small seeded changes in speed and amount - useful for variations of the same shot.
variation_seedINT00–4294967295Seed for those variations: change it for another take.
clipoptCLIPConnect the CLIP of your image model to encode the scene prompts: the Feedback Sampler and Restyle then travel through them.
audiooptDIFFORUM_AUDIOFrom Audio Analyzer: enables the per-block audio reactions (beat pulse, bass speed...).
timeline_inoptSTRINGA timeline from outside: Shot Script, an LLM node, a text loader. Plain shot lines ('0s | calm | dolly_in slow | prompt'), CSV or Director JSON. The editor shows the result after each run; disconnect to edit by hand.
externaloptCOMBOreplaceHow timeline_in meets the drawn timeline. replace: all from outside. text only: scenes and keys from outside, your drawn camera stays. camera only: the reverse. add to drawn: both, outside wins on the same frame.
imagesoptIMAGEPictures pinned to moments of the clip, in order (a batch: Keyframe Assets, Scene Stills, Batch Images). They travel on the direction wire: the Feedback Sampler passes through them, H3 / LTX Guides anchor them, the Animatic shows them.
image_1optIMAGEPicture 1, any size (cropped to the canvas). Pinned in order, after `images`.
image_2optIMAGEPicture 2, any size (cropped to the canvas). Pinned in order, after `images`.
image_3optIMAGEPicture 3, any size (cropped to the canvas). Pinned in order, after `images`.
image_4optIMAGEPicture 4, any size (cropped to the canvas). Pinned in order, after `images`.
image_5optIMAGEPicture 5, any size (cropped to the canvas). Pinned in order, after `images`.
image_6optIMAGEPicture 6, any size (cropped to the canvas). Pinned in order, after `images`.
images_atoptCOMBOscene startsWhere the pictures land: the start of each scene, the Keys markers, or spread evenly from the first to the last frame.

Outputs (8)

NameTypeDescription
directionDIFFORUM_DIRECTION—
cameraDIFFORUM_CAMERA—
strengthDIFFORUM_SCHEDULE—
promptsDIFFORUM_PROMPT—
camera_textSTRING—
infoSTRING—
keyframesIMAGE—
indicesSTRING—