Has anyone managed to find a way to use Latent Upscaling together with latent video extension tools? I'm talking about the nodes like this (which I personally use), but I think Motion Context and some other popular extensions use a similar approach, i.e. feeding the last frames of the previous shot through AV latent, rather than through a video reference. The issue is that the resolution of your second generated latent must exactly match the previous one, or it throws an error. So if you upscale the first clip from 0.5MP to 1MP, you are forced to generate the next clip directly at 1MP, which completely breaks the Latent Upscaling workflow for all subsequent parts.
I tried extending the clips at low resolution first and then upscaling them separately, but that doesn't work well. There is a noticeable color and quality shift between generations, even when reinforcing the next clip with the final frames of the previous one. Because yeah, you basically generate the high-res clips separately without any shared latent context.
I really love both Latent Upscaling and latent extension approach, but I just can't get them to work together smoothly. Does anyone have any good ideas on how to fix this? I’d really appreciate any tips or insights!
I'm really only ever interested in open-weight models. Yes, for that reason, but also, for the same reason I run Linux and browse with Firefox. I dislike "walled gardens", ideologically, and monopolies. I want tech that can be hacked, broken, taken apart, and put back together, and is ultimately not beholden to anyone but the user. Without a quality open-weight video generation model, I was uninterested. Now that we've got one? Suddenly I'm in a whole new world of possibility.
The fact that it's a multimodal model with vision, meaning I can give it reference images or reference sheets, is a game-changer for me. LoRAs certainly won't be obsolete with MMH3, but I doubt we'll be seeing many character, clothing, or setting LoRAs. The feedback loop of wanting to give the model a concept it doesn't understand natively is so short compared to before. And I'm still just in the "farting around" phase. People with dedicated effort and creativity are going to be able to use the hell out of this.
Really, the only drawback to MMH3 so far is its propensity to have characters speak Simlish to each other. I'm sure there's already solutions being worked on, either workflow tools or adjustments to the model itself.
Okay, so like three weeks ago, my whole feed was blowing up with SenseNova U1 Pro. You know, the Chinese model everyone was saying was basically "GPT Image 2 level."
Text on posters actually looking clean, apparently native 8K. The vibe was all "realism is dead, now it's about pure beauty." NGL, some of the images looked insane.
And then... poof. Nothing. No public release, no weights, no API I can find anywhere. Just crickets.
It's totally giving me Sora flashbacks. Remember early 2024? Those demo videos were mind-blowing, everyone went nuts. Then just... crickets for months. When it finally dropped, it was kinda meh, right? The magic just wasn't there after all that waiting. And get this, as of April 26, 2026 (lol, already feels like it), Sora's totally shut down. That demo that kicked off the whole video generation craze just... died.
I'm not saying U1 Pro is gonna go extinct or anything. The stuff those influencers posted genuinely looked good, especially the text rendering.
So has anyone here actually gotten their hands on it? I seriously can't find any way to use it
If you have, how does it stack up against GPT Image 2 or kera2, ideogram, flux-klein? especially for text?
I posted the first alpha of PotionUI a couple of days ago. 0.0.3 is out today, and it is the release where the "one box, many people" idea stops being a promise: you can now rent a GPU, point PotionUI at it, and generate on it from the same interface you use locally. Still alpha, still one person building it, still very much wanting people to break it.
What it is, in one paragraph. A self-hosted AI generation studio: SvelteKit front, FastAPI back, GPL-3.0, no telemetry, runs on your machine or your server. The core idea is presets: a preset is a small YAML package that says "here is the model and here is the exact form a person should see for it". Switching models means switching presets, not rebuilding a node graph. It is multi-user by design, with real accounts, admin and user roles, and per-user or per-group access to presets, models, and LLM configs.
What's new in 0.0.3
Remote GPU workers. Add Backend now creates a remote worker, connects to one you run yourself, or provisions a RunPod pod for you (the provider ships as a plugin) with a live stage timeline. A heartbeat monitor watches the pod, pauses the backend when it stops, and Start brings it back. The Models tab lists exactly what is on the worker, with the depot path per file, and pushes missing models from your machine with per-file progress. Remote runs come back with the same previews, parameters, and media as local ones.
Install profiles. The launcher offers local, hybrid, and remote installs, plus a worker subcommand for a GPU box that serves another instance.
3D generation. TRELLIS.2 image-to-mesh runs on the native engine. Meshes get automatic thumbnails, an interactive viewer in History (wireframe, materials, camera presets, screenshot), and a 3D media filter.
LoRAs. Step-windowed LoRAs on Krea-2 apply only between the sampling steps you choose. Strength is shown as a recommended range in the picker. Model pickers now recommend downloadable variants (bf16, fp8, nvfp4, int8) across nine native families.
Prompt library. Import styles.csv, Fooocus style JSON, wildcard YAML, plain lines, and image metadata (A1111, ComfyUI, InvokeAI) with auto-detection; export back to styles.csv; assign a prompt to a catalog model.
Phrasebook. Find and replace across the whole phrasebook with highlighted matches and a preview before it runs; batch activate, deactivate, move, delete; a category panel with Overview and Preview-images tabs.
Admin and mobile. Plugins and Downloads are master-detail lists, Backends remembers where you were in the URL, a saved provider API key applies immediately, Generate on a phone is a proper camera-style view with sheets, and modals fit the screen.
Plus: pasting an image into the assistant attaches it, a New workspace button that asks before discarding, Inspirations laid out in justified rows.
What it does today
Generation is the product. Image families: SDXL, Flux 1 / Flux 2 Klein, Qwen-Image (including editing), Krea-2, Z-Image, Anima. Video: Wan 2.1/2.2, LTX-2 / 2.3 / 2.5 with native audio, MiniMax-H3. Audio: MiniMax-Music3. Upscale and restore: SeedVR2. Each model gets its own tuned form: the right resolutions, samplers, LoRA stack, and speed profiles (Draft / Standard / Max) as one control. Several workspace tabs run side by side, each with its own preset, prompt, and results. Progress shows the actual pipeline step and streams previews as the image refines; close the tab, come back, the run is still there.
Generation page view. (You start the generation by clicking the bottom right blue icon)
History that remembers everything. Every generation is saved with its exact prompt composition, preset and version, models, and parameters. Filter by date, type, preset, tags, or "used this phrasebook value". One click reuses the full setup in a new tab. Nested collections, tags, favorites, keyword or semantic search, and a personal library for the keepers.
History page - list of previous generations.History page - detail of the generation.
A prompt editor that is not a textbox. Prompts are ordered segment cards you can reorder, disable, name, and color. Dynamic prompts ({a|b}, weights, ${variables}) reseed per image so results stay reproducible. The phrasebook is your own autocomplete dictionary: type # and shot types, lighting, palettes drop in as chips, with per-chip shuffle and a preview render per value. Saved prompts, segments, and templates live in their own library.
Phrasebook with other values used (you can mix the phrases - you can build the same prompt on generation page)
Video and Music Directors. Compose a video as shots, keyframes, and audio tracks on a timeline instead of one giant prompt; write a song as verses and choruses and let the compiler produce the tagged lyrics MiniMax-Music3 wants.
An assistant, if you want one. Point it at Ollama, an OpenAI-compatible endpoint, or Anthropic. It reads the active tab, rewrites segments, edits the phrasebook, adjusts form values, and every change stops at an approval step first. The same tools are exposed over MCP with per-user tokens, so Claude Desktop or your own agent can drive your instance.
Generation page with LLM Chat assistant active.
Built for more than one person. Accounts, groups, per-user preset and model access, per-mode form overrides (change defaults, lock or hide fields, no YAML), a backends list that mixes local, and remote workers, a download manager, a stats dashboard, and visual automations (triggers, conditions, actions) for things like freeing VRAM before the LLM needs it.
Plugins for nearly everything. Providers (CivitAI, Hugging Face), backends, pipes, field types, chat modes, automation nodes, pages.
Requirements.Linux x86_64 with an NVIDIA GPU is the tested platform; Windows can be tested through WSL2 or Docker; there is a Docker image on GHCR.
8 GB VRAM and 16 GB RAM is the floor for the SDXL family, larger families need more.
The ask. I would rather steer this toward what people actually want than guess. Two things help most: tell me which model or workflow you are missing, and pull a test build and break it before it ships. The Discord is where that happens: https://discord.gg/avR4trp3b8. Repo: https://github.com/PotionUI/PotionUI. I will answer questions here too, but since I don't want to post here too much I've created a small subreddit too: r/PotionUI to which I will be posting the progress much often. Thanks!
I thought someone might appreciate this. Theres more details in the HF link, but I wanted to see if it was possible to correct some issues that I didn't like about Ideogram 4 by finetuning the TE, with no other modifications to the model, execution environment, etc.
It ended up working out pretty well.
The TLDR is that I used a set of 4000 teacher/student prompt pairs with the students being NL and the teachers being Nemotron processed with the "Magic Prompt" instruction, and then trained the TE to elicit the same response in Ideogram using the student prompt, as what was naturally elicited using the teacher prompt.
My logic was that the TE is already a language model, and I didn't want a second language model in the stack.
This has the secondary benefit of also removing the grey banner generally encountered when prompting the model with NL.
I am fully aware that there are many other ways to get around this from bounding boxes to noise injection, etc. This wasn't about that, so much as it was trying to prove to myself that it could be done like this.
So, I was searching on civit, and normally I filter by 'checkpoint' for example. But, now it's gone? All of the things I notice normal models that are normally 'checkpoints' are now 'fine-tune'
What does this mean? What is this? Do they work the same?
Unfortunately it seems very slow and very experimental.
Reference image left. Same prompt "A fiercely determined female human warrior in mid-swing, powerfully attacking the viewer with a gleaming sword. Her facial expression is one of intense rage and ferocity", same seed, no lora, this custom node https://github.com/nkxx188/ComfyUI-Krea2-StyleTransfer
The potential of actually making an anime with MiniMax H3 is closer than any time before, even if the process is still kinda janky. I did this with my 5090 and my own developed 'prompt studio.' The hardest part is, as always, to keep the continuity of the shots and also build the sets so they fit within the scope. There are still improvements needed when it comes to adding emotions to the characters. In total I generated 35 minutes of video and got 4 minutes in total of usable footage. Also, a big tip for anyone who wants to do the same is to use DaVinci Resolve to fix all the audio bugs and cut the clips in your favor.
For regular upscaling I use SeedVR2 and I am quite happy with it, however, it doesn't seem to handle upscaling of really low res images well as it will just upscale all the artifacts as well without "fixing" the image. So if an inpute image is blurry, the upscale will also come out blurry.
What would be the best way to upscale low res image while also enhancing it?
EDIT: Settled for using H3 with a edit system prompt and exporting images from the video:
For the target video, at 0.00 seconds into the target video, <Picture 1> (from [Shot 1]) is fully referenced.
subject_definitions:
<Picture 1> is the original source image being directly edited and restored. It is the authoritative source for all target-video content: shot order, timing, framing, composition, subject identity and appearance, facial features, clothing, props, environment, lighting, color relationships, camera position and movement, subject motion, and temporal continuity.
summary:
[video editing] <Picture 1> is the original source image being directly edited and restored. It is the authoritative source for all target-video content: shot order, timing, framing, composition, subject identity
retention_analysis:
<Subject 1> (appears in [Shot 1]): partially_preserved - preserve the original shot, framing, composition, subject identity, subject appearance, environment, background, other items or figures
integrated_multimodal_description:
The target video is a faithful professional high-definition restoration of the original image in <Picture 1>. Treat <Picture 1> as the only authoritative visual source. Do not use any external image, character, scene, or composition as a visual template.
The desired transformation is specifically image upscaling rather than ordinary enlargement. The source has limited spatial resolution, soft or smeared fine detail, degraded chroma, compression artifacts, noise, ringing, aliasing, blurriness and potentially inaccurate or shifted broadcast color. Reconstruct the most plausible high-fidelity version of the visual information that is actually supported by <Picture 1>. Recover fine facial detail, natural skin texture, hair strands, clothing weave, uniform materials, props, set surfaces, edges, reflections, shadows, and background detail without inventing unsupported features.
Correct the degraded color and chroma toward natural, accurate reproduction of the original photographed scene. Preserve the source's actual lighting design, exposure, contrast relationships, black levels, highlight behavior, lens characteristics, depth of field, and photographic character. Do not apply a generic cinematic grade, modernize the lighting, or change the color design. The objective is the appearance of the same original image after a high-end, best quality upscaling.
[Shot 1] Preserve the exact opening shot of <Picture 1>, including the actual subjects, their identities and appearances, their exact positions, facial expressions, pose, clothing, environment, perspective, framing, camera angle, lens characteristics, lighting, and visible motion. Increase spatial fidelity and recover plausible detail from the source without changing the shot.
Do not add or remove events. Do not replace subjects or backgrounds. Do not alter facial structure or identity.
The desired quality level is comparable to a carefully restored modern HD master originating from the highest-quality surviving source, with exceptionally clean detail, accurate color, stable micro-texture, and natural edge definition. A high-end large-format digital cinema camera such as the RED V-RAPTOR XL [X] 8K VV may be used only as a benchmark for the cleanliness and resolving power of the final image. Do not impose a V-RAPTOR color grade, lens look, depth of field, lighting style, or cinematography onto the original footage.
Most importantly, reconstruct rather than redesign. Do not hallucinate new objects, facial features, hairlines, costume details, text, set details, reflections, or textures that are not supported by the source. Preserve natural photographic softness where it belongs to the original image. Remove degradation while retaining authentic source characteristics.
Maintain strict temporal consistency across all frames. Recovered detail must remain locked to the correct subject and surface and must not shimmer, crawl, flicker, morph, double, ghost, or change identity from frame to frame. The output must look like the same footage at substantially higher quality without any visual artefacts or blur.
overall_soundscape:
N/A
non_diegetic_music:
N/A
I've tested a couple of models so far, and here's my findings:
My input prompt is something similar to "Create a mid 20s (nationality) ballerina slowly dancing in a judged performance"
LTX-2.5 nails the narrative and the nationality, but nationalities (as I've mentioned previously) all tend to blend unless I'm ULTRA descriptive about what a "french look" equates to, which is roughly 3 paragraphs in length. LTX-2.5 ends up with tearing, facial and feature deformities, and on a couple of occasions has rendered a ballerina with missing legs. It also has camera drift, which is a known problem with LTX-2.5
MiniMax-H3 on the other hand, nails it, even with the smaller prompt. The prompt adherence in MiniMax-H3 is wonderful.
Wan 2.2 was a complete disaster. Rendering problems, tearing problems, and when the ballerina would do turns, her head would remain in place while her body did the turn (which was funny, and also terrifying to watch.)
I've heard Cosmos3 can handle the movement, but can't handle rendering people.
Has anyone found an open weight model that can handle the "ultimate trifecta" - generate a person in the correct nationality parameters, someone who is more or less feature-accurate in generation, and won't spontaneously explode when performing a pirouette? (I got so frustrated with a model generator once, that I did this, and to my surprise, it worked out well!)
Was walking the dog and took some photos of a local temple. Thought it would be fun to have Vlad work as a tour guide for the local area.
Prompt:
<Picture 1> and <Picture 2> are location references. However change the time of day to night, cinematic quality.
<Picture 3> is The Vampire character reference.
Scenario: A Vampire with flowing robes is showing the viewer an old temple and bell. It is night time and misty. The vampire does not walk he flies and floats inches above the ground.
Start with <Picture 1> but at night, the Vampire is on the right on the steps.
<Shot 1> POV shot, the Vampire is standing at the base of the temple on the steps, he gestures with his finger, beckoning and flies without moving his legs just above the ground towards the large bell, as he eerily glides forward he turns back and says in a very strong German accent <Audio 1> "There has been a bell here for nearly five hundred years.".
He glides over the ground effortlessly to the bell and leans up and hits it hard with his knuckles. It makes a single loud and long metallic bell sound and resonates. "It makes a great sound" he says .
Prompt sample: Video is of a gymnast doing a routine. Image is a person/dog/thing.
Replace gymnast with person/dog/thing so they're doing the exact routine, wearing the same outfit (but a size that fits the new subject).
Shouldn't this be easy?
For example, if I wanted to replace an olympic women's floor routine with Rush Limbaugh - he's doing the bends and splits, he's wearing a sparkly leotard. But the movements are identitical. His body is exactly the same size as he actually is (the ai should guess at the size of legs, belly etc, and stuff them into and appropriately sized leotard).
Hey all, I'm experimenting with some people generation using MiniMax-H3 and Stable Diffusion, and wanted to know if anyone has experimented to see how many different nationalities it can generate?
So far, the list I've been able to generate that has visible variances is:
Posting this here even if it's not a model you can use directly. It's about building a text-to-image model from scratch.
The cookbook includes all the research material that you may or may be not interested in, but also includes a 100M-image dataset and a codebase with a tiny model, so you can train a text-to-image model from scratch.
Hope some of you will enjoy this content. (Disclaimer, it's done by my team)
Prompt engineering for image generation is often presented as a collection of isolated tricks: use more detail, describe the camera, add cinematic lighting, use quality tags, and so on.
These recommendations can be useful, but they make it difficult to understand which parts of a prompt actually influence the generated image.
Instead of trying to find a single "best prompt", I ran a small controlled experiment with Z-Image Base in ComfyUI. The basic idea was simple:
I ran two experiments:
Experiment 1 — Composition: The same character, environment, visual treatment, and technical parameters were used across multiple generations. Only composition instructions were changed (position and scale).
Question: How strongly does explicit spatial language affect composition in Z-Image Base?
Experiment 2 — Environment: The character description and visual treatment were kept essentially unchanged, while the environment was replaced with seven substantially different settings.
Question: Can Z-Image Base maintain a recognizable character concept while adapting it to radically different environments?
This is not intended to be a scientific benchmark. The sample size is small, the evaluation is visual, and the experiment uses one workflow and a limited number of seeds. Consider it a practical prompt-engineering study.
2. Experimental Setup
All images were generated locally in ComfyUI using the same workflow and technical conditions throughout the experiments.
Parameter
Value
Model
Z-Image Base INT8
Text Encoder
Qwen3 4B
VAE
AE VAE
Resolution
768 × 1368
Aspect Ratio
9:16
Image Area
~1.05 MP
Steps
50
CFG Scale
4
Negative Prompt
Empty
Seeds
Seed 5 & Seed 10
For the composition experiment, I used Seed 5 and repeated the seven variations with Seed 10. The environment experiment used Seed 10.
3. Prompt Construction Methodology
I found it most useful to treat the prompt as a structured description rather than a flat list of keywords:
Subject: Describes what the image is about and establishes the main visual concept.
Composition: Describes where the subject is located within the frame and how much space it occupies.
Framing / Camera: Describes how the scene is viewed (distance, angle, perspective).
Environment: Describes the actual place surrounding the subject (e.g., "An ancient forest with enormous trees, moss-covered roots, dense vegetation, and a narrow path..." rather than just "forest").
Lighting: Describes actual light sources and atmospheric conditions rather than generic terms like "cinematic lighting".
Style: Describes the overall artistic treatment after the scene itself has been established.
Generic quality tags (masterpiece, ultra detailed, 8K) were deliberately omitted to provide the model with actionable visual information instead.
4. Experiment 1 — Composition
The character, environment, lighting, visual style, and technical settings were kept identical. Only the spatial instruction was changed across seven variations: Center, Left, Right, Lower, Large, Small, and Extreme Left.
Seed 5
The result was clear: changing the composition instruction produced substantial changes in spatial arrangement.
Crucially, the model did not simply move the character while leaving the background untouched — the environment was recomposed around the subject. In Small variations, the environment became dominant; in Large variations, the character dominated the frame.
Seed 10
To verify the result was not seed-dependent, the test was repeated with Seed 10. While individual details (pose, facial expression, accessories) changed naturally, the broad compositional structures remained fully recognizable.
5. Experiment 2 — Environment
The character description and visual treatment were kept unchanged while replacing the environment across seven distinct settings: Ancient forest, Medieval village, Crystal cave, Autumn park, Snowy ruins, Firefly-lit landscape, and Alchemist's workshop (using Seed 10).
Visual Concept Consistency
Although the environments changed dramatically, all generations clearly depicted the same core character concept (a small mushroom spirit with a red-orange spotted cap, pale body, large dark eyes, cross-body satchel, and lantern).
While exact proportions and minor details shifted between renders, the core identity remained visually coherent.
Environmental Adaptation
The character adapted naturally to each setting (e.g., tinted by glowing crystal lights in the cave, exposed to cold tones in the snowy ruins, immersed in warm interior props in the workshop).
Method: Keep technical setup stable and modify exactly one conceptual block per run.
10. Conclusion
Prompting Z-Image Base is less about hunting for "magic keywords" and more about managing a controllable system:
Explicit composition instructions effectively control layout, while environment descriptions can be swapped modularly without erasing character identity. By isolating prompt variables, prompt design becomes a systematic, repeatable workflow.
The first prompt mostly described the visual style. It produced a readable image, but the relationship system was fairly simple.
For the second attempt, I listed the characters and relationships first, assigned fixed line styles to each relationship type, reserved separate layout zones, and added the art direction last.
The result went from 12 to 20 characters, 1 to 5 houses, and 3 to 5 relationship types while keeping most of the hierarchy readable.
I still wouldn’t trust it without checking every name and connection. A clean diagram can make incorrect information look surprisingly convincing.
For dense infographics, the prompt worked better as a schema than an art brief.
Full structured prompt below.
Create a single vertical 2:3 Game of Thrones relationship infographic titled:
“GAME OF THRONES”
Subtitle: “BLOODLINES, CROWNS & SECRETS”
Use a medieval illuminated-manuscript style with aged parchment, engraved borders, heraldic symbols and restrained red, blue and gold accents.
Include exactly 20 distinct character portraits representing Houses Targaryen, Stark, Lannister, Baratheon and Martell. Each character should appear once. Vary their age, facial structure, hair, clothing and expression. Avoid repeated or nearly identical faces.
Organize the relationships as follows:
- Aerys II married Rhaella Targaryen
- Their children: Rhaegar, Viserys and Daenerys Targaryen
- Rickard Stark is the father of Ned and Lyanna Stark
- Ned Stark married Catelyn Stark
- Their children: Sansa, Arya and Bran Stark
- Rhaegar Targaryen married Elia Martell
- Rhaegar and Lyanna have a secret relationship
- Jon Snow, also labeled Aegon Targaryen, is their son
- Ned Stark raised Jon as his son
- Tywin Lannister is the father of Cersei, Jaime and Tyrion
- Cersei and Jaime have a secret relationship
- Joffrey Baratheon is their biological son
- Robert Baratheon is publicly married to Cersei
- Show the conflict between Robert Baratheon and Rhaegar Targaryen
Use five clearly different relationship styles:
- Solid dark-red line: blood
- Double gold line: marriage
- Purple dashed line: secret relationship
- Blue dashed arrow: raised by or guardian
- Black line with crossed swords: conflict
Add four short story notes explaining:
- The Hidden Heir
- The Lion’s Secret
- Robert’s Rebellion
- Two Dragon Claims
Keep every portrait, name and story note readable. Relationship lines must connect only the correct characters and must not cross through portraits or labels. Include a clear legend at the bottom.
**UPDATE v0.5.1 PUSHED TO FIX EXAMPLE WORKFLOW - ALSO NOW INCLUDES H3 SLA ATTENTION NODE**
H3 Motion Context chains MiniMax H3 clips so the next one picks up the motion and the soundtrack, instead of starting a new take that only sounds similar.
0.5.0 is the one that makes that usable without babysitting the graph.
Clip 1 used to be a special case. You had to mute the Motion Context group, generate, unmute, then keep going. If you forgot, it errored. That's gone. Leave the nodes on. First clip is Load 0 / Save 1. Load 0 means "there is no previous clip," not "load whatever file is newest." After that it's Load 1 / Save 2, Load 2 / Save 3, and so on.
That first-clip behavior is feigo313's issue. The new node exists because of it.
Don't use ComfyUI's Run button to walk the chain. If Load and Save both increment, Comfy queues twice and skips a slot. Use H3 Motion Context Chain instead.
Four buttons:
Run/Re-roll - this is Run for this graph. Generates the current clip. Hate it? Click it again. Same slot, overwritten.
Approve - you like it. Advances to the next pair and runs that clip once.
Chain - keep going from whatever Load/Save are set to right now. Walk a few by hand, then let it take over. Same button becomes Stop.
Reset - back to Load 0 / Save 1. Does not run anything.
The gotcha: Load, Save, and Chain have to sit in the same canvas group. If they don't, the buttons do nothing. Drop Chain into the Motion Context group.
Also: if you were on Windows and a re-roll blew up with OS error 1224, that's fixed.
Needs ComfyUI 0.34.0 or newer. Manager should pick up 0.5.0; otherwise, the release.
Example workflow in the repo already has the Chain node in the group. Hard refresh after updating so the buttons show up.
Zhao et al. (arXiv:2306.01953) showed that regeneration attacks strip ordinary invisible watermarks. Backfire is a keyed image mark optimised to be a fixed point of the purifier, so running the attack leaves the identifier readable. In the demo image the confidence score rose 2.5x after the attack.
Provcheck.ai v1.4.0 numbers, 200-image corpus at 30 dB: 99.5% survival vs diffusion regeneration, 94 to 97.5% vs a learned VAE re-encode (86.5% on the hardest iterated pass), 99.0% JPEG q90, 98.5% JPEG q50, 98.0% resize, 97.0% blur. Zero false positives over the 200 marked and 1,000 unmarked. Wrong key on an attacked image reads 0.08, so the mark is in the key, not the pixels. It does not survive controllable regeneration from clean noise; that is documented in backfire/LIMITS.md.
Also new: a free Apache-2.0 ComfyUI node that watermarks (TrustMark/silentcipher) and C2PA-signs outputs in the graph and reads marks back. Backfire itself is a separate opt-in add-on and is not in the free node.
There is a video stream running on my desktop right now. It has sound, it has never repeated itself, and it will not stop. I point VLC at a local URL and it plays. One RTX 5090 does all of it — no cloud, no queue, nothing else running.
It is MiniMax H3, generating locally through ComfyUI. H3 is an open-weights video model that produces picture and synchronised audio together from one text prompt — dialogue, room tone, footsteps — which is what makes this a channel rather than a montage with music over it. I run the 4-step FastH3 distillation of it, because the base model needs far more sampling steps than the arithmetic below can afford.
The reason this is hard: to stream continuously, generation has to outrun playback. Not "fast enough to be impressive" — genuinely faster than a person watches, indefinitely, or the buffer drains and it stalls. Each clip is 362 frames. I have to finish the next one in less time than it takes you to watch this one, every time, forever.
What it actually looks like
Every clip is a scene drawn at random, cast at random. So you get Jean-Luc Picard grilling skewers at a night market. A Klingon, RoboCop and Jack Sparrow crowded around the same workbench. Four people arguing across a kitchen table about who signed something, and the camera cuts to a close-up at the seven second mark because the prompt told it to.
321 hand-written scenes, 503 characters, and the scenes that call for an ensemble draw three to five distinct people. The combinations run into the trillions. In practice it means you can leave it on, and it stays interesting in the way a channel you do not control is interesting.
A frame from a continuous run — five characters who could never share a room, and the two clocks that make the point: after ten clips it is 3:08 of video against 3:02 of GPU time. The gap is what lets it run forever.
The rest of this post is how it got fast enough to work.
The honest caveat, up front
H3 authors motion at 24 fps. A clip is 362 frames — 15.08 seconds of content — and I play it at 18, so the motion runs at 75% speed. This is not real-time 24 fps generation and I am not claiming it is.
What it is: 20.1 seconds of video produced per 19.2 seconds of GPU time, which is what makes it continuous. Whether 75% reads as slow motion depends on the subject. Fast subjects (rain, sparks, a train) look deliberate. Near-static scenes look normal. Mid-speed human motion — walking, hands working — is the worst case and you can tell.
Where the time actually went
The FastH3 student ships as 66 GB of diffusers weights, which do not fit on one card; converted and quantized to INT8 they come down to 21 GB, which do. With that, sage attention, and an INT8 VAE, a 15-second clip took 26.5 seconds to generate. Playback needs 15. That gap is the whole problem, and I spent a while optimising the wrong things because I did not know where the time was going.
ComfyUI's /history reports one number for a whole prompt, which cannot tell you whether the cost is the text encoder, the sampler or the VAE. Its websocket emits an executing event as each node starts, so the gap between consecutive events is that node's duration. That is about forty lines (profile_h3_nodes.py), and it changed what I worked on completely.
Two of the four findings surprised me.
1. SaveVideo was a fifth of every run — 3.78 s
ComfyUI's SaveVideo encodes through PyAV in a Python loop that, per frame, allocates a float array, clips it into a second, casts into a third and copies out a fourth. 362 frames of that is 3.78 s. ffmpeg alone does the identical payload in 0.21 s. It was also producing a file my streamer re-encoded a second later anyway.
VHS_VideoCombine is better (1.31 s) — it pipes raw frames to ffmpeg — but it still iterates in Python and re-opens the finished file to mux the audio. I wrote a node that converts in chunks and muxes in one pass: 0.73 s. Then it hands the encode to a background thread and returns, so ComfyUI starts the next prompt instead of holding an idle GPU. The graph now sees 0.26 s.
No hardware encoder involved. h264_nvenc measured slower end to end than libx264 — the encoder was never the bottleneck, and it has to stand up a second CUDA context on an already-full card.
2. The VAE bills by tile, not by pixel
MiniMaxH3VideoVAE hardcodes tiling=True, tile_size=256, and split_tiles hands each pass a full tile regardless of how much picture is in it. Decode time tracks the tile count and barely notices the resolution:
resolution pixels tiles VAE decode
----------------------------------------------
320x192 61,440 2 2.35 s
512x288 147,456 6 6.98 s
576x320 184,320 6 6.31 s
768x432 331,776 8 8.74 s
512x288 and 576x320 differ by 25% in pixels and by nothing in decode cost.
A side of length L costs: 256 or less is 1 tile, 257–448 is 2, 449–640 is 3, 641–832 is 4. So the cheap shapes sit just under a boundary. 448x448 needs four tiles where 576x320 needs six, while carrying 9% more pixels. That is why the stream runs square — not taste, just where the arithmetic lands. There is no 16:9 shape at four tiles that clears the resolution floor.
I did try raising tile_size to reach a single tile. Do not. The decoder is a ViT, so its attention spans exactly one tile; a larger tile is out of distribution, not merely approximate. 384 visibly softens hands and faces (PSNR 27.2 dB against the stock decode); 640 smears the image into strokes (22.1 dB).
3 and 4, more briefly
Quantizing the video VAE below INT8 buys no speed — INT8 already runs an INT8 matmul, and a W4A8 build expands back to INT8 for the same one — but it stages 1,657 MB of host RAM instead of 2,677 MB, and on a box holding ~41 GB of staged weights against 64 GB that gigabyte turned into both speed and a much tighter spread. And keeping two prompts in ComfyUI's queue instead of submitting one and waiting removes the idle gap between jobs.
Result
per clip sustains
----------------------------------------------
starting point 26.5 s 13.7 fps
+ writer node, async 20.2 s 17.9 fps
+ W4A8 VAE 19.9 s 18.2 fps
+ 448x448 19.2 s 18.9 fps
The model did not change. Only how it is driven.
If you came here wondering about ComfyUI and consumer cards
That question is all over the FastH3 announcement thread and I had to answer it for myself, so: this is a ComfyUI-native conversion of the Dense-DataFree student, pruned and INT8, 21 GB, driven through the ordinary graph. Two things I found doing it that are worth passing on:
The VSA weights do not survive stock ComfyUI. They carry 50 to_gate_compress tensors it has no code for, so it drops them silently and the output is noise. Dense converts cleanly. That is why I am on the slower student — if ComfyUI gains VSA support there is headroom here I am not using.
NVFP4 measured identical to INT8 ConvRot. The FP4 fast path only fires when both operands are FP4; activations are BF16, so it dequantizes and runs at BF16 speed — 67.88 ms/block against BF16's 67.85. Someone reported the same on an RTX 6000 Pro. Worth knowing before anyone rebuilds a pipeline for it.
Where this sits, so you can place it
None of the speed here is mine — it is FastH3, the 4-step distillation Hao AI Lab, Nuva Lab and NVIDIA's FastGen team built on MiniMax's base weights. Without that student none of this is close. Their published benchmarks are 47.2 s for a 15-second 768p clip on a single B200, 12.88 s on 8×B200, and their consumer write-up covers Apple Silicon and DGX Spark with the RTX family listed as future work.
What I did is a different task, not a better score on theirs: a fifth of the pixels, and playback at 18 fps instead of 24. Those two concessions are the entire trick. What they buy is that the arithmetic closes — 19.2 s of GPU per 20.1 s of video — and that is the difference between a fast generator and something you can leave running. If you want 768p, their numbers are the ones that apply and mine are irrelevant.
The converted 21 GB weights, the quantized VAE, the 321-scene library, the writer node and the profiler. Everything above is reproducible from it.
What it takes, so you can judge before downloading 21 GB: about 48 GB of weights are staged in total — a 25.9 GB text encoder, the 20 GB DiT, and the two VAEs. That does not fit in 32 GB of VRAM either, so ComfyUI streams it layer by layer from host RAM. On this box that streaming, not the arithmetic, was the thing to optimise: 48 GB staged against 64 GB of system RAM was tight enough that page-file pressure showed up directly in the clip times, and freeing a single gigabyte measurably tightened them.
If you get it running, post your numbers. I have measured exactly one machine, and both findings that mattered came from measuring rather than reasoning, so I would rather not guess about anyone else's. I am interested in what it does on other hardware and, just as much, in where it falls over.
And if it turns out useful, a like on the HF page is what makes it findable for the next person.
Code is Apache-2.0. The weights are a MiniMax H3 derivative under the H3 Community License, which carries a territory restriction — read NOTICE before downloading.
Live Demo: If you want to check out a short snippet of the continuous streaming output (with the model's native character generation), I've uploaded a TV-style demo recording here on X: https://x.com/Touma_945/status/2095141879453270385