Difforum · Director (timeline)
The Difforum Director Is the Whole Shot, Drawn With a Mouse
- 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
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-2dis flat moves you can express as an affine warp.3dgives 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.1is 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.
Inputs (21)
| Name | Type | Default | Description |
|---|---|---|---|
| params | DIFFORUM_PARAMS | From Setup: the timeline length and fps. | |
| timeline | STRING | {"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_mode | COMBO | 2d | 2d: flat moves (zoom, pan, roll). 3d: real parallax when a depth map reaches the renderer; 3D moves without depth become pseudo-3D. |
| look | COMBO | cinematic | One aesthetic for every renderer. Feedback Sampler: colour lock, detail, grain and extra energy. H3 / LTX: a style sentence at the head of the prompt. |
| transition | FLOAT | 1.000–1 | How much of each camera block eases into the next. 1 = one continuous crane move, 0 = hard cuts between blocks. |
| camera_scale | FLOAT | 1.000–4 | Master multiplier on every move. 0.5 = everything half as far, 2 = twice. |
| energy_bias | FLOAT | 0.00-0.3–0.3 | Moves the whole energy (denoise) curve up or down. +0.1 = more re-imagining everywhere. |
| variation | FLOAT | 0.000–1 | 0 = exactly as drawn. Above 0, each block gets small seeded changes in speed and amount - useful for variations of the same shot. |
| variation_seed | INT | 00–4294967295 | Seed for those variations: change it for another take. |
| clipopt | CLIP | Connect the CLIP of your image model to encode the scene prompts: the Feedback Sampler and Restyle then travel through them. | |
| audioopt | DIFFORUM_AUDIO | From Audio Analyzer: enables the per-block audio reactions (beat pulse, bass speed...). | |
| timeline_inopt | STRING | A 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. | |
| externalopt | COMBO | replace | How 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. |
| imagesopt | IMAGE | Pictures 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_1opt | IMAGE | Picture 1, any size (cropped to the canvas). Pinned in order, after `images`. | |
| image_2opt | IMAGE | Picture 2, any size (cropped to the canvas). Pinned in order, after `images`. | |
| image_3opt | IMAGE | Picture 3, any size (cropped to the canvas). Pinned in order, after `images`. | |
| image_4opt | IMAGE | Picture 4, any size (cropped to the canvas). Pinned in order, after `images`. | |
| image_5opt | IMAGE | Picture 5, any size (cropped to the canvas). Pinned in order, after `images`. | |
| image_6opt | IMAGE | Picture 6, any size (cropped to the canvas). Pinned in order, after `images`. | |
| images_atopt | COMBO | scene starts | Where the pictures land: the start of each scene, the Keys markers, or spread evenly from the first to the last frame. |
Outputs (8)
| Name | Type | Description |
|---|---|---|
| direction | DIFFORUM_DIRECTION | — |
| camera | DIFFORUM_CAMERA | — |
| strength | DIFFORUM_SCHEDULE | — |
| prompts | DIFFORUM_PROMPT | — |
| camera_text | STRING | — |
| info | STRING | — |
| keyframes | IMAGE | — |
| indices | STRING | — |