IO_load_mage
The Load Image that can see your subfolders (yes, the name is misspelled)
- IMAGE
- MASK
What it's for
ComfyUI's stock Load Image has one quiet limitation: its file list is built with a flat os.listdir of ComfyUI/input. Files at the top level show up. Anything you've organised into a subfolder - the batches you uploaded for an img2img pass, a folder per project, an image sequence you dumped in - is invisible in the dropdown, even though the file is sitting right there in input/.
IO_load_mage is that same loader with a recursive listing. It's a subclass of core LoadImage; the pack only overrides the input list. Same behaviour, same outputs, same upload button - but the dropdown walks the entire input tree.
And yes, the class name is missing an i. IO_load_mage, not IO_load_image. That's a typo in the pack, it's shipped that way, and it's why a search for "IO load image node" turns up nothing. Search the misspelling or you'll never find it.
How it works
The override is about ten lines. Instead of os.listdir, it does an os.walk of the input directory, builds each file's path relative to that root with forward slashes, filters to image content types, and then lists every file twice:
example.png
example.png [input]
The second form is ComfyUI's annotated filepath syntax - the [input] suffix explicitly tells folder_paths.get_annotated_filepath() which directory to resolve the name in. Core's own Load Image relies on bare names and assumes the input directory; the pack offers both so a workflow can be explicit about it. Seeing two entries per file in the dropdown is not a duplicate-file bug. It's two ways to name the same image.
Everything else is inherited. image_upload stays on, so the upload button and drag-and-drop still work, and load_image is core's - which on current ComfyUI builds means you also get the alpha-to-mask handling and the video-file path for free (drag an .mp4 from your input folder in and you get an image batch, not an error).
The inputs and outputs that matter
There are no knobs. One input:
image- a combo listing every image file underComfyUI/input, recursively, in both name forms. Set it, or upload into it.
Two outputs, both inherited from core Load Image:
IMAGE- the pixels, as a batch.MASK- the alpha channel as a mask (or a blank mask if the image has no alpha). Wire it into inpainting, an alpha-composite, or anything that wants a MASK rather than an IMAGE.
That's the whole node. If you're expecting a size/label/format option, you're thinking of a different loader in the same pack.
Install
Same pack as the rest of these nodes - ComfyUI-Apt_Preset:
cd ComfyUI/custom_nodes
git clone https://github.com/cardenluo/ComfyUI-Apt_Preset
cd ComfyUI-Apt_Preset
python -m pip install -r requirements.txt # your ComfyUI's python
Restart ComfyUI afterwards. ComfyUI Manager will also find it by pack title. The requirements file pulls a fair amount in (onnxruntime, transparent-background, gguf, scenedetect, opencv-python-headless …) mostly for other nodes in the pack - this loader itself needs nothing beyond core, and no models.
Common issues
The node doesn't exist at all. Look for the pack folder in the console startup log; if there's a single "IMPORT FAILED" for custom_nodes/ComfyUI-Apt_Preset, the pack's __init__.py didn't survive its own imports - it loads every module unguarded, so one missing dependency hides all 200-odd nodes including this one. Run the requirements install and restart. Users do hit exactly this; it's the most common thing said about the pack in the wild.
The dropdown got slow. The file list is rebuilt every time the node's schema is requested, and it's a full recursive walk. If your input folder has accumulated thousands of files, expect a long combo box and a sluggish graph load. Cleaning out input/ - or working in a fresh subfolder per project - is the fix, and it's the reason this node exists in the first place, so use it.
A workflow opens with the image missing. Because this resolves names relative to ComfyUI/input, a graph shared without its images will point at nothing and fail validation. That's true of core Load Image too; the subfolder paths just make it easier to lose track of what's local.
Images in subfolders don't load even though they're listed. They will load - the annotated [input] variant exists for exactly this - but only if the file is genuinely inside the input directory. Files elsewhere on disk (a Desktop folder, an external drive) are not in the list and cannot be selected.
You want a batch picker, not a single file. That's a different node in the same pack - the IO_load_*_batch family, which ship their own JS for thumbnail browsing. This one picks one image.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| image | COMBO | 2 options: example.png, example.png [input] |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| MASK | MASK | — |