VideoSeal Message (Binary)
Reproduce your watermark without saving anything
- message
Reproduce your watermark without saving anything
Leave the message field empty on VideoSeal Embed Watermark and the model rolls a random message for every clip you stamp. That's fine for "mark this and forget it" - but the entire point of watermarking is being able to prove a clip is yours later, and to do that you need to know exactly what you embedded. This node is the boring, reliable half of that job: it turns a seed into a deterministic string of 0s and 1s, so the same seed always produces the same message, run after run.
It's the same idea as the seed value-nodes you've seen all over ComfyUI - one small node fanning a single value out to everything downstream, the pattern covered in the node-plumbing layer - except what fans out is a 256-bit binary string instead of an integer. Same seed → same bits, guaranteed, because the node reseeds a fresh torch.Generator before every draw.
The inputs that matter
Just three, and you'll realistically touch two:
- nbits (default 256) - how many bits the message contains. Keep it in sync with the model you loaded: 256 for
videosealandpixelseal, 1024 forchunkyseal. The easy way to never get this wrong is to wire the model loader'snbitsoutput into this input. - seed (default 0) - the reproducibility switch. Same seed, same message; change it and you get a different one. Note that 0 is a perfectly valid seed, not "unset."
- hex_string (optional) - if you'd rather work with a memorable hex constant (
a1b2c3) than a wall of bits, the node expands each hex digit to four bits and pads or truncates tonbits.
The single output, message (STRING), plugs straight into the message input on VideoSeal Embed Watermark.
Where it fits in the workflow
The clean setup is loader → message → embed:
VideoSealModelLoader ── nbits ──▶ VideoSealMessage ── message ──▶ VideoSeal Embed Watermark
Embed the message, save the watermarked clip, and you can regenerate the exact message anytime by typing the seed back in - no need to keep a copy of what you embedded. That's what makes later detection meaningful: recovered bits that match your seed's message are your fingerprint. A random 256-bit message you never recorded is just noise when you go to verify.
One gotcha worth knowing: if your message length and the model's nbits disagree, the embed node silently truncates or zero-pads to fit. The message you recover at detection will then be a different length than the one you think you embedded, which makes the comparison confusing. Wire the loader's nbits in and this never bites you.
Installing
VideoSealMessage ships in the ComfyUI-VideoSeal pack, alongside the model loader, embed, and detect nodes. Install once for the whole pack:
- ComfyUI Manager: search "VideoSeal" and click install - dependencies handled for you.
- Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/jc2shile/ComfyUI-VideoSeal
cd ComfyUI-VideoSeal
pip install -r requirements.txt # videoseal, omegaconf, einops
Then restart ComfyUI. The good news for this particular node: it has no model download and no device handling - the heavy lifting (the ~500 MB checkpoint) happens on the VideoSeal Model Loader, not here. If you're using this node and nothing loads, the problem is upstream in the loader or its download, not in the message generator.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| nbits | INT | 25616–4096 | — |
| seed | INT | 00–2147483647 | — |
| hex_stringopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| message | STRING | — |