Ultra Tools Image Load
Load Image with a real thumbnail browser (and folders outside input/)
- IMAGE
- MASK
Why anyone would replace a core node
Core Load Image is fine for six files. Then you've got four hundred outputs from last month, a reference folder on another drive, and a filename you half-remember, and you're alt-tabbing to a file manager to find a .png whose name you then paste into a dropdown that truncates it.
Ultra Tools Image Load keeps the core node's behaviour and replaces the picker. Same IMAGE and MASK outputs, same conventions, so it's a drop-in swap: delete the old node, drop this in, reconnect, and nothing downstream notices.
Two things it adds that core doesn't have at all:
A thumbnail browser. Grid or list view, search by filename, folder filter, adjustable thumbnail size, resolution shown per image, full image visible without cropping to a square. Preferences persist between sessions, and thumbnails load viewport-first so a big folder doesn't hang the panel.
External folders, loaded in place. Register a directory anywhere on disk - another drive, a shared folder - and its images appear in the picker without being copied into input/. Subfolders included. This is the feature that makes it worth installing: copying reference images into input/ is a workflow tax you stop paying.
How it works
It subclasses the same loading machinery as the core node - the image widget is a combo whose values are filename strings, IS_CHANGED and VALIDATE_INPUTS behave like Load Image's so re-running with the same file reuses the cached tensor.
The browser is web/ultra_image_load.js plus a set of HTTP routes in image_load.py. Three details from that code are worth knowing:
- External roots are a registry with a path check. Folders are stored in a small JSON file in your ComfyUI user directory, and every request is resolved and then verified to sit inside a currently registered root. A stale or hand-edited path can't be used to read arbitrary files off the machine. That's more care than most node packs take.
- Thumbnails are cached on disk in a dedicated cache directory with eviction, keyed by source path and mtime, which is why browsing a large folder is fast on the second visit.
- Original resolution is preserved for the actions that matter. Right-click → open in new tab, save as, copy image all use the full-size source, not the thumbnail. Delete works on the real file.
That last one is the warning: delete is permanent and does not go to a recycle bin. The browser shows you the selection first; check it.
The inputs and outputs
One input, image - the combo of available files. Everything else is the browser UI: click or double-click to select, Ctrl/Shift click for multi-select (used by delete), search box, folder filter, thumbnail size slider, and a toggle between grid and list.
Outputs are IMAGE and MASK, identical to core Load Image. MASK is the alpha channel in the same inverted convention the core node uses, so inpainting workflows that already expect that keep working unchanged.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Yamoon-jjang/comfyui-Ultra-Tools
Manager → Ultra Tools, then a full restart and Ctrl+F5. No pip packages - the pack's requirements.txt deliberately installs nothing; this node uses Pillow and aiohttp, both already present.
If you're coming from the older comfyui-Ultra-* single-node packs, delete those folders first. The same class names are registered by the unified pack and duplicates cause errors that make no sense until you find the second copy.
Gotchas
"Value not in list" after you move or rename a file. The image widget holds a filename string that was valid when you saved the workflow. Move the file and the workflow fails validation - this is exactly core Load Image's behaviour, and the fix is to reselect the image. If it's a file on an external root that has been unregistered or the drive is unplugged, the same error appears.
External folder doesn't show up. Network shares and removable drives are the usual suspects: the path has to be readable by the ComfyUI process, which is not necessarily your user account if you run it as a service or in a container. Inside Docker, a host path means nothing until it's mounted.
Deleted something you wanted. There's no undo, and no, the .png isn't in your trash. If you routinely clean up between sessions, do it in the file manager and treat this node's delete as a convenience for obvious junk.
For the biggest quality-of-life gain, register one external root for your whole output archive and one for reference images, then stop copying files into input/ ever again.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| image | COMBO | 1 options: example.png |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| MASK | MASK | — |