Kimara.ai Advanced Watermarker
A watermark that actually moves across your images
- image
- logo_image
- mask
- IMAGE
Every time you post a batch of generations you face the same chore: open them in an editor, paste your handle on top, export, repeat. This node does all of that inside the graph, for every image in the batch at once - and if you flip one toggle, the watermark doesn't just sit in the corner, it slides diagonally across each frame by a few pixels and bounces off the edges. It comes from Kimara.ai, the cloud-ComfyUI startup, and it ships with a tiny list-to-batch helper that pairs with it. It won't stop a determined reposter, but for casual credit and brand stamping it kills the editor round-trip.
How it works
Under the hood it's pure Pillow and numpy - no models, no API, nothing to download. Each image tensor is converted to a PIL image, the text is drawn on a transparent overlay and alpha-composited on top, and the logo (if you feed one) is resized to a percentage of the image width, given an alpha level, optionally rotated, and pasted over the corner. In move mode the node keeps the stamp's position on its own class instance between frames, so every image in the batch gets the mark nudged by move_watermark_step pixels until it hits a padded border, then bounces the other way. Change the resolution mid-run and it resets to the corner. One thing to know before you dream up a design: the text color is hardcoded white. There's no color input yet.
The inputs that matter
Only two are required: image (a batch is fine, one image works too) and move_watermark, the boolean that decides whether the stamp drifts. Everything else is optional:
watermark_text- your handle or tagline. The default is literally "Made by userxyz123", so change it. Leave it empty for a logo-only stamp.logo_imageandmask- an IMAGE to use as a logo watermark, plus an optional MASK that's applied as the logo's alpha channel (inverted).opacity- the trap. 0 is fully visible, 100 is fully transparent. Backwards from every instinct.logo_scale_percentage- logo width as a percentage of image width (default 25).font,font_variation,font_size- the font path (defaults to the bundled DM Sans variable font), a named variation like Bold, and the text size. Font size scales up automatically for resolutions wider than the 800px baseline.rotation- rotates the logo only, not the text.move_watermark_step- how many pixels the stamp travels per frame (1–500).
The single output, IMAGE, is a list of per-image tensors rather than one batched tensor. That's deliberate: the pack's other node, Kimara.ai Batch Images, exists to concatenate that list back into a single batch. Wire the list into a node expecting a plain IMAGE and you'll get per-item expansion or a hard error, depending on what it's plugged into.
Install
This one's painless: requirements.txt is just Pillow and numpy, both of which ComfyUI already ships, and there are no model files. Install through ComfyUI Manager (search "Kimara" or "Advanced Watermarking"), or the manual way:
cd ComfyUI/custom_nodes
git clone https://github.com/kimara-ai/ComfyUI-Kimara-AI-Advanced-Watermarks
then restart ComfyUI. It's AGPL-3.0 licensed, which only matters if you ever wrap it in something you distribute.
Gotchas
opacityis backwards, see above. Keep it low (10–40) for the classic faint stamp.- The default font path is relative, so it resolves against ComfyUI's working directory. In a container, give the full path from the workdir, e.g.
custom_nodes/ComfyUI-Kimara-AI-Advanced-Watermarks/assets/fonts/DMSans-VariableFont_opsz,wght.ttf. If the file isn't found, the node silently falls back to PIL's tiny default bitmap font - your text will look surprisingly old. rotationonly spins the logo image; the README admits it. Text stays put.- The output is a list, not a batch. Route it through the pack's Batch Images node before anything that expects a single tensor.
- There's no per-image variation: one uniform stamp across the whole batch. That's the feature, not a bug.
Honestly, for a single image you're better off with WAS Node Suite's text overlay or an editor. Where this earns its keep is batch work: a grid of variations, an animated sequence, or video frames, where hand-stamping each frame would take all evening.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| move_watermark | BOOLEAN | — | |
| logo_imageopt | IMAGE | — | |
| maskopt | MASK | — | |
| move_watermark_stepopt | INT | 101–500 | — |
| watermark_textopt | STRING | Made by userxyz123 | — |
| fontopt | STRING | assets/fonts/DMSans-VariableFont_opsz,wght.ttf | — |
| font_variationopt | STRING | — | |
| font_sizeopt | INT | 161–256 | — |
| logo_scale_percentageopt | INT | 250–100 | — |
| x_paddingopt | INT | 200–256 | — |
| y_paddingopt | INT | 200–256 | — |
| rotationopt | INT | 0-180–180 | — |
| opacityopt | FLOAT | 400–100 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |