ComfyUI Node

Chick Hide

The picture is a decoy, your real output is in the low bits

By chookg·Created about a month ago·Updated 30 days ago· 1
Chick Hide
  • images
  • audio
  • chick_image
◄password►
◄title►
◄fps16►
◄compress2►
◄combine_videotrue►

What you get out of it

Chick Hide swallows image frames - or an audio clip - and hands back pictures of a cartoon chick. The chick is the envelope. Your PNG file, your WAV, or your MP4 is hidden in the least significant bits of its pixels, and the visible picture is the pack's own bundled cover art with your title drawn in the corner.

It's steganography with a mascot: no network calls, no file writes, just a batch of IMAGE tensors out.

In ComfyUI the metadata is normally the payload - the whole workflow rides inside the PNG, which is the ecosystem's defining quirk. Chick Hide inverts that. Instead of a file that announces how it was made, you get a file that says nothing, opens as a photo of a bird, and carries bytes in a channel nobody inspects. Legitimate reasons: shipping a short video through a channel that only accepts images, moving audio without an audio pipeline, or handing someone a payload you'd rather no platform auto-parse.

One caveat: the format has no authenticated integrity tag, and the password is an XOR against a SHA-256 keystream. Treat it as packaging, not cryptography you'd bet a secret on - steganography is a novelty corner of this ecosystem, and the node behaves accordingly.

How the carrier is built

The payload is a real file - PNG, WAV or MP4 bytes, not a re-render. A small binary header goes in first: a byte saying whether the payload is password-protected, then (if it is) a 32-byte password check and a 16-byte random salt, then the file extension, then the payload length and the payload itself. Those bits are written most-significant-bit first into the RGB channels, row-major, skipping a strip at the top left so the title text can sit there without corrupting anything.

compress is the trap in the naming. It is the LSB width - how many low bits of each channel carry data - and has nothing to do with a media codec or a compression level. 2 is the default and stays visually cleanest; 8 uses the entire channel and turns the carrier into noise. Higher also means a bigger PNG, because pseudo-random low bits don't compress.

Size scales with the payload: the canvas starts at 640×640 and grows in 64-pixel steps until everything fits. At 640 square, compress=2 holds roughly 290 KB and compress=8 about 1.1 MB.

The inputs that matter

Honestly, two of the five widgets.

  • password - blank means an unprotected payload, and the author's own tooltip points at the next article in this pack: use Chick Private Save rather than SaveImage or PreviewImage to keep the password out of PNG metadata.
  • compress - 2, 6 or 8. Leave it on 2 unless your payload doesn't fit and you'd rather widen the bits than grow the canvas.

Then title (drawn on the carrier; in a multi-carrier batch each gets a "(2/4)" style suffix), fps (1–60, default 16 - it only does anything when the payload is a video), and combine_video (default on). images and audio are both optional, but you need at least one of them or the node errors out.

Wiring logic worth knowing before you wire it: a single frame with no audio becomes a plain PNG payload, and that round-trips pixel-for-pixel. More than one frame, or any audio, and combine_video switches it to one H.264/AAC MP4 payload - which is lossy. Turn combine_video off with a multi-frame batch and you get one PNG carrier per frame instead; connect audio while it's off and the node refuses, telling you to enable it.

Output is chick_image (IMAGE). That goes straight into Chick Private Save.

Installing it

Same pack, same steps for all four nodes. Try ComfyUI Manager and search ChickTools; if that comes up empty, clone it, since the repo isn't registered under a publisher account yet:

cd ComfyUI/custom_nodes
git clone https://github.com/chookg/ComfyUI-ChickTools.git
cd ComfyUI-ChickTools
python -m pip install -r requirements.txt

Use the Python that runs ComfyUI, then restart. The install pulls requests, urllib3, numpy, Pillow and imageio-ffmpeg - that last one bundles an ffmpeg binary, so video carriers need no system ffmpeg and no PyAV.

Where people get burned

Saving a carrier with the stock SaveImage is the big one. Your password is a widget value in the execution prompt, and SaveImage embeds that prompt in PNG text chunks - so the payload stays encrypted while the password lands in plaintext in the file you were about to send. Chick Private Save exists precisely for this.

Second: re-encoding destroys everything. Reddit, most CDNs, screenshots and editor round-trips rebuild the image from decoded pixels, and the payload lives below the pixels. Same rule as PNG workflow metadata, except the failure is total instead of partial.

Finally, the errors all come back prefixed [CHICK_HIDE_ERROR], and they're mostly precise - no inputs at all, images plus audio with combine_video off, or non-string text fields. Read the message; it usually names the fix.

CategoryChickTools/Media

Inputs (7)

NameTypeDefaultDescription
passwordSTRINGCarrier password. Use Chick Private Save instead of standard SaveImage or PreviewImage to exclude password metadata.
titleSTRING—
fpsINT161–60—
compressCOMBO23 options: 2, 6, 8
combine_videoBOOLEANtrue—
imagesoptIMAGE—
audiooptAUDIO—

Outputs (1)

NameTypeDescription
chick_imageIMAGE—