Phantas π
Phantas renders the keyframes so the video looks like one world
- board
- model
- clip
- vae
- sampler_settings
- style_model
- clip_vision
- first_frame
- reference_image
- shots
- images
- captions
- settings_data
- report
The hard part of a multi-shot video isn't making the motion - it's making the stills agree. Generate five keyframes independently and the character is a different person in each one; put those into a video and the shots morph between them instead of flowing. Phantas is the renderer that stops that. It takes a board from Phantas Storyboard, renders every keyframe on one seed and one style, and hands back the Morpheus shot chain that runs between them.
Why the frames actually stay consistent
A shared seed is the floor, not the mechanism - same starting noise, but the trajectories diverge within a few steps. What holds a board together, in order: the style block stamped into every prompt, then an anchor. The reference input picks the anchoring mechanism:
off- text and seed only. Weakest, and on a keyframe chain it usually shows.redux- CLIP-Vision plus a Flux Redux style model (style_modelandclip_visioninputs), applied as an attention bias. Works with any Flux dev model, Krea included.edit- the anchor VAE-encoded as a reference latent, the way Kontext and Qwen-Image-Edit read an input image. Strongest, but it means running one of those edit models.
In redux mode, reference_strength (0.6) dials the bias: 1.0 is full Redux, which tends to redraw its reference and make every frame the same picture; lower keeps identity while leaving the prompt in charge of the shot.
anchor picks which picture to anchor on: first frame (global identity, but neighbors can drift), previous frame (tight seams, but drift accumulates down a long chain), or first + previous (both, for one more encode per frame). A wired reference_image - a character reference or location plate - is added on top of all of them and is the only anchor frame 1 can have. first_frame lets you use a picture you already have as keyframe 1 instead of generating it.
The inputs that matter
board- fromPhantas Storyboard. The prompts are already written; this node just renders them.sampler_settings- the sameSampler Settingsbundle Ouroboros and Chimera take. Chain two for a draft-then-polish pass on every frame (later stagedenoise < 1). Itsseed_modedecides whether frames share a seed;fixed(the default) is what keeps them related.width/height- match the aspect ratio you'll render the video at, because these pictures are also what the video model's writer looks at.cache: disk- rendered frames cached under a causal key. This isn't only a speed feature: ComfyUI's Cancel discards the whole run, so without a cache a stopped board loses every finished frame. With it, cancel is the stop button - re-run and the finished frames come straight back.redo("3","2-4","1,4-6") - re-roll specific keyframes with their seed shifted byredo_seed_offset(same seed + same prompt would just hand back the same picture). Frames after a re-rolled one re-render too, because they were anchored to what it used to be; the ones before stay cached.
Outputs and where it sits
shots is the Morpheus chain with prompts left empty - that's what tells Morpheus Storyboard "these are yours to write." Neighboring shots share the same tensor for the frame between them, because it's one picture playing two parts. images, captions and settings_data feed Image Compare directly, and each keyframe is pushed to a Kinburg Live Log node the moment it decodes (live_preview on by default).
Installing it
Same pack: ComfyUI Manager β "Kinburg-Nodes", or git clone https://github.com/Kinburg/Kinburg-Nodes into ComfyUI/custom_nodes and restart. The models are the real download: whatever image model you're keyframing with, plus - if you want redux - a Flux Redux style model and its sigclip CLIP-Vision. No extra pip packages; the LLM half of the pack (which this node doesn't use) handles its own install.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| board | KINBURG_PHANTAS_BOARD | The board from 'Phantas Storyboard'. | |
| model | MODEL | β | |
| clip | CLIP | β | |
| vae | VAE | β | |
| sampler_settings | KINBURG_SAMPLER_CFG | A 'Sampler Settings' bundle β the same one Ouroboros and Chimera take. Chain two of them for a draft-then-polish pass on every frame (give the later stage denoise < 1). Its seed_mode decides whether the frames share a seed; 'fixed' (the default) is what keeps them related. | |
| width | INT | 96064β8192 | Keyframe width. Match the aspect ratio you will render the video at β these pictures are also what the video model's writer looks at. |
| height | INT | 54464β8192 | Keyframe height. |
| reference | COMBO | off | How already-rendered frames are fed back in, to keep the sequence one world: β’ off β text and seed only. The weakest, and on a keyframe chain it usually shows. β’ redux β CLIP-Vision + a Flux Redux style model. Works with any Flux dev model, Krea included. β’ edit β the anchor goes in as a reference latent, the way Kontext and Qwen-Image-Edit read an input image. The strongest, and it means running one of those models. |
| reference_strength | FLOAT | 0.600β1 | How hard the anchor pulls, in 'redux' mode (applied as an attention bias). 1.0 is full Redux, which tends to redraw its reference and make every frame the same picture; lower values keep the identity while leaving the prompt in charge of the shot. Ignored by the other modes. |
| anchor | COMBO | first + previous | Which rendered frame is used as the anchor: β’ first frame β global identity, but neighbours can still drift apart. β’ previous frame β tight seams, but drift accumulates down a long chain. β’ first + previous β both, at the cost of one more encode per frame. A wired 'reference_image' is always added on top, and is the only anchor frame 1 can have. |
| cache | COMBO | disk | Cache rendered frames on disk under a causal key. Worth leaving on: ComfyUI's Cancel discards the whole run, so without this a stopped board loses every finished frame β with it, cancel and re-run picks up where it stopped. It is also what makes 'redo' cheap. |
| redo | STRING | Re-roll these keyframes, 1-based: '3', '2-4', '1,4-6'. Empty = re-roll nothing (a frame missing from the cache still renders, so a cold board renders in full either way). A listed frame is generated again with its seed shifted by 'redo_seed_offset' β the same seed and the same prompt would only give the same picture back. The frames AFTER it re-render too, because they were anchored to the picture it used to be; the ones before it stay cached. | |
| redo_seed_offset | INT | 10β4294967295 | Added to the seed of every keyframe named in 'redo'. Bump it again for another roll of the same frame. |
| style_modelopt | STYLE_MODEL | Flux Redux, for reference = 'redux'. | |
| clip_visionopt | CLIP_VISION | The CLIP-Vision encoder Redux was trained with (sigclip vision 384), for reference = 'redux'. | |
| first_frameopt | IMAGE | Use this picture AS keyframe 1 instead of generating it β a photo, a frame from an earlier render, a picture out of a chat. It is resized to widthΓheight and anchors everything after it. | |
| reference_imageopt | IMAGE | An extra anchor added to every frame, including the first. This is how a character reference or a location plate gets into the whole board. | |
| negativeopt | STRING | Negative prompt. Empty = the board's own [NEGATIVE] block, which is what the style bible wrote. | |
| live_previewopt | BOOLEAN | true | Push each finished keyframe to a 'Kinburg Live Log' node as soon as it is decoded. No wiring β drop a log node anywhere. |
| cache_tagopt | STRING | Any text you like, folded into the cache key. Two different checkpoints of the same architecture and size look identical to the cache; put something here to tell them apart. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| shots | KINBURG_MORPHEUS_SHOT | The Morpheus chain: every shot bounded by two of these keyframes, prompts left empty. Wire it into 'Morpheus Storyboard', which fills them in place. |
| images | IMAGE | The keyframes themselves, as one batch. |
| captions | STRING | 'Keyframe n' per image, for Image Compare. |
| settings_data | GEN_SETTINGS | Per-image settings for Image Compare. |
| report | STRING | What was rendered, what came from cache, and how long each took. |