AlignedTextOverlayVideo
Label every frame of your video so the metadata survives export
- images
- images
The image version of this node burns your seed and settings onto a still. AlignedTextOverlayVideo does the same thing, but for a video tensor - which means the same text block gets rendered onto every frame, so the label survives export, re-encode, and the inevitable "what settings made this clip?" question later. If you do any kind of parameter comparison across video models, this is the node you didn't know you needed.
The wiring is boring in the best way: it slots between VAE Decode and your video output node.
VAE Decode → AlignedTextOverlayVideo → VHS Video Combine
Everything from the image version carries over - same template tags, same corner anchoring, same font handling. The default template pulls the sampler's live values at run time:
seed: %KSampler.seed% | steps: %KSampler.steps%
cfg: %KSampler.cfg% | %KSampler.sampler_name% | %KSampler.scheduler%
Because the tags resolve from the active ComfyUI prompt, the values are whatever the graph actually ran with - not what you typed three hours ago.
How it works
The input is a video tensor shaped (B, H, W, C) - batch of frames, width, height, channels. The node resolves the template once, then renders the text block onto each frame using the bundled DejaVu fonts. Since video clips are long and text rendering isn't free, there's a first_frame_only toggle that applies the overlay to frame 0 only, which is a fast preview mode you should absolutely use while you're still dialing in the font size and position. Flip it off for the real render.
Inputs worth knowing: images (the video tensor), text_template, vertical/horizontal for the corner, font_size (10–50), text_color, bg_color (set to none for transparent), and bg_opacity (50–255) for the background rectangle. There's also external_text, an optional string appended after the resolved template - same trick as the image node, designed to accept the "sampler | scheduler" label from SamplerSchedulerIterator so a sampler-comparison run labels itself.
Outputs
One: images, the full video tensor with the overlay baked into every frame. Send it to VHS Video Combine or whatever encoder you use.
Installing it
It's part of ComfyUI-rogala, so it comes with the whole pack:
cd ComfyUI/custom_nodes
git clone https://github.com/rogala/ComfyUI-rogala
Restart ComfyUI, look under rogala → Video → Aligned Text Overlay Video. ComfyUI Manager works too (search "rogala"). No pip dependencies, no model files - the fonts ship inside the pack.
Where people get burned
Same trap as the image version: %NodeTitle.param% matches against the title shown on the node in the graph. Multiple samplers? Right-click → Title to rename them (Sampler_1, Sampler_2) and reference explicitly. Two genuinely video-specific cautions: put the node after VAE Decode (it operates on pixels, not latents - feeding it a latent does nothing useful), and don't forget the overlay is baked into the output. If you later decide the label is ugly, you're re-rendering the clip, not toggling a checkbox. That's why first_frame_only exists - verify once, then commit.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| text_template | STRING | seed: %KSampler.seed% | steps: %KSampler.steps% cfg: %KSampler.cfg% | %KSampler.sampler_name% | %KSampler.scheduler% | Template text. Use %NodeTitle.param% to embed node values. |
| vertical | COMBO | bottom | Vertical anchor for the text block. |
| horizontal | COMBO | right | Horizontal anchor for the text block. |
| font_size | INT | 1610–50 | Font size in points. |
| text_color | COMBO | white | Text colour. |
| bg_color | COMBO | black | Background rectangle colour. Use 'none' for transparent. |
| bg_opacity | INT | 15050–255 | Background rectangle opacity (alpha value, 50–255). |
| first_frame_only | BOOLEAN | false | When enabled, only the first frame gets the overlay. Use for fast preview before processing the full video. |
| external_textopt | STRING | Extra text appended after the resolved template. Connect SamplerSchedulerIterator here to embed the current sampler/scheduler pair. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |