Extensions/WextraUI
ComfyUI Extension

WextraUI

WextraUI — extra nodes for ComfyUI, from the Winteraction workbench: WSave Image (file name built from parts), WRoute (the if that picks an OUTPUT), WDifference (what changed since the last run, also as a file-name tag), WLoad Lora & Trigger (LoRA + trigger words into the prompt), and the WScene / WLoop family: MiniMax H3 multi-scene loop with video + audio hand-off.

By sickbraintwo·Created 12 months ago·Updated 2 days ago· 0
sickbraintwo/WextraUI
Nodes2
On cloudLocal install
CategoryWextraX
Stars0
Updated2 days ago
Readme
<h1 align="center"><img src="images/wordmark.svg" height="56" alt="WextraUI"></h1> <p align="center">Extra nodes for ComfyUI, from the Winteraction workbench.<br> <sub>Six utilities born from real friction, and the scene loop that renders a whole film with MiniMax H3 Sync Sound.</sub></p> <p align="center"><img src="images/help_popup.png" width="860" alt="WLoad Lora & Trigger with its ? help page open"></p> <p align="center"><sub>Every node has a <b>?</b> in its title bar: the full help page, inside ComfyUI. This README is the tour, the <b>?</b> is the manual.</sub></p>

Install

ComfyUI Manager: search WextraUI. Or clone it into your custom nodes:

cd ComfyUI/custom_nodes
git clone https://github.com/sickbraintwo/WextraUI

No extra dependencies. Restart ComfyUI; the nodes are in the WextraUI category.

The nodes

| Utilities | | H3 scene loop | | |---|---|---|---| | WSave Image | file name built from parts | WScene Composer H3 | storyboard → time-coded prompt | | WRoute | the if that picks an output | WScene H3 | one scene as one object | | WRouteIndex | same, by number | WScenes Collection H3 | the scenes, in order | | WDifference | what changed since the last run | WLoop Start H3 | which scenes this Run renders | | WLoad Lora & Trigger | LoRA + trigger words, in line | WLoop Scene Conditioning H3 | the loop body | | WFrame | crop · resize · place, for outpaint | WLoop End H3 | the hand-off to the next scene |

Utilities

WSave Image

Saves PNGs with a file name composed from parts (folder, subject, any string or number from the graph, a counter of chosen width), the usual ComfyUI metadata embedded. The preview box shows the name before you run.

<img src="images/WSaveImage.png" width="300" alt="WSave Image">

WRoute · WRouteIndex

The if the other way round: one input, two outputs, a boolean decides which output carries the value. The branch not chosen does not run at all, Save nodes included. WRouteIndex does the same with a number and four outputs.

<img src="images/WRoute.png" width="300" alt="WRoute"> <img src="images/WRouteIndex.png" width="300" alt="WRouteIndex">

<details><summary>Why it exists, and how to join the branches again</summary>

Nearly every switch in the ecosystem picks an input, because ComfyUI is pull-based; this one picks the output (ExecutionBlocker on the branch not taken). To join the branches back into one Save node use a lazy switch fed by the same boolean (core If/Else Switch, Easy-Use if-else): a non-lazy if (ComfyUI-Logic If) evaluates both inputs, meets the blocker and is skipped with everything after it, no error, no file.

</details>

WDifference

Tells you what you changed since the previous run of this workflow: seeds, prompts, widget values, rewiring, nodes added or removed. As text, one line per change, and as a file-name-safe tag.

<img src="images/WDifference.png" width="300" alt="WDifference"> <details><summary>How it works</summary>

It reads the hidden PROMPT that every Save node embeds in the file, keeps the previous run per workflow on disk and returns the differences: ~ Composer I-a (#74) · seed: 2 → 6, rewiring, nodes added/removed. Optional .log = a run diary for free (output/_Wextra/rundiff/). Wire changes to a Show Anything; add tag (246.strength=0.4_57.seed=77, first, same; display-only widgets ignored) as a string part in WSave Image and the file name tells you what that run changed.

</details>

WLoad Lora & Trigger

Loads the LoRA and puts the trigger words you click into your prompt, in one node, in line: the prompt cable goes in on one side and comes out on the other with the words already in it. Trigger words come from Civitai (look-up) and from the training tags inside the file; click the chips, drag to reorder.

<img src="images/WLoadLoraTrigger.png" width="330" alt="WLoad Lora & Trigger">

WFrame

One node for the outpaint prep and every framing job. new_width × new_height on top is the master; then crop (an aspect or custom), resize (fit, cover, long side, short side, or a number) and place on the canvas by anchor and offset: what is missing is padded, what sticks out is cut. Out come the picture, the pad mask feathered inward (ready for outpaint), the final size and a short text of what was done.

<img src="images/WFrame.png" width="260" alt="WFrame">

H3 scene loop

A film for MiniMax H3 Sync Sound as a list of scenes rendered one after the other, each clip joined to the previous one by a hand-off of frames and audio. You describe the scenes; the loop renders them, resumes from any point, and lets every scene choose how it joins the one before.

<details><summary>How the hand-off works</summary>

Each WScene H3 says how it joins the previous one: handoff_frames (last N frames + N/24 s of audio of the previous clip anchored at frame 0; valid H3 lengths 5/22/39/56…, 22 = 0.92 s default; longer = more music continuity across the join, more of the previous clip repeated), previous_from = loop (the clip rendered just before in the same run) or file + resume_from_video (scene-by-scene work: any clip as the previous one, scene 0 included, so a piece can start from the tail of any video). WLoop End H3 sits at the end of the loop body and cuts the tail the next scene asks for; WLoop Start H3 only chooses start_scene / scene_count. A run can therefore mix hand-off lengths per scene and resume anywhere.

</details>

WScene Composer H3

Turns a storyboard into a MiniMax H3 prompt with a time-code per beat, so sound and picture are written together and land where you want them in the clip. Beats can be locked or scaled to the total duration; it also outputs the timing table and the real frame count.

<img src="images/WSceneComposer_H3.png" width="420" alt="WScene Composer H3">

WScene H3

One scene as a single object: the prompt, its duration, the seed, where the clip starts and lands, an optional mid-clip guide, the references, and how it joins the previous scene.

<img src="images/WScene_H3.png" width="280" alt="WScene H3">

WScenes Collection H3

Lines up the scenes in socket order into the list the loop runs over: scene1 is scene 0, scene2 is scene 1, and so on. That order is the film.

<img src="images/WScenesCollection_H3.png" width="300" alt="WScenes Collection H3">

WLoop Start H3

Decides which scenes this Run renders and what the first of them starts from.

<img src="images/WLoopStart_H3.png" width="300" alt="WLoop Start H3">

WLoop Scene Conditioning H3

The whole conditioning for one scene in one node: text, canvas, first/last frame, guide, references and the motion/audio hand-off from the previous scene.

<img src="images/WLoopSceneConditioning_H3.png" width="320" alt="WLoop Scene Conditioning H3">

WLoop End H3

Closes one iteration of the loop: from the clip just rendered it cuts the tail the next scene asks for.

<img src="images/WLoopEnd_H3.png" width="300" alt="WLoop End H3">

Made with it: RESONANCE

A ~77 s music video, video and audio generated together shot by shot with MiniMax H3, driven by these nodes and by an AI agent (Claude Code) working part of the loop through Comfy MCP: a world that exists only where sound touches it, five acts around one black riveted-iron skull. Nine WScene H3 chained end to end, all seeds fixed for reproduction. Entry for the Comfy H3 Sync Sound Community Challenge, September 2026.

Changes

See CHANGELOG.md. Retired nodes live on in src/legacy/.


<p align="center"><sub>A Winteraction Lab product · by <a href="https://github.com/sickbraintwo">sickbrain2</a> · Apache-2.0</sub></p>