ComfyFS is the missing model download and manager for ComfyUI. It automatically discovers your ComfyUI server and:
- helps you find workflows you can run now
- see which model files are missing
- download missing files into the right ComfyUI folders
- and browse, inspect, and delete the model files already on disk.
If you're a ComfyUI user, you see this everyday. The problem is, when you click "Download", it downloads the model like a regular file and you have to manually move the files into relevant paths.
THIS is where ComfyFS comes in. It is the missing "missing models" manager for ComfyUI.
1 Click is all you need. ComfyFS automatically downloads all the required model files to correct folders. No more manual management.
Just 1-click launch on https://pinokio.co
If you want to manually install and launch,
git clone https://github.com/cocktailpeanut/comfyfs
cd app
npm install
npm start
- Start ComfyUI on the same machine.
- Install and start ComfyFS.
- Open the ComfyFS Web UI.
- Leave the ComfyUI URL as
http://127.0.0.1:8188, or enter your local ComfyUI URL and click "Connect"
ComfyFS only connects to local loopback ComfyUI URLs. It writes files into local model folders, so remote ComfyUI servers are intentionally blocked.
The top bar works like a compact browser toolbar.
- Catalog, Files, and Bookmarks switch between the main views.
- The refresh icon reloads the current view. In Catalog and Files it rescans ComfyUI state. In Bookmarks it reloads saved bookmarks.
- The URL field chooses which local ComfyUI server to inspect.
- Connect loads templates and model folders from that ComfyUI server.
- The theme buttons switch light and dark mode.
Catalog is where you browse ComfyUI workflow templates.
- Use the search box for models, workflow names, categories, or keywords such as
Flux,Qwen,video, orLoRA. - Use the status filters to narrow the list:
- Missing means the workflow needs local model files you do not have yet.
- Ready means ComfyFS found the required local model files.
- API means the workflow does not expose a normal local-model download path.
- Unknown means the template does not declare enough local model metadata.
- Use the left sidebar to browse template categories.
- Select a card to open the detail panel.
- From the detail panel you can open the workflow in ComfyUI inside the current Pinokio frame, use the external-link icon to open it in your browser, bookmark it, install individual missing files, download all missing files, or remove installed files when needed.
The most common workflow is: filter to Missing, pick a template, review the required files, then download only the files needed for that workflow.
Files is the local model inventory.
- The left sidebar lists every ComfyUI model root, such as
checkpoints,diffusion_models,loras, andvae. - The summary row shows total storage, file count, roots, referenced files, unused files, and missing references.
- Search filters the visible file list.
- The status filters help separate files that are referenced by templates from files that appear unused or only partially referenced.
- Select a file or folder to inspect its path, size, modified date, root, and template references.
- Use Reveal file to open the file in your system file browser.
- Use checkboxes for bulk actions. Folders are not deleted.
This view is useful when your model directory has grown large and you need to understand what is actually being used by templates.
Bookmarks is a focused list of workflows you want to return to.
- Bookmark a workflow from the Catalog detail panel.
- Open Bookmarks to see only saved workflows.
- Select a bookmarked workflow to open it in ComfyUI or review its files.
- Remove a bookmark when it is no longer useful.
Bookmarks are stored in app/data/bookmarks.json, so they survive browser storage resets and normal Pinokio dependency reinstalls.
- Open Catalog.
- Search for the model or workflow type you want.
- Filter by Missing if you want templates that need downloads, or Ready if you want something runnable now.
- Select a template.
- Install individual missing files or download all missing files from the detail panel.
- Click Open in ComfyUI to open it inside the current Pinokio frame, or use the external-link icon beside it to open ComfyUI in your browser.
- Open Files.
- Check Total storage and the largest model roots in the left sidebar.
- Select a root such as
diffusion_modelsorcheckpoints. - Scan the Size column and inspect large files in the detail panel.
- Reveal files before deleting anything.
- Open Catalog.
- Select a workflow you use often.
- Bookmark it from the detail panel.
- Use Bookmarks as your short list.
- ComfyFS only accepts local ComfyUI URLs.
- Downloads go into the model folders reported by ComfyUI.
- File delete actions remove files from disk. Review the path before deleting.
- Folder rows can be opened or selected for bulk file actions, but folders themselves are not deleted.
- If ComfyUI changes, use the refresh icon to rescan the current view.
Most users only need the UI. The local API is available for small scripts and automation.
const app = "http://127.0.0.1:42188"
const comfy = "http://127.0.0.1:8188"
const catalog = await fetch(`${app}/api/templates?baseUrl=${encodeURIComponent(comfy)}`).then((r) => r.json())
const files = await fetch(`${app}/api/files?baseUrl=${encodeURIComponent(comfy)}`).then((r) => r.json())
const bookmarks = await fetch(`${app}/api/bookmarks`).then((r) => r.json())
const missing = catalog.templates.find((template) => template.status === "missing")
const models = missing.models.filter((model) => !model.installed && model.downloadable)
await fetch(`${app}/api/download`, {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ baseUrl: comfy, models })
})import requests
app = "http://127.0.0.1:42188"
comfy = "http://127.0.0.1:8188"
catalog = requests.get(f"{app}/api/templates", params={"baseUrl": comfy}).json()
files = requests.get(f"{app}/api/files", params={"baseUrl": comfy}).json()
bookmarks = requests.get(f"{app}/api/bookmarks").json()
missing = next(template for template in catalog["templates"] if template["status"] == "missing")
models = [model for model in missing["models"] if not model["installed"] and model["downloadable"]]
requests.post(f"{app}/api/download", json={"baseUrl": comfy, "models": models})curl "http://127.0.0.1:42188/api/templates?baseUrl=http%3A%2F%2F127.0.0.1%3A8188"
curl "http://127.0.0.1:42188/api/files?baseUrl=http%3A%2F%2F127.0.0.1%3A8188"
curl "http://127.0.0.1:42188/api/bookmarks"
curl -X POST "http://127.0.0.1:42188/api/download" \
-H "content-type: application/json" \
-d '{"baseUrl":"http://127.0.0.1:8188","models":[{"name":"model.safetensors","directory":"checkpoints","url":"https://huggingface.co/example/repo/resolve/main/model.safetensors"}]}'




