Downloader
Make a workflow fetch its own missing models
- summary
- summary
The name is half a lie. The Downloader node doesn't download on every run - it checks whether a file already sits where you told it to, and only fetches it when it's missing. That doesn't sound exciting, but it's the version of "download" that actually fixes a real problem.
Here's the pain it targets. You load someone's shared workflow and the checkpoint, LoRA, VAE, or controlnet file it needs isn't on your machine. ComfyUI's loaders just fail at queue time - "model not found" - or worse, silently pick whatever else is in that folder. The Downloader node is the self-healing fix: you place it ahead of the loader, give it the file's URL and the exact path + name the loader expects, and it guarantees the file exists before the model loads. This is the same friction r/comfyui complains about constantly ("feels like I am downloading models and installing missing nodes 90% of the time"), just moved from your hands into the graph.
How it works. It's plain requests under the hood: stream=True with redirects followed, a tqdm progress bar in the console, folders created on demand, and the bytes written straight to disk. If os.path.isfile says the file is already there, it skips the network entirely and just records "present." The node's IS_CHANGED returns a random value, which forces ComfyUI to treat it as changed every queue run - that's how it re-verifies existence each time instead of caching the result and forgetting about it.
The inputs that matter. There are only a few you'll actually set:
url- a direct link to the file. HF resolve links, GitHub raw, any plain HTTP endpoint work.path- the destination folder, relative to your ComfyUI root, e.g.models/checkpoints.file_name- the exact filename the loader will look up. Get this wrong and the loader still errors; the download succeeded into a name nobody asked for.force- delete-then-redownload. Defaults to false, which is what you want 95% of the time.
Optional summary chains one Downloader's result into the next, and token feeds a Hugging Face access token (see the pack's DownloadTokenLoader). The single output, summary (type DOWNLOAD_SUMMARY), wires into DownloadSummaryParser to render what the run fetched.
Where people get burned. A few traps worth knowing before you rely on it:
force=truedeletes the file first, before checking it exists. If the file isn't there, the node dies with aFileNotFoundError. So force is only for re-pulling a file you already have, not for "make sure it's fresh."- There's no checksum or version check. If the file exists, it's trusted. A partial file left by a killed download counts as "present" and will never be re-fetched unless you force it.
- There's no resume. Interrupt a multi-GB model and next run it'll treat that partial file as done. If that happens, force it.
- Token auth is Hugging Face-only - it only attaches a
Bearerheader when the URL starts withhttps://huggingface.co. Point it at Civitai with a token and it just prints "Token given but domain not supported!" and downloads anonymously anyway.
Installing. Grab the pack in ComfyUI Manager (search "comfyui-downloader") or clone it manually:
cd ComfyUI/custom_nodes
git clone https://github.com/stavsap/comfyui-downloader
Then restart ComfyUI. Dependencies are just requests and tqdm - nothing heavy, and the pack doesn't bundle or download models at install time. It's a small one-person utility (the same author ships comfyui-ollama), so read the source before you trust it with anything sensitive - custom nodes run arbitrary code with your user account, and Manager's convenience is also its attack surface.
The honest verdict: this isn't a Civitai browser or an API wrapper, and it won't manage your downloads. But for "workflow should work on a fresh machine without me babysitting it," it's a genuinely handy little guard.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| url | STRING | — | |
| path | STRING | — | |
| file_name | STRING | — | |
| force | BOOLEAN | false | — |
| summaryopt | DOWNLOAD_SUMMARY | — | |
| tokenopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| summary | DOWNLOAD_SUMMARY | — |