Colorist Delivery Bay
Delivery Bay keeps your subject in all of them
- image
- contact_sheet
The moment your "finished" image has to live in five places, you hit the delivery wall. YouTube wants 1920x1080, IG stories want 1080x1920, the square wants 1080x1080, the OG link wants 1200x630. Hand-cropping each one drifts - you nudge the crop on the third one, then the story crop cuts the subject's ear, and suddenly the set doesn't match anymore. Colorist Delivery Bay is one node for exactly that job: give it a finished master, mark the region that must never be cut, and it writes out a named set of platform-ready PNGs where the subject survives every crop.
It's called "Colorist" because the author's Atomic-Trash suite is a finishing-room collection - the sibling ColoristFilmGrain pack does the halation and grain pass. The node itself is pure geometry plus Pillow: no API calls, no model downloads, no keys.
How it works
The core idea is the protected crop. You set protect_x/y/w/h to the rectangle that must survive - a face, a subject, key text. For each target aspect the node computes the largest crop that fully contains your protect region, centered on it and clamped to the frame. And here's the rule that makes it different from a naive center crop: if an aspect physically can't contain the protect region, it doesn't chop into your subject - it pads, letterboxing or pillarboxing the whole master onto a canvas in your chosen pad_color. Pad, never chop. That's the whole point, and it's why the pack's demo image shows a two-man scene where a naive crop hands back a headless edit.
The optional finish is where the "Colorist" name earns its keep. With finish on, each deliverable runs through Colorist Halation then Colorist Film Grain after the resize, at its final pixel size, with one shared seed. That ordering is the detail people skip: grain applied to a 1920px file and a 1080px file separately drifts coarse on the small ones and vanishes on the large ones. Applied at each deliverable's actual size with one seed, the whole set stays conformed - the same "add grain to kill the AI look" trick the post-processing crowd has been running for years, done consistently across a delivery set instead of file by file.
The single output is an IMAGE: the contact sheet, all deliverables at one height in delivery order, so you can eyeball the whole set in the graph without opening any files. The PNGs themselves land as {slug}_{platform}_{WxH}.png in a subfolder under ComfyUI/output/.
The inputs that matter
- aspects - the one you'll actually edit. One line per deliverable,
platform:WIDTHxHEIGHT. The default is a sensible starter set: youtube 1920x1080, ig-story 1080x1920, square 1080x1080, ig-portrait 1080x1350, og-link 1200x630. - protect_x / protect_y / protect_w / protect_h - the must-keep rectangle in master pixels.
protect_w/hdefault to a 256x256 box at the top-left, so set these before you trust any crop. - pad_color - black or white bars when an aspect can't contain the protect region.
- finish -
offgives you the clean set;onneeds ComfyUI-ColoristFilmGrain installed. - slug / subfolder - the name stem and the output folder (defaults
master/delivery). - seed - the shared finish seed, only used when
finishis on.
Install
Clone it in, restart, done:
cd ComfyUI/custom_nodes
git clone https://github.com/Atomic-Trash/ComfyUI-DeliveryBay
Or via ComfyUI Manager, search Colorist Delivery Bay. There are zero Python dependencies beyond torch and Pillow, which ComfyUI already has - the pack's pyproject.toml lists an empty dependencies array, so no requirements.txt surprise. The one extra: with finish on you also need ComfyUI-ColoristFilmGrain cloned alongside. With finish off there is no dependency at all. It's an output node under category image/delivery.
Gotchas
- Finish on, pack missing: it errors with a message that says exactly this - install ColoristFilmGrain or set
finishoff. A clear fail, not a silent one. - Batch in, error out: feed it more than one frame and it refuses with "pick a frame first". Per-frame video delivery is explicitly a v1.1 item; this is a one-master-frame-per-run node.
- Typo in an aspect line: it throws a readable error naming the offending line, and rejects any size below 16px.
- It overwrites by design. Deterministic names mean re-running a delivery replaces the previous set rather than stacking numbered copies. That's intended, not a bug - just know it before you run a set you wanted to keep around.
- Output is 8-bit PNG. Every listed platform ingests 8-bit, so the master stays untouched and the set is deliverable as-is - but don't expect 16-bit fidelity to come back out the other end.
If you've been doing the one-master-five-manual-crops dance, this is the node that turns that hour of fidgeting into one config string and a run.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| protect_x | INT | 00–16384 | — |
| protect_y | INT | 00–16384 | — |
| protect_w | INT | 2561–16384 | — |
| protect_h | INT | 2561–16384 | — |
| aspects | STRING | youtube:1920x1080 ig-story:1080x1920 square:1080x1080 ig-portrait:1080x1350 og-link:1200x630 | — |
| pad_color | COMBO | 2 options: black, white | |
| finish | COMBO | 2 options: off, on | |
| slug | STRING | master | — |
| subfolder | STRING | delivery | — |
| seed | INT | 420–18446744073709550000 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| contact_sheet | IMAGE | — |