Nodes/ComfyUI Rogala Nodes/AlignedTextOverlayVideo
ComfyUI Node

AlignedTextOverlayVideo

Label every frame of your video so the metadata survives export

By Rogala·Created 6 months ago·Updated 4 months ago· 20
AlignedTextOverlayVideo
  • images
  • images
text_templateseed: %KSampler.seed% | steps: %KSampler.steps% cfg: %KSampler.cfg% | %KSampler.sampler_name% | %KSampler.scheduler%
verticalbottom
horizontalright
font_size16
text_colorwhite
bg_colorblack
bg_opacity150
first_frame_onlyfalse
external_text

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.

Categoryrogala/Video

Inputs (10)

NameTypeDefaultDescription
imagesIMAGE
text_templateSTRINGseed: %KSampler.seed% | steps: %KSampler.steps% cfg: %KSampler.cfg% | %KSampler.sampler_name% | %KSampler.scheduler%Template text. Use %NodeTitle.param% to embed node values.
verticalCOMBObottomVertical anchor for the text block.
horizontalCOMBOrightHorizontal anchor for the text block.
font_sizeINT1610–50Font size in points.
text_colorCOMBOwhiteText colour.
bg_colorCOMBOblackBackground rectangle colour. Use 'none' for transparent.
bg_opacityINT15050–255Background rectangle opacity (alpha value, 50–255).
first_frame_onlyBOOLEANfalseWhen enabled, only the first frame gets the overlay. Use for fast preview before processing the full video.
external_textoptSTRINGExtra text appended after the resolved template. Connect SamplerSchedulerIterator here to embed the current sampler/scheduler pair.

Outputs (1)

NameTypeDescription
imagesIMAGE