Quick Watermark Video
Watermark every frame of a video in one node — no ffmpeg, no per-frame fuss
- image
- watermark
- watermark_mask
- image
You've just finished a WAN, LTX, or Hunyuan clip you're proud of, and you want your logo on it before it goes anywhere. In ComfyUI that used to mean a tedious detour: export the video, run an ffmpeg overlay command, re-import. Quick Watermark Video collapses all of that into a single node you drop in the graph between your generation and your save.
The name is the honest part: it's "Quick." It doesn't call an API, needs no key, downloads no models, and installs with zero extra dependencies. It's a pure per-frame composite - the kind of small, single-purpose utility node the ComfyUI ecosystem is stuffed with and every workflow needs once it leaves the toy stage.
How it works
The trick that makes it work on video is a ComfyUI convention: video frames are just an IMAGE tensor with the frames stacked along the batch dimension. A 121-frame LTX clip isn't "a video" to the graph - it's a [121, H, W, 3] image batch. This node iterates that batch and alpha-composites a watermark onto every frame, then hands back the same-shaped IMAGE for you to save.
Under the hood (the source is a single ~350-line file, worth a skim if you're curious) it resizes the watermark to a percentage of the frame width, builds an alpha channel, and blends per frame with a plain source * alpha + target * (1 - alpha). All torch, on the same device as your frames - no CPU round-trip, so a 100-frame batch stamps in well under a second.
The inputs that matter
image(required) - your frames, from a video decode, an image-to-video model, or even a single still. Anything that's anIMAGE.watermark_preset-speaker-whiteorspeaker-black, two built-in speaker-icon PNGs shipped with the pack. Good for a quick "sound on" badge or just testing the layout before you plug in your real logo.watermark(optional) - your actual PNG fromLoad Image. When connected it overrides the preset.watermark_mask(optional) - themaskoutput fromLoad Image. See the trap below.alignment- nine positions, fromtop-leftthroughcentertobottom-right. Default isbottom-right, which is where you'll want it.offset_percentage(default 2) - margin from the chosen edge, as a percentage of the frame size, not pixels. On a 1024-wide frame that's ~20px.resize_percentage(default 20) - watermark width as a percentage of frame width. Your logo probably wants 8–15; crank it toward 200 if you want a full-width band.opacity(default 60, 0–100) - global transparency. Drop it and your watermark sits politely in the corner instead of shouting.
It outputs a single image (IMAGE) - the watermarked batch. Wire it into a video-save node like VHS Save Video or ComfyUI's own Save Animated WEBP and you're done.
Install
Easiest via ComfyUI Manager - search "Quick Watermark." Or, the manual way:
cd ComfyUI/custom_nodes
git clone https://github.com/boobkake22/ComfyUI-QuickWatermark
Restart ComfyUI. That's the whole install: there's no requirements.txt, and the code only needs torch, numpy, and PIL, which ComfyUI already ships. The node appears under image/watermark as "Quick Watermark Video."
Where people get burned
The one real trap is PNG alpha. ComfyUI's Load Image deliberately splits a PNG's transparency off into its separate mask output - the image you get is RGB. Connect only Load Image.image to watermark and this node treats the logo as fully opaque, and you'll render a hard rectangle over your footage. Fix: wire Load Image.mask into watermark_mask too. The built-in presets handle their own alpha automatically; only your custom image needs the mask.
A couple of smaller notes. If opacity is 0 it short-circuits and returns your frames untouched - handy for A/B-ing layout. The watermark batch must be a single image or match your frame count exactly, so no per-frame logos unless you build a matching batch first. And one honest caveat: the "Video" in the name means it operates on video frames - it won't encode anything. And it's visible branding, not steganography; if you need to prove ownership invisibly, this isn't that tool. For slapping your name on a clip before it leaves ComfyUI, it's the node you actually reach for.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| watermark_preset | COMBO | 2 options: speaker-white, speaker-black | |
| alignment | COMBO | 9 options: bottom-right, center, top-center, top-left, top-right, center-right, +3 | |
| offset_percentage | FLOAT | 2.00–100 | — |
| resize_percentage | FLOAT | 20.00.1–200 | — |
| opacity | FLOAT | 600–100 | — |
| watermarkopt | IMAGE | — | |
| watermark_maskopt | MASK | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |