Academia SD Moviola Guide
Pin the previous take to frame 0 without a VAE round trip
- positive
- av_latent
- positive
This is the node in the Moviola trio that decides whether two clips join or just sit next to each other. Moviola In hands you the previous take's final frame; Moviola Guide puts that frame into the conditioning as a keyframe at frame 0, so the new clip starts by continuing the old one instead of approximating it from a prompt.
Keyframe, not reference - and the difference is not cosmetic
Both take an image, which is why people wire the wrong one and wonder why the cut still jars.
A reference - ref_images on the H3 nodes, a RefMod elsewhere - tells the model what the subject looks like. It's attended across the whole sequence with no temporal position attached. Your character survives, your shot does not: the model is free to open the new clip on a static pose that merely resembles where you left off.
A keyframe carries resolved_frame_index. That's the temporal anchor, and it's the only one of the two that says "this exact image is frame 0". The core Add Guide node builds these too - Moviola Guide exists because of how it builds them. Add Guide takes an IMAGE and calls vae.encode() internally, forcing a trip through an 8-bit PNG and a full re-encode on every pass. Guide skips it: it reads the latent Moviola Out already saved next to the PNG and injects that, so the VAE round trip leaves the loop. That's the right call - every encode/decode cycle is another chance to lose a little motion.
The inputs and outputs
positive(CONDITIONING, in and out) - take it from the H3 node'spositiveoutput, and hand the returned conditioning to your guider. It's the same conditioning object, with aminimax_keyframesentry appended: a list holding{"resolved_frame_index": frame_idx, "latent": <the saved latent>}.project_path- same string as In and Out (defaultmoviola/toma). It reads from the output folder, finds the highest-numbered PNG, and looks for the matching.safetensorsnext to it.frame_idx- where to anchor.0for chaining takes end-to-end. Anything else is a keyframe dropped mid-clip, which is the same mechanism with a different job.av_latent(optional) - feed it the clip's latent from the H3 node (the thing the sampler is going to denoise). Guide doesn't modify it; it uses it to check the saved frame's latent dimensions against the clip you're about to generate, and it only bothers when the latent is 5D.
That check earns its keep. Change resolution mid-loop and the saved keyframe can't fit the new clip - without av_latent connected, the model fails somewhere far downstream with a traceback that never mentions Moviola. With it connected, Guide raises a plain error naming both sizes and telling you to empty the folder or go back to the previous resolution.
Wiring it into a loop
H3 node (positive) ──► Moviola Guide.positive ──► BasicGuider.conditioning
H3 node (LATENT) ──► Moviola Guide.av_latent
Guide sits between the text encode / H3 node and the guider. Nothing else changes: sampler, sigmas, LoRA, all as usual. First pass, the folder is empty, there's no latent to read, and Guide passes the conditioning through untouched with a line in the console. That's intentional - pass one has nothing to anchor to.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/AcademiaSD/comfyui_AcademiaSD
# restart, then Add Node → Academia SD/Moviola
No dependencies beyond what ComfyUI ships - safetensors is the only one this node truly needs, and it's core. Be aware the pack README hasn't caught up to Moviola yet: it's the newest thing in the repo, undocumented and without example workflows. The author runs the @Academia SD tutorial channel and normally puts a video behind every node; these three don't have one yet.
Where people get burned
A missing .safetensors is a silent continuity break. Guide needs the latent that pairs with the highest-numbered PNG. Delete, move or hand-edit that file and Guide doesn't complain loudly - it prints "no latent to anchor, conditioning passed through unchanged" and generates a clip that merely looks like a continuation. If your seams suddenly go mushy, read the console before you blame the sampler.
It's an H3-shaped key. The entry it appends is minimax_keyframes. Wire Guide into an LTX or Wan graph and nothing reads that key - you'll get no error and no anchoring. This pair of nodes is for MiniMax H3, and H3's licence excludes the US, EU, UK and South Korea from the licensed territory, so check that before you build a pipeline on it.
Don't touch the files mid-loop. The whole design is "the folder is the state". Renumbering or pruning takes while the loop is running gives Guide a PNG and latent that disagree about which take they belong to.
It always re-runs. IS_CHANGED returns float("NaN") on purpose, because the disk changes even when your inputs don't. That's what you want in a loop, and it's also why a Moviola graph never feels cached.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | — | |
| project_path | STRING | moviola/toma | — |
| frame_idx | INT | 00–9999 | — |
| check_resolution | BOOLEAN | false | What to do when the saved frame and the target clip have different latent sizes. 'fit' rescales the frame to the target, which is what a latent-upscaling loop needs. 'check' refuses instead, to catch a resolution changed by mistake mid-project. |
| av_latentopt | LATENT | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |