Support
Everything here is free and stays free — the format spec, the nodes, the workflows, the cartridges, the LoRAs. If it saved you a night of debugging (it contains several hundred of mine), tips keep the 5090 warm:
🔁 Liberapay (recurring)
⚡ Or right here: the Civitai tip button on this page sends Buzz directly.
2.6.0 adds the extend take
One prompt, one continuous speech, as long as you want. Set take_seconds on MASTER CONTROLS - or open H3_Extend_Take, now the main workflow - and give the writer one premise. The panel sizes a window for your card and the count that fills the time; the writer writes ONE speech and cuts it across the windows at sentence boundaries; the chain continues it in H3's own voice, no TTS, no per-shot budgeting. Verified: seven renders including a 65-second seven-window take, every join continued the speech. Details in this version's notes.
Known limit in 2.6.0: the chain's texture ratchet is not fully solved for long takes - we measure about +13% fine texture per join at 736x1280 with every anti-drift setting on. Under about 4 windows (30-40 seconds) it is slight; at 7 windows it is visible sharpening. Keep extend takes to about 4 windows for now; a fix is in progress.
2.5 is the memory release
Four new memory systems, all measured, two of them fully automatic:
The random-slowdown fix (automatic). High-resolution renders used to take anywhere from 27 minutes to 3 hours for identical work - a lottery caused by the Windows driver quietly demoting GPU memory when the card fills past roughly 95%. The pack now detects that zone and streams a few GB of weights instead of riding the ceiling. The lottery render became 15 minutes, every time. Nothing to configure.
low_ram_master. Long chains used to hold every finished shot in system RAM until the final join - tens of GB at the very last step, after all the sampling was already paid for. Switch it on and shots stream to lossless disk staging as they finish; peak RAM stays near two shots no matter how long the chain, with verified-identical output.Remote text encoder. The text encoder runs for seconds per shot and holds 15+ GB the rest of the time. Point the new node at any second PC running ComfyUI with this pack and that memory leaves your render card - identical results, verified across machines, with a local cache so repeated text never touches the network. One flag on the switches panel turns it on; it ships off.
H3 TAE Decode. 2-second full-resolution draft previews from a 9 MB tiny decoder, versus about a minute per shot through the real VAE. For seed hunts and batch triage, never finals.
Plus a Speed Boosters panel - Spectrum, TeaCache, block cache and ComfyUI's own EasyCache, each measured (-11% to -29%) and eye-tested. All ship OFF: the three real ones are faster but can visibly distort people, and block cache turned out to do nothing at 14 steps (0 hits measured on every run) - honest notes on each. Defaults across the workflows are retuned for 16-24 GB cards. Full details in this version's notes.
Guides
Make talking videos with MiniMax-H3: the 5-minute guide - what to open, what to type, what each setting costs your card.
Every setting explained: the deep manual - every workflow, every dial, what it does and what breaks if you move it.
What this is
A ComfyUI node pack and three workflows that render a multi-shot MiniMax-H3 scene as one continuous take: no visible cut at the shot boundaries, no colour shift between shots, and continuous audio across the whole piece. H3 natively generates blocks of roughly 10-15 seconds; this pack chains those blocks into arbitrarily long scenes and hands back a single master video with a single master audio track.
How identity holds with no reference images
This is the part most people do not expect. A 40-second two-character scene held both faces across every shot with zero reference images supplied. Two mechanisms do it, and neither works alone.
The frame relay carries the instance. Every shot begins from an actual rendered picture of the character - the previous shot's last frame - so the specific face, the wardrobe weathering, the exact hair propagate as pixels rather than being re-imagined from text. Drift can only accumulate per join, not per frame.
Verbatim text carries the category. Repeating each character's appearance description word-for-word in every shot re-asserts everything a picture cannot pin down, and authors anyone who walks into frame partway through. Once they are in a handed-over frame, they join the relay too.
Reference images and the identity bank are still there for long chains, characters who leave frame for a long stretch, or when you need a specific pre-existing face - they are just no longer the price of entry.
Voice identity across the chain
Chained shots used to re-perform the voice from text each time, and it drifted. Two controls end that, and the shipped default turns one of them on:
voice_ref- feed a clean solo speech clip and it anchors every shot as<Audio 1>. Mono clips, sample rate and length are all guarded internally.self_anchor_voice- no file at all. Shot 1's own rendered voice becomes the reference for every later shot. Write shot 1 so the character speaks a clean solo line.
Both ride the checkpoint's reference rows, so they need ref2va. On fl2va they do nothing except cost tokens - see the checkpoint note below.
Which workflow
Three, each with one clear reason to exist.
H3_Seamless_Chain_v2 - everything. Master controls, the LLM writer, the speed boosters, the remote encoder lane, identity and voice anchors, an episode/batch prompt source, FFLF boundary plates and an audio spine. The optional lanes ship gated off, so the default path stays simple.
H3_Seamless_Chain_CORE - the same job with zero third-party packs. Type your shots into the script box and queue. Start here if you want a render before installing anything else.
H3_Keyframes - a different job: a hand-built sampling graph for anchoring a single clip at chosen frame positions with per-anchor condition strength. Not multishot, does not chain.
Master controls, and the dials that matter
One panel drives resolution, frames per shot and steps for the sampler, and also feeds the writer so it paces dialogue to the real shot length. Shipped defaults: H3_Extend_Take 1280x736 landscape, take_seconds 30; H3_Seamless_Chain_v2 736x1280, 192 frames x 4 shots; 14 steps, euler/beta57, the curve-Q5_1 checkpoint. The resolution floor is deliberate - the base model distorts faces below roughly 1 megapixel, so shrinking the canvas to save VRAM costs you faces first. The dials worth knowing:
continuity-context_pin(raw-latent join, needs the Motion Context pack),first_frame(the model's own trained hand-off, no extra pack),cutfor episodic work, orflf_chainfor boundary plates.seed_per_shot- leave it on. Measured: varying the seed per shot holds the face; one seed for every shot drifted both face and voice. Identity lives in the conditioning, not the seed.chain_gain_control- ships atflatten. Each shot's tail anchors the next and the model returns roughly 1.3x the anchor's texture energy, so sharpness ratchets across a chain without it.Speed boosters - all ship OFF. Spectrum, TeaCache and EasyCache are real speed but can visibly distort people; block cache does nothing at the shipped 14 steps (0 hits measured on every run - only worth it at 30+ steps). The three real ones - fine for empty rooms and landscapes, compare for yourself before using them on faces. Never stack Spectrum with TeaCache: no extra speed, badly damaged output.
low_ram_master- turn ON for long chains or under 32 GB of system RAM. Shots stream to lossless disk staging instead of accumulating in RAM; identical output, verified.remote_encoder(VRAM / SPEED SWITCHES panel) - OFF by default. With a second ComfyUI PC on your network, turn it ON and the text encoder's 15+ GB moves over there. The how-to note sits next to the encoder node.output_scale/upscale_model- upscaling happens after decode, per shot, so it works with every continuity mode includingcontext_pin.output_scaleis a lanczos resize (measured 1.78x faster than rendering the same output size natively, and visibly softer - resolution, not detail);upscale_modeltakes ComfyUI's own Load Upscale Model (ESRGAN and friends) for synthesized detail.master_normalize- leave it atluma+contrast. It levels both the brightness AND the contrast of the finished chain against one global target taken from shot 1. Measured: texture growth per hop 1.126 -> 1.047 at 960x544, with contrast spread across shots falling from ~11% to under 0.5%.memory_frames- leave it at 0. The bank's RECENT slots hand each shot's accreted output forward on top of the pin, so invented detail compounds. Measured over ten shots: at the old default the drift accelerated; at 0 it holds flat, and motion continuity did not suffer.pin_frames- leave it at22. Longer pins also cut the sharpening, but the head trim scales with them, so speech planned under the replay gets clipped.Audio drifts the other way: chained audio gets duller per hop where chained video used to get sharper. There is no per-shot dial for it. For cut-grammar content it can be avoided outright:
continuity=cutwithbank_pinned=1, memory_frames=0conditions every shot's audio on shot 1 alone - measured flat.preview_first_shot- writes shot 1 the moment it decodes, so a bad take can be cancelled before the whole chain renders.
Which checkpoint
ref2va ships as the default, as the curve-Q5_1 GGUF (~14 GB): it carries the reference rows that voice anchoring and the identity bank need. fl2va has no reference rows and chains just as well - the voice rides the frame relay instead of being pinned - and it lands on a supplied frame where ref2va only nudges toward one. The two are the same file size at every quant level.
Writing a script
One prompt per shot, --- on its own line between them. The mechanics of a join are handled for you; whether the join reads as invisible is decided by the writing. These rules were each written after a specific failure:
The airlock. Every shot after the first opens holding the previous shot's exact closing arrangement, with about two quiet seconds before anyone speaks. The head of a chained shot is discarded on decode - anything you put there is thrown away.
Give the hold something to do. A held framing with nothing happening renders as a literal freeze. Write in a breath, a weight shift, an eyeline change.
Land settled. End each shot back in a stable arrangement, dialogue finished, about two seconds spare.
A line never straddles two shots. The LLM writer budgets this automatically now. Hand-writing? A chained shot at 192 or 243 frames fits roughly 6-10 spoken words; 362 frames fits 12-20. Over budget renders as crammed, garbled speech; far under budget renders slow and robotic.
Repeat the descriptions word-for-word. Each character's appearance and the room and lighting, identical in every shot. Rewording between shots is the single most common cause of a face changing mid-scene.
Silent shots with visible people: say what mouths are doing ("lips pressed closed") or the model invents mumbling. A thing revealed mid-shot is written as already present, or it pops in.
Camera cuts inside a shot are free and share one audio bed - so put cuts inside shots, and continuity between them. A worked four-shot two-hander ships as example_script.txt.
Quick fixes
A word clips at a join - the script put dialogue too close to a boundary. Move the whole line, do not split it.
Sharpening increases every shot - the texture ratchet.
chain_gain_control=flattenships on; check it was not turned off.A render randomly crawls - as of 2.5.0 the pack detects and fixes the main cause automatically (watch for the "driver headroom" line). If it still happens: drop frames or resolution, or load a smaller quant of the DiT.
The machine dies at the final join on a long chain - turn
low_ram_masterON.People look subtly wrong - if you enabled Spectrum, TeaCache or EasyCache, that is the trade. Turn them off; keep block cache.
LLM API error 404, model not found - the writer's
model_nameis not pulled on the endpoint it is pointed at. See the prompt-writer section below.Red or missing nodes - an optional pack is not installed. The optional nodes ship bypassed, so this only bites if you un-bypassed one: re-bypass it with
Ctrl+B, delete it, or use the CORE workflow.GGUF architecture error - the pack teaches ComfyUI-GGUF the
minimax_h3architecture at startup, so installing it is normally the whole fix. If the error persists, runpython apply_gguf_arch_patch.pyfrom the pack folder once and restart.Audio dulls on a very long chain - expected; restart the chain on a scene cut, where a fresh start costs nothing.
The prompt writer needs a model you actually have
The full workflow ships pointed at a local Ollama with model_name = qwen3:14b. Pull it before the first queue or the run stops immediately with LLM API error 404: model 'qwen3:14b' not found:
ollama pull qwen3:14b
Any OpenAI-compatible endpoint works - put its URL in base_url and the exact tag in model_name; ollama list prints the tags you have and it must match character for character. A remote or hosted endpoint is often the better choice, because a local writer large enough to be good competes with H3 for the same card.
Running the writer locally? Turn on unload_model_after on the writer node. It frees that model from Ollama the moment the script is written, so the video model gets the card - otherwise it sits for the server default of five minutes, which is your whole first shot.
Want no LLM at all? Set the master panel's use_file_prompts to manual entry, delete the writer, and feed your own shot script straight into the sampler's script input - one prompt per shot, separated by --- lines. The CORE workflow already works this way.
Requirements
Always: ComfyUI v0.30.0 through v0.33.1 - tested at three points and supported across the range (native MiniMax-H3 support), this node pack, a MiniMax-H3 checkpoint, the H3 text encoder, and the video and audio VAEs. The CORE workflow needs nothing else - it is built from this pack plus stock ComfyUI nodes.
For the FULL workflow. ComfyUI validates every node class in a graph before it will queue, so a missing pack stops the whole workflow - not just its own feature. Each can be removed instead; INSTALL.md gives the one-widget change or node deletion for every entry.
ComfyUI_JoyAI_Echo_GGUF_Nodes - the LLM prompt writer (
JoyEcho_LLMEnhance). It is inside the release zip - copy it intocustom_nodes/with the main pack. It is RealRebelAI's pack, modified with attribution (the NOTICE inside lists every change); use that copy, not upstream - the workflow drives inputs the upstream release does not have, and with upstream those values are dropped silently. Hand-written scripts can delete the writer instead.ComfyUI-H3-Motion-Context -
continuity = context_pin, the shipped default, plus interior keyframe anchors. Removal:continuity = first_frame.RES4LYF - the
beta57scheduler the full workflow ships with. Removal:scheduler = beta(measured cost: lip-sync 8/10 vs 10/10, everything else equal; CORE shipsbetaalready).Booster packs (Spectrum, TeaCache, block cache) - each switch names its pack and prints an install link if it is missing; the graph queues either way. EasyCache is built into ComfyUI, nothing to install.
ComfyUI-Custom-Scripts - the in-canvas script preview, a leaf node; removal: delete it.
ComfyUI-GGUF - quantised checkpoints and encoders.
Install in one click: search H3 Multishot in ComfyUI-Manager - the pack is on the Comfy Registry as comfyui-h3-multishot. The zip on this page stays the complete bundle - both node packs, the workflows and the docs.
Models
GGUF quants of the H3 checkpoint are at huggingface.co/joeygambino/MiniMax-H3-GGUF - Q8_0 for 32 GB, Q5_1 for 24-32 GB, Q4_0 for 16 GB. The shipped default is curve-Q5_1 (~14 GB), which the new automatic headroom rule keeps comfortable on 16 GB cards as well. The text encoder and both VAEs are at huggingface.co/Comfy-Org/MiniMax-H3. GGUF encoder quants are at huggingface.co/joeygambino/MiniMax-H3-encoder-GGUF; keep the -mmproj vision sidecar, and load it with this pack's H3 CLIP Loader (safetensors + GGUF) rather than the stock GGUF loader - the vision path is what carries frames between shots.
What is verified, and what is not
Stated plainly, because a release note is a claim.
Verified: chained renders reviewed blind by two independent models and reported as one continuous take with consistent colour and unbroken audio; a 40-second two-character scene holding both faces with no reference images; the streaming master at 42.8 dB against the in-RAM path; the remote encoder identical across two machines; the driver-headroom rule on both its branches; every booster measured on the same seed and eye-tested on finished video.
Not verified: very long chains still dull the audio slightly per hop.
flf_chainhas not been rendered against a fully colour-matched plate set.
Credits
The context_pin join and interior keyframe anchoring build on ComfyUI-H3-Motion-Context by NikoDemon80. The script preview uses ComfyUI-Custom-Scripts by pythongosssss. GGUF loading builds on ComfyUI-GGUF by city96. Speed boosters integrate ComfyUI-Spectrum-MiniMax-H3 by xmarre, ComfyUI-MiniMaxH3-TeaCache by Icyoung and comfyui-minimax-h3-blockcache-T8 by T8mars. Thanks to @viralesveras for contributions to earlier versions.
Free, and it stays free. If it saved you time: Ko-fi · GitHub Sponsors · Liberapay.
Description
If you ever downloaded the H3 GGUF quants and got an error the instant ComfyUI touched the file, this is the fix — and the error was never your fault or the quant's.
GGUF models now load with no manual step
ComfyUI-GGUF validates a GGUF's architecture against a fixed list and rejects anything not on it before reading a single tensor. Upstream's list has no minimax_h3 entry, so every MiniMax-H3 DiT quant died with:
Unexpected architecture type in GGUF file: 'minimax_h3'
The pack has always shipped apply_gguf_arch_patch.py to fix that, but it was one line buried in the install steps. In practice people hit the error, concluded the models were broken, and gave up — three separate people reported it across the model and workflow repos, and those are just the ones who said something.
The pack now does it for you. On startup it adds the architecture to ComfyUI-GGUF's live list in memory. Nothing is written to disk, it is idempotent, and unlike the on-disk patch it survives ComfyUI-GGUF updates instead of being reverted by them. You will see this in the console:
[H3] taught ComfyUI-GGUF the 'minimax_h3' architecture
The old script is still in the folder as a fallback for unusual setups, but you should not need it. If you previously ran it, nothing breaks — the new code sees the architecture is already known and does nothing.
The other GGUF error: text encoder and the mmproj file
Different problem, same week, so it is worth spelling out here. If your H3 text encoder GGUF fails with a state_dict or vision mismatch against its -mmproj file, load it with this pack's H3 Clip Loader (Any) rather than the stock CLIPLoaderGGUF.
The H3 encoder is a truncated Qwen3-VL-32B — 50 layers, no final norm, no lm_head — and its vision tower ships separately as the -mmproj-F16.gguf sidecar. Stock ComfyUI-GGUF only merges an mmproj when the encoder's architecture is qwen2vl. Qwen3-VL reports qwen3vl, so the sidecar is never merged at all, and the missing vision tensors surface as a state_dict mismatch. Its mmproj key map is qwen2vl-era besides: wrong merger keys, and no rules for H3's deepstack mergers or split QKV.
This pack's loader does all three things stock cannot — truncates the text tower, merges the sidecar explicitly, and renames the vision tensors to H3's layout. Keep the -mmproj file in the same folder as the encoder and do not rename either one: they are paired by filename.
And to answer the question that came up directly: a full .safetensors encoder (fp8, int8, NVFP4-AWQ, whatever) works without any of this because it is a complete, pre-shaped model with the vision tower already inside. That is a property of the container, not of the quantization — NVFP4 is not doing anything special.
Nothing else changed
Same nodes, same workflows, same defaults as v1.4. Existing graphs render identically. Upgrading is just overwriting the folder and restarting.
Thanks to the people who took the time to report the error instead of quietly writing the models off. That is the only reason it got fixed.
FAQ
Comments (4)
Is there a way to add the turbo lora node? Since to use the Turbo Lora, it is recommended to replace the standard sampler node with the H3 turbo version.
You do not need the H3 Turbo sampler or any of the extra nodes. I built a LoRA stack for my workflows that I haven't uploaded here yet. I will put it up shortly.
thx, this node is great :) but I am struggling with writing the prompts. Do you have something like a system-prompt for qwen-vl or other llms that can help writing a prompt for your node?
something where you have a input mask with a short description like:
scene 1: ........
scene 2: .......
and so on and the system prompt expand this and put it into the right format.
Hey! Sorry, just seeing this. So, I personally use Ollama with a paid account ($20/mo) + minimax-m3 and glm 5.2 cloud models (free). But a qwen 3.6 local model could avoid the subscription, and I think they are starting to release minimax local LLM abliterated models as well. This is my current system prompt for my renders - but it's pretty specific to my content (sci-fi/horror/camcorder/realism), and very long, so it would probably need some tweaking for whatever you're making;
You are the prompt rewriter for MiniMax-H3, a video+audio generation model. You receive a RIFT scene brief (premise, characters with canonical appearance blocks, dialogue lines, location, approximate length). You output the scene as one or more GENERATION BLOCKS in H3's native prompt format, and nothing else. No commentary, no markdown fences, no titles.
============================================================
HOW TO READ THIS SPEC
============================================================
Two kinds of quoted text appear below, and they are not the same instruction.
- FORMAT TOKENS are literal and must be reproduced exactly: the three field names, [Shot N] / [Shot N] At MM:SS.mmm, the <d>[English] ...</d> tags, <scenetrans>, <cutoff>, "N/A", and the camera-motion vocabulary. H3 was trained on these; they are the model's language, not house style.
- EVERYTHING ELSE quoted is an EXAMPLE, shown to demonstrate STRUCTURE, and must never be reused as wording. Phrases quoted as forbidden are forbidden; phrases quoted as illustration are one way of many. Write your own sentences for every scene.
You are not filling in a template. Two scenes that share a location, a format and a mood should still not share a sentence. If your output could be pasted into another scene unchanged, it is too generic to be doing its job.
This is a UNIVERSAL prompt. It must work whether the scene is found footage, analog horror, or ambient. The rewriter picks the right device and grammar per scene and stays consistent inside that scene; nothing here forces a per-format branch.
============================================================
ARCHITECTURE
============================================================
- One generation block covers a single H3 generation. Default per-block duration is ~15 seconds (361-362 frames at 24 fps, the operator's verified no-drift range). If the scene needs longer, split it into as many blocks as required. Separate blocks with a line containing only three dashes: ---
- SIZING (mandatory): default scene length is 30-90 seconds (2-6 blocks) unless the brief states otherwise. Speech paces at roughly 2.5 words per second - total the supplied dialogue, add room for action beats and pauses, and choose a block count where every line fits at a NATURAL pace. Never compress a scene into fewer blocks by speeding up speech: if the dialogue cannot breathe in one block, that alone requires more blocks.
- If the host application's own instructions mention "shots", a shot count, or a per-shot duration, that guidance applies to GENERATION BLOCKS (the array elements / --- sections), not to the internal [Shot N] cuts inside a block.
- EVERY block - the first and every later one - contains all three fields. Cuts inside a block use H3's native [Shot N] At MM:SS.mmm syntax (a real cut, e.g. tape stop, battery change, hard reframe). Cuts BETWEEN blocks are tape stop/start.
- Blocks are rendered in sequence; each later block begins exactly where the previous block's final frame left off. Re-state every visible character's full canonical appearance block verbatim at the start of every generation block - identity is carried by verbatim repetition across blocks.
============================================================
INTERNAL CUTS INSIDE A BLOCK (optional, use deliberately)
============================================================
A block may contain more than one [Shot N] ONLY when the scene genuinely has an in-clip discontinuity: tape flip, battery swap, hard reframe the operator commits to and stays with, time skip, screen-of-screen, POV swap. These are real Blair-Witch / late-90s grammar and the model can use them.
When you DO use an internal cut:
- [Shot 1] At 00:00.000, ...
- [Shot 2] At MM:SS.mmm, ...
- Each cut line includes the full visual reset needed (new framing, new lighting state, new action) at the timestamp. The model treats each as a fresh generation stitched at the timestamp.
- Dialogue that crosses a cut: put <scenetrans> at the break in BOTH parts and write "continues uninterrupted across the cut". Speech cut off by the video ending: <cutoff>.
- Use internal cuts SPARINGLY. Default is one continuous take per block. If you cut inside a block for taste reasons (not story-required), you are usually wrong.
============================================================
BLOCK FORMAT (exactly these three fields, in this order)
============================================================
integrated_multimodal_description: [Shot 1] <style and opening composition, then the whole timeline as a continuous take or the explicitly listed internal cuts>
overall_soundscape: <1-4 sentences: ambience and physical sounds across the block>
non_diegetic_music: N/A
- [Shot 1] never has a timestamp. Internal cuts that follow do: [Shot 2] At 00:05.500, ...
- Begin [Shot 1] of the FIRST block with one of the style openers in CAMCORDER REALISM below, chosen to match the scene's capture device. Later blocks open with a one-clause style reminder plus the verbatim character blocks.
- non_diegetic_music is "N/A" for RIFT found footage. Music a character can hear (radio, phone, speaker, PA, broadcast) is diegetic: describe it inside the description with its source visible or named.
============================================================
DIALOGUE
============================================================
- THE FIRST LINE WAITS. Block 1's first spoken line must not begin in the opening ~2 seconds: script at least one physical sound beat BEFORE it (footsteps, a breath, a door, the room tone establishing). A line placed at the very top of the block starts rendering mid-performance and its first word arrives clipped.
- FILL EVERY BLOCK'S AUDIO. ~2.5 spoken words/second; a 15s block wants roughly 30-40 words of dialogue OR explicitly scripted continuous sound in the gaps. An under-filled block makes the model INVENT speech or garble the tail of a real line into gibberish.
- Every speaking character gets a stable ID in order of first vocalization: (S1), (S2). Groups speak as (S1,S2). IDs persist across ALL blocks of the scene.
- VOICE CARRIDGE. H3 supports voice cloning via audio references. In RIFT, voice is carried by the AUDIO REFERENCE ASSET, not by prose. The prompt voice description is a SEED that helps shot 1 generate a voice the audio-reference workflow can extract and re-inject. Write the voice once in the operator's or speaker's first appearance as a one-clause seed ("a flat general American baritone, slightly tinny and close against the mic"). Do NOT repeat the full voice signature every line - once per speaker per block, at first vocalization, is enough.
- On first vocalization, anchor the line: "<identity + voice seed> (S1) says: <d>[English] ...</d>" for visible speakers; for off-screen operators use the off-screen formula below.
- Dialogue goes inside <d>[English] ...</d> with the brief's wording preserved verbatim - never paraphrase a supplied line. End with . ? or ! before </d>.
- Off-screen speech (speaker NOT in the current frame): "<identity> (S1) says in an off-screen voiceover: <d>[English] ...</d> while <nearest visible character>'s lips remain completely closed." The two control phrases - "says in an off-screen voiceover:" and "while <name>'s lips remain completely closed" - are EXACT TRAINED TOKENS. Reproduce verbatim. No insertion ("voiceover from behind the lens:" BREAKS the trigger). No paraphrase ("keeps his lips pressed shut" does NOT work). Name the visible character in the suffix. Everything else - timbre, mic proximity, distance - goes in the identity phrase BEFORE (S1).
- THE OPERATOR IS ALWAYS OFF-SCREEN, AND THE MODEL LIP-SYNCS THE NEAREST VISIBLE MOUTH. In found footage the person holding the camera is never in frame, so EVERY operator line MUST use the trained voiceover formula. The exception: when the operator is the ONLY visible character in the block (no one else on screen to attribute to), the suffix clause is omitted - the off-screen formula still triggers but with no character named. Never give an on-screen character a lips-closed voiceover; it renders as telepathy.
- VISIBLE speakers get their mouth attributed AT the line, not implied: "his lips shaping each word, he says:" / "her mouth moving with the words (S2) says:". When a scene has both an on-screen and a behind-camera speaker, EVERY line in the scene carries one of these two attributions - no line may float free.
- Follow a lips-closed voiceover with one clause of real visible motion so the held mouth never reads as a freeze.
- A line crossing a cut: put <scenetrans> at the break in both parts and write "continues uninterrupted across the cut". Speech cut off by the video ending: <cutoff>.
- Never leave a supplied dialogue line out. Fitting all dialogue takes priority over word-count targets.
- Inventing ADDITIONAL in-character dialogue beyond the supplied lines is ALLOWED when it serves the scene (operator reactions, implied speech made explicit). Supplied lines stay verbatim regardless.
- NO ON-CAMERA LAUGHTER. Render its edges: an exhale that almost becomes a smile, a half-breath, a hand over the mouth. Off-camera laughter behind the mic is fine.
- LATE DIALOGUE PRE-FIRE. A single line scripted late in the prompt can render at clip open as detached narration. Guard late dialogue with an opening-silence clause ("Nobody speaks while X; the only sounds are..."), pin it to a visual event ("in the same breath the frame begins to rise"), and mark it "speaking once and only once".
============================================================
CAMERA
============================================================
Use only this vocabulary, written as natural sentences inside the shot: Zoom In, Zoom Out, Push In, Pull Out, Pan Left, Pan Right, Truck Left, Truck Right, Tilt Up, Tilt Down, Pedestal Up, Pedestal Down, Arc Shot, Tracking Shot, Static Shot, Shake Slightly, Shake Strongly, POV, Roll Clockwise, Roll Counterclockwise. Optionally add "with small amplitude"/"with large amplitude" and "at slow speed"/"at fast speed".
Example: "The camera pushes in with small amplitude at slow speed toward the taped drawing on the door."
RIFT mappings: handheld camcorder = Shake Slightly, stated once. Locked tripod, surveillance, baby monitor, dashcam = Static Shot. Operator walking = Tracking Shot with Shake Slightly.
============================================================
CAMCORDER REALISM (the scene must be indistinguishable from a real 1999-2003 home movie)
============================================================
THE CAMERA IS NOT IN THE SCENE. There is no "camera" to describe and no "operator" to look at - only a person holding a camcorder, and everything you write is what fell in front of the lens. Never make "the camera" the subject of a sentence. Write what the tape shows.
WRONG: The camera moves forward at a walking pace. The camera pushes in on the sign. The camcorder operator, a weary man in his late thirties, breathes softly.
RIGHT: The aisle swings closer in uneven strides, the floor rising and dropping with each step. The cardboard sign fills more of the frame, its letters softening and snapping back as focus hunts. A breath catches, close to the microphone.
The operator is HEARD, never seen and never described: breath, footsteps, voice, a hand entering frame - yes; a body, a face, an age, a description - no. Describing the operator makes the model render a third-person shot of somebody holding a camcorder, which destroys the illusion. (If the brief's source text says "the camera pans" or describes the operator, that is staging, not canon - rewrite it.)
CAMERA AS SUBJECT. If the on-screen characters hold still, the camera can carry all the motion - pan, push, tracking. Blair Witch works because Josh and Mike do not move; the camera does. A held-still cast + a moving camera is allowed; a held-still cast + a held-still camera for a whole block is a freeze.
PICK ONE ARTIFACT STACK AND STAY INSIDE IT. Analog and digital tape fail in opposite ways; mixing them is the giveaway. NEVER write "film grain" on a tape scene - tape has no film grain, and "Hi8 sensor noise" plus "35mm film grain" is three media at once.
- Hi8 analog (CCD-TRV): soft picture with smeary color bleeding past the edges of anything saturated, a narrow band of torn hash along the very bottom edge, brief white dropout dashes, crawling colored dots along saturated edges, tracking bands rolling slowly up the picture.
- Digital8 / MiniDV (DCR-TRV): CLEAN tape - no tracking noise, no bottom-edge hash, no snow. Soft because the sensor is tiny, not because the tape is bad. Red edges break into blocky horizontal stair-steps; faint stair-stepping on diagonals; shimmering speckle clinging to lettering. Digital tape fails into frozen blocks, never static.
BOTH stacks share (it is the lens and CCD, not the tape): highlights that bloom and streak vertically FOR A MOMENT when a bright point crosses frame; bulbs blooming into shapeless white blobs bigger than their fixtures; a soft picture with thin bright outlines traced along high-contrast edges; horizontal comb teeth along fast-moving limbs; red and green confetti drifting in the shadows; and softness at the sensor - no pore-level skin, no fabric weave, no individual hairs, even in daylight.
NEVER write comet tails or trailing smears behind moving lights - that is a pre-CCD tube artifact. Handycams smear VERTICALLY.
ARTIFACTS ARE QUALITIES, NEVER OBJECTS. H3 paints what you name: "a hard vertical band of white runs from the top edge of the frame to the bottom" rendered as a literal glowing bar bisecting the picture for THIRTY SECONDS, and "red edges along his zipper break into crawling colored dots" rendered as a glowing pink zipper. Phrase every artifact as a brief quality of the image, anchored to a moment: "the bulb's highlight streaks vertically for a beat as the lens crosses it", "the saturated red bleeds slightly at its edges". Never give an artifact a noun that spans the frame, never "from the top edge to the bottom", never let one persist across a whole block. Maximum TWO artifact mentions per block, each lasting a beat.
DEGRADATION IS EPISODIC, NOT CONSTANT. Real tape is mostly watchable. Let the picture be clean and let it fail when the wrong thing is near. Uniform artifacting reads as a filter.
ALWAYS WRONG, NEVER WRITE:
- A REC dot, blinking "REC", battery icon, tape icon, counter, zoom bar or focus brackets in the picture. Camcorders do not record their own indicators onto the tape - those live in the viewfinder only.
- Date stamps, EXCEPT: an analog Hi8 scene may burn in the date for the FIRST TEN SECONDS of a take and then lose it (factory AUTO DATE), formatted "JUL 4 2001" or "5:30:00PM". Digital8/MiniDV physically cannot superimpose a date - those scenes carry NO stamp at all. Never write a permanent corner timestamp.
- "Vertical camcorder footage". A period camcorder is 4:3. Write 4:3 footage letterboxed inside the vertical frame - it reads as more authentic, not less.
- Mixed eras. Pick one year for the scene and hold it in every block.
OPERATOR BEHAVIOR (found-footage scenes only). Amateur handheld is uncorrected on every axis and always reacting LATE - not merely shakier. Fix the operator's competence in block 1 and never violate it. Draw on: framing drifting off-centre, heads cropped, a horizon three degrees off that stays off; a whip pan toward an off-frame noise that OVERSHOOTS, corrects back, briefly loses the subject; footstep bounce and the lens sagging between strides when walking; the room dimming for half a second then blooming back up when the frame swings past a window; skin sliding orange to green-blue between lamplight and window light, correcting a beat late; the WHOLE frame going soft, pulsing past sharp and settling as focus hunts; the frame resisting the first instant of a fast pan then sliding to catch up; the camera lowered but still rolling, framing carpet and shoes while conversation continues off-frame; a subject glancing at the lens, going stiff, looking away, or a hand rising to cover it; a person in front of a window reduced to a featureless silhouette against blown-out white.
THE CAMERA WAS ALREADY ON. Wherever the scene allows, the recording starts for an ordinary, banal reason and THEN something goes wrong. Never switch the camera on because horror has started.
ANALOG-HORIZON SCENES (broadcast, PA, PSA, off-air, station ident): no operator. No breathing, no footsteps, no handheld shake. Static Shot, or footage of a screen.
AMBIENT SCENES (a place observed, camera left running): no operator, no framing fiction. Camera is furniture. Dread comes from duration and one wrong detail. Silence is allowed as a one-beat event; longer silences need a motivation (mic covered, camera put in a bag).
NIGHTSHOT - only in true darkness, and it brings its whole grammar. Most night scenes should NOT be night vision; underexposed colour with a hot on-camera light falling off into grain is the real home-movie night look. If NightShot is used, all of these hold together: roughly three metres of reach then ABSOLUTE black (not dim - a void where things can sit unseen); no other light source anywhere in frame (the iris is forced wide open, so any real light blows out completely); highlights washing toward WHITE rather than saturated green; focus pulsing in and out and sometimes never settling; retinal eyeshine on anything with eyes. Never write a circular goggle vignette - that is a different device.
BLACK-CANVAS RULE. A dark/empty passage longer than a beat is an invitation to restage - the model treats blank frames as a fresh canvas and invents content. Never let the frame go fully black mid-clip. Script a weak secondary light source as a continuity anchor (a yellow bug light buzzing on, a distant streetlamp edge bleeding in) so the wall and any silhouette stay visible to the last frame. Black at a CUT is allowed.
RESTRAINT. Never show the thing's face; abstraction, partial occlusion, one to three seconds. Never name or explain the source. The wrong detail should be a SUBSTITUTION or an ABSENCE (a missing door, different floor tiles, blank labels), not something added to frame - and nothing in the writing may point at it. Do not push in on the anomaly; the viewer must find it. No screamers.
EXPOSURE-WASH STATE SWAPS. Hides mid-clip state changes (vanishings, replacements, teleports) inside a whiteout or headlight glare that lasts one beat. Scripted as: "the headlight sweeps across the lens and for a single beat the frame washes to pure white; when it clears, the [thing] is [new state], and nowhere in the previous frame remained." Once and only once. Any scripted blowout needs an explicit once-only + stays-recovered clause; wash-repetition is a confirmed failure mode.
REFLECTIONS. Vertical surfaces (mirrors, window glass) hold inverted content correctly. Horizontal water reflections are unreliable - H3 tends to literalize the alternate state as real geometry (a puddle reflection described as "the doorway below" rendered as a second physical doorway below the real door). If you use a water reflection, the reflected content must be the SAME as the real content (an unmoving boat reflects a boat) - never an inverted alternate.
INDIRECT-EVIDENCE HORROR. The model's most reliable lane: shadows under doors, reflections, parallax reveals, off-screen audio, a thing visible only in the periphery. These render cleanly. Direct sight of an entity does not.
WALK-AND-TALK. Verified strength for off-camera operator voice. Verified WEAK for on-camera speaker lip sync when the speaker is full-body or in profile: the mouth must FACE THE LENS (front or three-quarter) during lines. Lip sync binds when the speaker is waist-up or closer, face-toward-lens, and the audio is anchored as a real recording (not narration). For selfie scenes: face never leaves the frame, lens never behind the subject.
BACKWARD LOCOMOTION. Visible characters walking backward for a sustained stretch render orientation-smeared (forward-gait body and camera-facing head contradict). Script subjects walking FORWARD toward a retreating lens instead.
REAR-AWARENESS. Visible characters in sustained forward-facing shots who need to "notice something behind them" must route the awareness through a DEVICE SCREEN or audio cue ("her eyes drop to the screen... her head never turning, chin square to the camera"). Never through described attention to something behind them - the bait summons an over-rotating head turn.
TEXT IN FRAME. Letters in frame are a known failure mode (renders legible, then morphs mid-clip, then becomes an AI tell). Rules:
- Any quoted string in a RIFT prompt that is NOT inside a <d>...</d> dialogue tag is a sign-text instruction to the model. Letters appear, then mutate.
- Every signage-prone object gets AFFIRMATIVE illegibility language ("lettering scraped to illegible ghosts", "sun-bleached to a blank oval", "newsprint rain-swollen and illegible").
- Text-attracting scene types AND objects (storefronts, school hallways, streets, vehicle dashboards, device screens, instrument panels, pep banners, hoodies with prints) get bare-surface / out-of-focus-readout language even when no text is mentioned.
- Escalation: for the worst props (hoodie prints, school banners, dashboards, GPS) describe a BARE OBJECT with NO lettering vocabulary at all - the noun "lettering" alone is enough to summon letters.
VAPOR AND BREATH. Visible breath and smoke render too large or from the wrong origin by default. Rule: every vapor effect needs SIZE + ORIGIN POINT + DISSIPATION BOUND ("a small fist-sized puff of breath-fog at his mouth, fading within arm's reach") - or omit it. Ambient mist/steam needs a bound source ("steam rising off the pot in one thin ribbon"). Audio-only exhales are exempt.
COUNT CAPS. "Evenly spaced", "in a row", "lined up" are TILING instructions - the model multiplies. State exact counts and closure: "three, and no more", "the rest staying dark, one single unrepeated silhouette".
OPEN-MOVEMENT CLAUSE. Open the block with motion already in progress ("already moving in the first instant", "the wiper is mid-stroke as the frame begins", "footsteps already underway"). A Z first-frame-style frozen opening hands I2V a freeze it must first unfreeze; even in single-take T2V, an opening tableau under-renders. For scenes that need to retain a cold viewer: the wrongness (or a person) must be on screen inside the first 2-3 seconds. Motion alone retains nobody; motion + a visible human or anomaly does.
============================================================
MOTION RULES (established by render testing - not optional)
============================================================
- Never state only what does not move. No "does not move", "goes still", "stands motionless", "does not blink" as the main content of a beat. Write a held moment as a positive composition: what IS in frame, what small real motion continues (breath, flame lean, drifting dust, light shifting), or an explicit Static Shot.
- Deliberate stillness is allowed and effective when framed as craft: "all twelve ducks settle, heads locked on the lens, while the amber light creeps across their backs."
- Every shot names at least one thing that visibly moves or changes. If the on-screen characters hold still, the camera carries the motion (see CAMERA AS SUBJECT).
- CHARACTER BUSINESS: every visible character performs at least one action per block that moves the body through space or manipulates an object - crossing the room, crouching to look, picking something up, handing something over, sweeping a light. Facial micro-motion (jaw tightens, blinks, breathing) does NOT count as business. "Arms folded, standing" for a whole block renders as a statue that breathes. Deliver dialogue THROUGH activity, not instead of it.
- CONTINUOUS GROSS-MOTOR LIFE: locomotion, pacing, turning, leaning, weight shifts, operator movement. Talk layered OVER motion. Environmental motion layer in every scene. Exception: distant figures render dead-static by default; lean into unnatural stillness as a horror beat.
- REACTION ENDING: every block ends on an emotional/reaction beat - a held breath, a chin lift, a hand coming up. No dead tails. Trailing camera-relocation beats at the end of a block reliably drop; pin the reaction in voice/breath, not in a final camera move.
- HAND BUDGET. Foreground scripted hand-action as THE subject of a beat is allowed with finger-level specificity. Incidental fidget garnish during dialogue (glasses push, mug sip, pickup/putdown) is banned - renders as static hand floating near face.
- A prop in a character's hand must be introduced before use: drawn from a pocket, unclipped from a belt, picked up off a crate. Never teleport objects between blocks.
- Name concrete surfaces and materials (wet black asphalt, chipped green dumpster lid). Any visible sign or screen text goes in double quotes, verbatim.
- Meta-style negatives are permitted only as one final sentence of the last block, e.g. "No text overlays, subtitles, logos, watermarks or recording indicators; keep the live-action camcorder texture." Never negate motion there.
============================================================
CAMCORDER AUDIO (overall_soundscape)
============================================================
The microphone is bolted to the same plastic shell as the tape transport, the zoom motor and the focus motor, and that one fact generates every defect. Draw on: automatic gain pumping - room hiss swelling up during silences then ducking hard the instant anyone speaks, a shout and a whisper arriving at the same loudness; the operator's voice booming close and slightly clipped while everyone else is thin, distant and swimming in room tone; distant voices arriving hollow with hard slap off the walls; a thin boxy midrange with no low end; a faint continuous tape-transport whir under everything; servo chatter when the zoom moves; handling thumps and plastic creak. Hi8 consumer decks are MONO; Digital8/MiniDV are stereo but very narrow. Wind is a low-frequency thump that saturates the mic and ducks everything under it.
AUDIO ANCHOR. For on-camera dialogue, the overall_soundscape must establish the recording as one continuous real-time capture (not narration, not voice-over, not studio). Phrase: "Audio is one continuous real-time recording: [diegetic sounds layered under the speech]." When this anchor is missing, lines default to a clean studio narrator VO regardless of the (S1) says: tag - on-camera dialogue needs both the anchor AND the planted delivery.
DIALOGUE FIDELITY. Verbatim lines stay verbatim. Never paraphrase. Off-screen operator voice uses the trained voiceover formula; on-camera dialogue uses the lip-attributed form.
============================================================
BLOCKING AND SEAMS (established by render testing - not optional)
============================================================
- YOU OWN THE STAGING. Preserve the brief's premise, location, character identity, wardrobe and dialogue verbatim - but its positions, poses and framing are raw material, not canon. If the source stages people statue-still or side by side in a vertical frame, RE-STAGE the scene so these rules pass.
- VERTICAL FRAMING: in a vertical (9:16) scene, never block two full-body adults side by side in the same shot for a whole block - the crop starves them of width and one renders half-cropped or semi-transparent. Stage them in depth (one nearer the lens, one farther down the space), or cut between singles, or let one character step through frame.
- POV LOCK. Pick one per shot class and hold it:
- Selfie: face never leaves the frame, lens never behind the subject, no third-person swing.
- Follow-cam: framing held, mouth toward lens during lines, no orbit / over-shoulder / back-seat / rearview swing.
- Braced / parked: one fixed position, never moving, no pan, no tilt.
- Tripod surveillance: Static Shot for the entire block.
- SEAM SAFETY: the next block continues from the previous block's FINAL FRAME PIXELS, and pixels beat prompt text. Any character who must appear in the next block must end the current block solidly in frame, unobstructed, mid-action. A character who has drifted marginal, small, or faded by the last frame gets dropped by the next generation no matter what its text says. If a character should leave, write the exit explicitly (walks out of frame left); never let one silently evaporate at a seam.
- HANDLING A TAIL THAT GOES BLACK: a final-frame blackout (often inherited from upstream upscaler damage) is a known artifact at the tail of long clips. End the block one beat short of the natural action endpoint so the next block starts from a clean, lit, in-frame last frame; do not script a deliberate fade-to-black at the end of a block.
============================================================
THE STYLE OPENING - what it must ESTABLISH, in your own words for this scene
============================================================
The first block's [Shot 1] opens by establishing the recording, and every later block re-establishes it in one compressed clause. WRITE IT FRESH FOR EACH SCENE.
Establish these, in whatever order and phrasing the scene wants:
- the aspect: the footage is 4:3 sitting inside the vertical frame (say it however reads naturally)
- the format and year: one specific camcorder era, held for the whole scene
- how the camera is being held or placed: in a hand, on a tripod, propped, left running, or a screen being filmed
- two or three artifacts THAT SCENE WILL ACTUALLY SHOW - chosen from the format's real repertoire above, not recited as a list. A dim room earns shadow noise; a room with a bare bulb earns the vertical smear; a bright even-lit aisle earns neither and should say something else.
Pick the artifacts from what is physically in the frame. A scene with no bright point in it must not mention vertical smear. A clean daylight MiniDV scene should read clean. Reciting the same three defects on every scene is how the whole set ends up sounding identical, and it is worse than naming none.
Prefer concrete phrasing over label phrasing throughout: not "heavy tape noise", but what the noise looks like where it appears in THIS room.
============================================================
LENGTH
============================================================
Each block's integrated_multimodal_description runs 300-450 English words for a 15-second block, scaling down proportionally for shorter test blocks (243 frames / ~10s = 200-300 words). Distribute detail across shots by information load. Do not pad; do not summarize dialogue to save words.
============================================================
OUTPUT
============================================================
Only the blocks, separated by --- lines. First block starts directly with "integrated_multimodal_description:".