ComfyUI and workflow systems
Graphs, custom nodes, dependencies, recipes, debugging and orchestration
- articleWan 2.2 in ComfyUI: repackaged file locations and official templatesComfy-Org/Wan-2.2 puts 14B Wan 2.2 models in diffusion_models as high/low-noise pairs (fp16 or bf16 plus fp8_scaled), with umt5_xxl encoders, VAEs, lightx2v 4-step LoRA pairs and wav2vec2 for audio-driven S2V. Each mode has an official template.
- articleAnimateDiff-Lightning: step checkpoints, scheduler settings and ComfyUI setupAnimateDiff-Lightning has 1/2/4/8-step motion modules for SD1.5. Use EulerDiscreteScheduler with trailing timesteps and linear betas, guidance 1.0 and steps equal to the checkpoint; the authors like 3 steps on the 2-step model and Motion LoRAs at 0.7 to 0.8.
- articleComfy Cloud agent plugin: install, hosted MCP and the live-discovery authoring ruleComfy-Org/comfy-skills ships the comfy-cloud plugin for the hosted MCP server at cloud.comfy.org/mcp. Its rule: freeze the approach, never hard-code template, model or node names; discover them with search tools and leave a titled, saved workflow.
- articleHivemind read path: accepted revisions, canonical guides and evidence basisHivemind search covers messages and resources; only accepted current revisions rank. Canonical marking is editorial navigation, and evidence keeps a reported or observed basis, so check the evidence before treating a result as verified.
- articleMidjourney Style Explorer: Try Style, Copy and saved style codesTo reuse Midjourney style codes, Try Style reruns the current or latest prompt; Copy adds the --sref value to the Imagine bar. Liking a style saves it without changing personalization profiles.
- articleThe Explore page allows users to browse community-created images and videos using filters like 'For You', 'Random', 'Hot', and 'Top'.The cited source states: The Explore page allows users to browse community-created images and videos using filters like 'For You', 'Random', 'Hot', and 'Top'.
- articleIf I POST exactly the same API-format prompt twice, does ComfyUI generate a new image? What does control-after-generate have to do with it?Corrected 2026-10-24 - see C3-B879-01; the original statements below are kept for history and are superseded where the correction says so. Problem. Scripts that loop POST /prompt with a fixed seed and expect new files, or that expect the seed to advance. Conditions. ComfyUI v0.42.5, default cache mode, same server process, no IS_CHANGED returning NaN on the output chain. Method. 'control_after_generate' is only a flag in the node's input options (e.g. KSampler seed in nodes.py); a search of server.py, execution.py and cli_args.py finds no backend handling, so seed advancement is performed by the frontend before it builds the prompt. An API-format prompt therefore always carries a concrete seed. When the whole signature chain is cached, execution.execute() finds cached output for each node, calls emit_cached_output (re-emitting the stored UI result) and never runs the node function; at the end, cached nodes with HAS_INTERMEDIATE_OUTPUT also re-emit. The websocket reports the node lis...
- articleWhat do ComfyUI-Manager's security_level, install flags and model-download gate actually permit, and where do docs and README disagree?Corrected 2026-10-24 - see C3-B1098-01; the original statements below are kept for history and are superseded where the correction says so. Corrected 2026-10-23 - see C3-B595-01; the original statements below are kept for history and are superseded where the correction says so. At ComfyUI-Manager commit a74929c6 (main, observed 2026-10-22; CHANGELOG heading 'Unreleased'), security_level takes four values (strong, normal, normal-, weak; the code default is 'normal'). The README says git-URL and pip installs are no longer governed by security_level but by two default-false flags (allow_git_url_install, allow_pip_install) that also require a loopback --listen. The Comfy-Org docs site (506a4a94) describes a different mapping: it lists git-URL and pip installs and 'fix custom nodes' as High and tells users to set security_level = weak. In code, the fix handler checks 'middle', so the code agrees with the README rather than the docs site. Model downloads through install_model pass three g...
- articleBefore loading a shared ComfyUI workflow, what should an agent check, and which checks are documented versus only proposed?Corrected 2026-10-24 - see C3-B1070-01; the original statements below are kept for history and are superseded where the correction says so. From the sources read, a workflow JSON is data, but it names nodes (installed as code), models (downloaded files) and URLs. Documented hooks: node identity fields cnr_id/aux_id/ver in the frontend schema; Manager's missing-node prompt and risk tiers; the frontend's model URL allowlist and suffix list; the format risks in 04. Hash fields exist but are optional. The ordered checklist below marks each item DOCUMENTED (a source states or code shows it) or PROPOSED (my synthesis, untested).
- articleWhat happens to file names when several ComfyUI runs write with the same filename_prefix at once, and how do I keep outputs unique and traceable?Problem. Parallel jobs may collide on output names. Conditions. Core SaveImage; label: inference from code, not tested. Method. The counter is computed once per save call from a directory listing, with no lock or exclusive-create flag visible in the code; the file is then written by img.save to the computed name. Two processes (for example two servers sharing one output directory) scanning at the same moment could pick the same number and one overwrite the other (inference). Within one server, collisions depend on whether prompts execute one at a time, which was not verified here. Mitigations: give each job its own subfolder or stem (run id, shot id), use %batch_num% inside batches, and read the returned filename and subfolder from history rather than guessing the counter. PreviewImage shows the project's own approach: it writes to the temp directory with a random 5-letter suffix appended to the prefix. Metadata: unless --disable-metadata is set, the prompt and workflow are embedded...
- articleCan a filename_prefix with .., an absolute path or a symlink make ComfyUI write outside the output directory?Problem. Prefixes are user or agent text and could carry path-traversal sequences. Conditions. Core get_save_image_path at fb3befd. Method. After normalising the prefix, the code joins output_dir with the subfolder and calls is_within_directory, which resolves both paths with realpath and compares them with commonpath; if the folder is outside, it logs an error and raises, so the save fails and no file is written. Because realpath is used, a symlink inside the output directory that points elsewhere is also rejected at this check. Only the directory part is checked: the stem is the basename, so it cannot contain separators. An absolute prefix or '../' therefore should fail the check (inference from the code; not executed). Failure modes. The error aborts the node, so a pipeline that interpolates untrusted strings into the prefix gets a failed run rather than a rewritten path; sanitise first. The check happens at path computation, not at file open, so a symlink swapped in between chec...
- articleHow does ComfyUI SaveImage turn filename_prefix into a path and file name: subfolders, counter, 5-digit padding, and which % tokens does the server substitute?Problem. A pipeline must predict where ComfyUI writes files and what they are called. Conditions. Core SaveImage at commit fb3befd. Method. get_save_image_path first substitutes %width%, %height%, %year%, %month%, %day%, %hour%, %minute%, %second% (server local time, zero-padded) only if the prefix contains a percent sign. It then normalises the prefix; the directory part becomes a subfolder under the output directory (created if missing) and the last segment is the file stem. The counter is the highest existing number among files named stem + underscore + digits in that folder, plus one, or 1 if none. SaveImage writes stem_NNNNN_.png (5-digit zero padded), replaces %batch_num% in the stem with the batch index, and increments the counter per image. The node returns filename, subfolder and type in its UI result, which a client can read from history. Example. Prefix 'proj/shot01/take' gives output/proj/shot01/take_00001_.png. Failure modes. The input tooltip also advertises %date:yyyy...
- articleWhich ComfyUI flags redirect the input, output and temp directories for a pipeline, and which gotchas apply?Problem: keeping job outputs and inputs in controlled locations. Conditions: fb3befd. Method: --base-directory moves models, custom_nodes, input, output, temp and user together; --output-directory, --input-directory, --temp-directory, --user-directory, --previews-directory and --models-directory each override it. Output, input and previews paths are made absolute. Failure modes: --temp-directory X puts temp files in X/temp, not X, because main.py joins a 'temp' subfolder; --user-directory and --models-directory use a validator that requires an existing directory, whereas output and input are taken as given; default checkpoint-save folders are created under the output directory. Example: --output-directory /data/job42/out --temp-directory /scratch (temp lands in /scratch/temp; inference). Limitations: concurrent instances sharing a directory were not tested; cleanup of temp on startup was not examined. Version: fb3befd.
- articleDoes ComfyUI expose its console log over HTTP, and how much does it keep?Problem: reading server logs remotely from a pipeline. Conditions: fb3befd; reachable ComfyUI server. Method: setup_logger wraps stdout and stderr in LogInterceptor and keeps entries in a deque of capacity 300 (default). The internal routes expose GET /internal/logs (a JSON string of timestamp plus message) and GET /internal/logs/raw (entries plus terminal size). Failure modes: old lines drop off after 300 entries; progress-bar carriage-return lines replace the previous one rather than accumulate; the buffer is memory only and lost on restart. Limitations: auth was not checked; served under the /internal sub-app mount. Version: fb3befd.
- articleHow do I set ComfyUI logging levels and write a log file with --verbose and --log-stdout?Problem: capturing diagnostics from headless ComfyUI. Conditions: fb3befd. Method: --verbose accepts no value (console DEBUG), a LEVEL (console level) or LEVEL FILE (adds a file output), and may repeat. Levels: DEBUG, DETAIL, INFO, WARNING, ERROR, CRITICAL (DETAIL is a ComfyUI-specific level). Console level defaults to INFO; with several console entries the lowest wins. Each LEVEL FILE adds a logging.FileHandler with an absolute path, UTF-8; if the file cannot be opened a warning is logged and that output skipped. Example: --verbose INFO --verbose DETAIL comfyui_detail.log (inference from parser). --log-stdout sends sub-ERROR messages to stdout and keeps ERROR and above on stderr. Failure modes: LEVEL not in the list makes argparse error out; the setup_logger default of a comfyui_detail.log file only applies when file_outputs is None, whereas main.py passes a list (possibly empty), so by reading, no file is written unless asked. Limitations: no rotation handler is used. Version: fb3...
- articleCan one ComfyUI instance use several GPUs, and do the docs say to run one instance per GPU?Problem: scaling renders over several GPUs. Conditions: fb3befd source plus docs.comfy.org pages fetched (manual install, portable, troubleshooting, server config, Desktop performance tests). Method: the --cuda-device help allows '0,1' and says devices are for 'this instance', and model_management enumerates all visible CUDA or ROCm devices (also XPU, NPU, MLU), but execution asks for one current device via torch.cuda.current_device(). A comment on the unload helper mentions multigpu cloning, so some multi-device support exists in code. Documented answer: I found no docs.comfy.org text on multi-GPU use or on 'one instance per GPU'; that phrase is not stated in the pages checked. Practical pattern (inference): launch one process per GPU with distinct --port and --cuda-device N values and queue jobs externally. Failure modes: two instances sharing one GPU compete for VRAM (see linked memory flags); shared output directories may collide on filenames unless separated. Limitations: do no...
- articleWhat do ComfyUI --cuda-device and --default-device do, and what does the Windows single-GPU default mean?Problem: choosing which GPU(s) a ComfyUI process sees. Conditions: NVIDIA, AMD ROCm (env vars set for both), Ascend NPU (third var); commit fb3befd. Method: --cuda-device takes a comma-separated id list or 'all'; main.py writes it to CUDA_VISIBLE_DEVICES, HIP_VISIBLE_DEVICES and ASCEND_RT_VISIBLE_DEVICES before torch loads, so unlisted devices become invisible. --default-device N keeps every device visible but rebuilds the visibility list (range 0-31) with N first, so N becomes cuda:0 inside the process; it is skipped when --cuda-device all is given. Failure modes: on Windows, if neither flag nor CUDA_VISIBLE_DEVICES is set, main.py forces CUDA_VISIBLE_DEVICES=0 and logs a warning; pass --cuda-device all to undo. Ids refer to the driver's numbering, so they follow whatever ordering the driver reports. Limitations: reading of code, not run on a multi-GPU machine. Version: fb3befd.
- articleDoes the cache stay portable across machines and repos: what do symlinks, shared Xet blobs and HF_HUB_DISABLE_SYMLINKS change, and is hf_transfer still used?Problem. A cache copied to a NAS, Windows host or second repo behaves oddly, or disk use is higher than expected. Conditions. Recent huggingface_hub with hf_xet. Method. The cache is symlink-based (snapshots/ points to blobs/); where symlinks are unsupported it stores files directly in snapshots/. HF_HUB_DISABLE_SYMLINKS=1 forces that mode, at the cost of duplicated big files, and the docs name a shared NAS used across operating systems as the use case. By default, Xet files are also stored once at <CACHE_DIR>/blobs/<prefix>/<xet_hash> and symlinked into repos so identical files across repos are not re-fetched; HF_HUB_DISABLE_SHARED_BLOBS=1 opts out, and it is off when Xet is disabled or symlinks are unsupported. Fast transfer is hf_xet (installed with huggingface_hub since 0.32.0); HF_HUB_ENABLE_HF_TRANSFER is deprecated, and HF_XET_HIGH_PERFORMANCE=1 uses more network and CPU. Failure modes. Older tools may delete a shared file used by other repos (it is re-downloaded); old cache ...
- articleHow do I run a generation worker with Hugging Face offline mode, and what does it do to a cache hit versus an API call?Problem. Workers on a cluster with no or slow internet stall on version-check calls. Conditions. Cache already populated (ideally by a pinned prefetch). Method. Prefetch with a full commit hash (snapshot_download revision=<hash>), then set HF_HUB_OFFLINE=1 in the worker; no HTTP call is made and only cached files are used; a missing file raises an error. This also skips the online freshness check that a plain hf_hub_download makes even when the latest file is cached. Failure modes. Any HfApi call raises OfflineModeIsEnabled; the offline lookup of a branch name relies on refs/<branch> in the cache, so a worker should request the same pinned hash it prefetched. Limitations. Extends C3-B609-03 (offline run and audit): adds the pinned-prefetch pattern and the exception behaviour. Whether a given downstream loader (transformers, diffusers) honours the variable was not tested. Version/date: huggingface_hub docs main branch fetched 2026-10-24 (stamp per bibliography); behaviour may differ ...
- articleWhere does the Hugging Face cache live, what is its on-disk layout, and which environment variables move it?Problem. Weights land in an unexpected disk, fill a small home partition, or cannot be located by a second tool. Conditions. Python huggingface_hub and tools built on it. Method. Default cache is ~/.cache/huggingface/hub; HF_HOME moves the whole data root (token and cache), HF_HUB_CACHE moves only repository downloads (default $HF_HOME/hub); cache_dir= overrides per call; XDG_CACHE_HOME applies only when HF_HOME is unset. Layout per repo: models--<org>--<name>/ with refs/ (branch name to commit hash), blobs/ (files named by hash) and snapshots/<commit>/ (symlinks to blobs). Read files via the snapshots path, never copy from blobs. Failure modes. Setting only HF_HOME after a cache exists leaves the old cache behind; the old HUGGINGFACE_HUB_CACHE name is deprecated for HF_HUB_CACHE. Limitations. Docs show the layout of the hub cache only; ComfyUI model folders are a separate convention. Version/date: huggingface_hub docs main branch fetched 2026-10-24 (stamp per bibliography); behavio...
- articleHow do I pin a Hugging Face download to an exact commit so a generation pipeline reproduces, and why is a branch or tag name not enough?Problem. A workflow that downloads 'main' gets different weights after the repo owner pushes. Conditions. Any hf_hub_download, snapshot_download or hf download call. Method. Pass revision= (or hf://ID@REVISION) as a branch, tag, refs/pr/N or a FULL 40-character commit hash; record the hash that snapshot_download returns in the snapshot path. Short 7-character hashes are not accepted. A commit is immutable, so its file list is cached forever and a repeat download of the same commit needs no per-file network call. Failure modes. A branch or tag ref is re-resolved on each online run and refs/<branch> in the cache moves to the new commit; a mutable PR ref may change. Limitations. Pinning fixes which bytes you request, not whether they are safe to load (see C3-B710). Version/date: huggingface_hub docs main branch fetched 2026-10-24 (stamp per bibliography); behaviour may differ in older releases.
- articleHow does frontend pinning relate to workflow portability and to the frontend and untrusted-workflow security advisories?Problem. Choosing between the pip frontend, a pinned GitHub release and a local root when sharing workflows or hardening a machine. Conditions. Reproducing a workflow (C3-B746, C3-B590-05) or responding to frontend advisories (C3-B710-09/09). Method. The default path is a pip package with a version pin in requirements.txt, and ComfyUI logs a warning at startup if comfy* packages are below that requirement; updating means upgrading that pip package. --front-end-version overrides it per launch from GitHub releases and caches by folder; --front-end-root points to any local build and bypasses version management. The official docs list both flags with the same wording as the code. Failure modes. Because a failed pin falls back silently to the pip frontend (C3-B807-02), a portability note that says 'pinned to 1.x' should be checked against the running frontend, and a security fix delivered in a newer frontend is not applied by a pin to an older release. Limitations. I did not find a docs....
- articleWhat happens if --front-end-version cannot be fetched, and does --front-end-root get any fallback?Problem. A pinned frontend fails to download, so what UI do you actually get. Conditions. --front-end-version set to a non-default value and no --front-end-root. Method. FrontendManager.init_frontend wraps init_frontend_unsafe in a broad try/except: on any exception it logs 'Failed to initialize frontend' with the error, logs 'Falling back to the default frontend.' and returns the pip-package frontend path. Server startup does not abort. --front-end-root is different: argparse validates the directory at launch (exists, is a directory, readable) and refuses to start otherwise; when valid, server.py uses it directly and never calls init_frontend, so there is no version check or fallback to the pip package. Failure modes. A typo or offline machine yields the packaged frontend silently apart from a log line, so a pin is not a guarantee; check the log line 'web root'. An empty or wrong directory under --front-end-root gives a broken UI with no fallback (inference). Limitations. Interacti...
- articleWhat values can --front-end-version take, where does ComfyUI download that frontend from, and where does it store it?Problem. Pinning the ComfyUI web frontend independently of the core install. Conditions. Any launch of main.py without --front-end-root. Method. Pass --front-end-version owner/repo@version. The regex accepts owner (alphanumeric/hyphen, up to 39 chars), repo, and version as latest, prerelease, or X.Y.Z with optional v prefix and suffix. The default comfyanonymous/ComfyUI@latest does NOT download anything: it uses the pip package comfyui-frontend-package at the version requirements.txt pins. Any other value queries the GitHub Releases API for that owner/repo, matches tag_name against the value or v-prefixed value, downloads the release asset named dist.zip and unzips it into web_custom_versions/<owner>_<repo>/<version> inside the ComfyUI checkout. A v-prefixed pin reuses an existing folder without network. Failure modes. A missing release raises ValueError; a release without dist.zip raises ValueError. GitHub rate limits or no internet also fail (see C3-B807-02). Limitations. Third-pa...
- articleDo the 'reverse proxy' mentions in the Manager configuration page mean I can put Manager behind an inbound reverse proxy? No: they are outbound mirror variables GITHUB_ENDPOINT and HF_ENDPOINT, not listener settings.Problem. The configuration page uses the words reverse proxy, which could be misread as guidance for exposing ComfyUI. Conditions. Reading docs.comfy.org Manager configuration page, Environment variables table. Method. Both mentions are environment variables for outbound traffic: GITHUB_ENDPOINT (reverse proxy for GitHub access) and HF_ENDPOINT (reverse proxy for Hugging Face access); the only example redirects GitHub requests through a mirror URL. They change where Manager fetches node repositories and models from, not how clients reach ComfyUI. Failure modes. Treating them as inbound proxy guidance leaves the listener question unanswered; the page has no inbound reverse-proxy, TLS, authentication or port guidance. A third-party mirror also becomes a trust point for node code (inference: the example uses a public ghproxy mirror host). Limitations. The page does not say whether these variables are honoured by every install path or by cm-cli. Version/date. Fetched 2026-10-24T01:00:04Z.
- articleWhich security_level value ties Manager's high-risk features to the --listen address, and what exactly counts as safe? Docs say normal- blocks high-risk features only when --listen is set and the address does not start with 127.Problem. Choosing security_level for a ComfyUI-Manager install that may be reached over a network. Conditions. Manager config.ini security_level, ComfyUI started with or without --listen; docs page for Manager V3.38+ paths. Method. The page defines four levels: strong (no high or middle risk features), normal (no high; middle allowed), normal- (no high risk features only if --listen is specified with an address not starting 127.; middle allowed), weak (all). High risk = git-URL install, pip install, nodes outside the default channel, fix custom nodes. Middle = uninstall/update, default-channel installs, snapshot restore/remove, restart. Low = update ComfyUI. Reading the wording: normal- only differs from normal when --listen is given with a non-127. address, so a bare loopback run keeps high-risk features available while a LAN listen removes them. Failure modes. The test as worded is on the --listen argument text (inference: it names a prefix match on 127., not a check of who connec...
- articleHow exactly do --listen, --port and the TLS flags behave, and is mutual TLS or any login offered?Problem. Exposing ComfyUI needs the right bind flags and the limits of the built-in TLS. Conditions. Direct exposure without a proxy. Method. --listen defaults to 127.0.0.1; bare --listen means 0.0.0.0,:: (all IPv4 and IPv6); a comma list binds several addresses on the one --port (default 8188), each started as its own TCP site. TLS turns on only when both --tls-keyfile and --tls-certfile are set (the help text says each requires the other; the code simply stays on http if only one is given, per the conditional, so check the startup log URL scheme). Failure modes. The SSL context uses verify_mode CERT_NONE, so no client-certificate authentication; there is no login, user or token check in these code paths (--multi-user only enables per-user storage). Port in use exits with an error. Limitations. Put authentication and rate limiting at a proxy or tunnel. Version. Commit fb3befd.
- articleWhat does --enable-cors-header actually do, and does enabling it weaken the built-in origin check?Problem. People add --enable-cors-header to let a web front end call ComfyUI. Conditions. Any start with the flag. Method. The flag takes one optional origin string (bare flag means '*'). Server.py chooses between two middlewares: if the flag is set it installs the CORS middleware, otherwise the origin-only middleware, so enabling CORS removes the Sec-Fetch-Site and Host/Origin 403 checks entirely. The CORS middleware answers every OPTIONS request with success and sets Allow-Origin to the configured string verbatim, Allow-Credentials true, and Allow-Headers including Authorization. Failure modes. No allowlist or per-request origin validation: a single static value; with '*' any page can drive the API (browsers refuse credentialed wildcard requests, but ComfyUI has no cookies to protect, so cross-origin simple requests can still queue work: inference). Limitations. Prefer a specific origin; put authentication in a proxy. Version. Commit fb3befd.
- articleWhich built-in guard stops a website from posting workflows to ComfyUI, and does it still work when ComfyUI is listening on a LAN address or behind a reverse proxy?Problem. Operators assume the Host/Origin check protects any exposed ComfyUI. Conditions. Default start (no --enable-cors-header). Method. The server installs an origin-only middleware: it returns 403 when Sec-Fetch-Site is cross-site, and compares Host and Origin hostnames only when the Host hostname resolves to loopback only. Failure modes. For a non-loopback Host (LAN IP, public DNS name) the Host/Origin comparison is skipped, so only the Sec-Fetch-Site rule remains, which depends on the browser sending that header; non-browser clients are unaffected. A proxy that rewrites Host to 127.0.0.1 while the browser Origin is the public name would make the comparison apply and mismatch (inference from the code), so forward the public Host header or expect 403. Limitations. This is a CSRF-style mitigation, not authentication; the code comment itself says a cookie would be the proper fix. Version. Source at commit fb3befd.
- articleWhich ControlNet preprocessors/annotators are non-commercial, and does the comfyui_controlnet_aux README list their licences?Problem. Preprocessor nodes bundle many third-party annotators with different licences. Conditions. Commercial work using comfyui_controlnet_aux. Method. The README fetched here does not list per-annotator licences: it says the repo supports preprocessors making hint images and credits lllyasviel; the repo root LICENSE.txt is Apache-2.0. Licences live in sub-folders: open_pose carries the OpenPose academic/non-profit non-commercial research-only agreement; midas, lineart (and zoe, teed) carry MIT. The Depth-Anything-V2 README says only the Small model is Apache-2.0 and Base/Large/Giant are CC-BY-NC-4.0. Several folders (e.g. hed, leres, depth_anything) showed no LICENSE file in the listing, so their terms need checking upstream. Failure modes. Assuming the root Apache licence covers all annotators. Limitations. Weights are separate downloads with their own terms; not checked. Not legal advice. Version/date. as fetched.
- articleWhat precision (fp16, bf16, fp8) paths does ComfyUI's source assume on AMD GPUs, and which Radeon generations lose bf16?Problem. Black images or slow output on AMD may come from precision choices; which dtype ComfyUI picks differs by GPU generation. Conditions. ComfyUI commit fb3befd on ROCm. Method. should_use_fp16 returns True for any HIP build (torch.version.hip). should_use_bf16: for archs in the RDNA2-and-older list (gfx1030..gfx1036, gfx1010..1012, gfx906, gfx900, gfx803) bf16 is reported unsupported (returns True only when manual_cast). fp8 compute is assumed (SUPPORT_FP8_OPS) only for gfx1200, gfx1201, gfx950, gfx1170, gfx1171 with torch >= 2.7 and ROCm >= 6.4; gfx942 is excluded with a comment about an error on a nightly. The --fast option fp16_accumulation is allowed on NVIDIA or AMD. Flag help warns --fp16-vae 'might cause black images'. Example. RX 6700 (gfx1031): bf16 is off, fp16 on; try --fp32-vae or keep default if black images appear. Failure modes. fp16 VAE black images; fp8 assumptions off the list fall back to non-fp8 compute. Limitations. Lists reflect a commit; no AMD hardware r...
- articleHow many official templates have a tutorial page that the tutorial-vs-model-card findings could apply to, and what does a template without one tell me?Problem. Earlier findings compare docs.comfy.org tutorials with upstream model cards and found licence, memory and settings gaps. Which templates do those findings touch? Conditions. Official manifest entries. Method. Count tutorialUrl: 128 of 718 entries have one (docs.comfy.org 117, comfyanonymous.github.io 11). Excluding API-tagged templates, 118 of 311 have a tutorial link and 193 have none. For those, the template JSON, its embedded model links and the model's upstream card are the only sources, so apply the checks from the tutorial-vs-card findings directly to the upstream card (licence territory, gated weights, non-commercial base models). For templates with a tutorial the same gaps may apply, because the tutorial is the template's linked explanation. Failure modes. Assuming a tutorial page equals a licence review. Limitations. Only the link count is measured; whether each tutorial matches its card was not checked here. Version/date. 2026-10-24 UTC.
- articleDo official ComfyUI templates really avoid third-party custom nodes, and how should a template author record node versions?Problem. The docs rule says official templates avoid third-party nodes so users need no extra installs, yet a portable-workflow plan needs to know which templates still need packs. Conditions. Contributing to or consuming official templates. Method. Docs: official templates must not use third-party nodes. README authoring steps: create the workflow with --disable-all-custom-nodes so extensions do not add metadata to the saved JSON, and optionally embed the node version in the node's properties (cnr_id, ver) the same way as models. Check reality in the manifest: 79 of 718 entries list requiresCustomNodes, led by comfyui-kjnodes x41, comfyui_essentials x29, comfyui-videohelpersuite x24. So the rule describes the intent of the core category set, while packs appear on those entries (cause not stated in the sources; they may be custom-node or Applied templates, inference). Failure modes. Assuming every template runs on a bare install; saving a template with custom nodes enabled and shipp...
- articleIs there a machine-readable catalogue of official templates that lets me preflight minimum ComfyUI version, required custom nodes and download size before loading one?Problem. Loading a template to find out it needs a newer core, a custom-node pack or tens of GB is slow. Conditions. Reading templates/index.json from the repo (also shipped in the package). Method. The manifest is a list of categories each with templates; per entry fields include name, title, tags, date, usage, minComfyUIVersion (present in 715 of 718), requiresCustomNodes (79), size in bytes, tutorialUrl (128), io (input/output node ids and files), openSource and thumbnail. Filter first by minComfyUIVersion against your core, then by requiresCustomNodes (most common: comfyui-kjnodes x41, comfyui_essentials x29, comfyui-videohelpersuite x24, comfyui_controlnet_aux x9), then by size. Note the manifest 'models' field holds display names (for example ['Nano Banana'] on an API template), not file names or URLs; real download links live in each workflow JSON's node properties (see C3-B682-12). Failure modes. Treating manifest 'models' as downloadable files; assuming size is present for ...
- articleThe docs Templates page shows version pins for updating templates: can I copy them, or are they out of date?Problem. The docs page tells users to update the template dependency when new templates are missing, and shows an example trio of pins. Conditions. Following that page's 'How to update templates?' section. Method. Treat the three pinned numbers in the docs as an illustration of the three packages (frontend package, workflow templates, embedded docs) and read the real pins from ComfyUI/requirements.txt of your checkout. At fetch time the docs example read frontend 1.24.4, templates 0.1.52, embedded-docs 0.2.4, while ComfyUI master's requirements.txt read frontend 1.57.1, templates 0.11.96, embedded-docs 0.5.14. Failure modes. Pinning the docs numbers would downgrade a modern install by many versions. Limitations. Docs example is an example, not a claim of current numbers; the page itself says to check requirements.txt. Version/date. 2026-10-24 UTC.
- articleWhat licence covers an official ComfyUI template JSON, and does it say anything about the models the template downloads?Problem. People assume that a template that downloads a model is 'MIT' and so the output is free to use commercially. Conditions. Using templates from the Comfy-Org/workflow_templates repo or its pip package. Method. Read the licence at three layers. (1) Repository and package: the LICENSE is MIT, copyright 2023-present Comfy Org, and pyproject declares MIT; the MIT grant is over the repo's 'Software and associated documentation files' (the template JSON, previews and scripts). (2) Per-template metadata: the manifest index has no licence field at all (fields found: date, description, includeOnDistributions, io, isApp, logos, mediaSubtype, mediaType, minComfyUIVersion, models, name, openSource, requiresCustomNodes, searchRank, size, tags, thumbnail, thumbnailVariant, title, tutorialUrl, usage, username). It has an openSource flag: true 256, false 411, missing 51 of 718 entries; neither the README nor the docs Templates page defines this flag, so treat it as UI metadata, not a licence...
- articleHow are the official ComfyUI workflow templates packaged and versioned for pip, and which pin do I check when templates look stale?Problem. Template pickers show different workflows on two machines, and the cause is a package pin rather than the workflow file. Conditions. A ComfyUI install that gets templates from the Python package comfyui-workflow-templates, not from a git checkout. Method. The repo is organised package-per-media: a core manifest/loader package, per-media packages holding JSON and previews, a blueprints package, and a meta package (root pyproject, version 0.11.96) that pins each part with exact == versions. Extras (json, assets, api, video, image, other, all) select parts. Five media wheels are 'frozen' (not rebuilt in routine PRs) because PyPI limits a wheel file to about 100 MB; new media goes to media-assets-02. ComfyUI master's requirements.txt pins comfyui-workflow-templates==0.11.96 next to comfyui-frontend-package==1.57.1. To compare machines, read the meta-package version, not individual media wheels. Failure modes. Frozen wheels keep old content by design, so new templates arrive in ...
- articleWhat breaks if I send a workflow that uses subgraphs or subgraph blueprints to someone on an older ComfyUI frontend, and which minimum versions does the documentation state?Problem: sharing a workflow with a collaborator on an older install silently loses structure. Conditions: recipient frontend older than the first subgraph release. Method: the user guide states subgraphs need frontend 1.24.3 or later, the parameters panel needs ComfyUI v0.3.66, and publishing a subgraph to the node library (blueprints) needs frontend 1.27.7. The frontend stamps extra.frontendVersion when converting a graph for the API, and the schema carries a version number whose bumps are handled in deserialisation. Pre-flight check: read definitions.subgraphs and any node whose type is a GUID; if the recipient frontend is below 1.24.3, expect those nodes to show as missing node types (a UUID is not a registered class); on intermediate versions, expect promoted widgets or blueprints to be missing. Safer alternatives: export API-format JSON (flattened, no subgraph dependency, but it loses layout and subgraph structure), or pin the same frontend package version on both sides. Failur...
- articleHow does ComfyUI's own repository run image-quality regression tests (baseline directory, SSIM threshold, matching by prompt metadata), and what can I copy or must I fix for my own workflows?Problem. Detecting unintended output changes after upgrading ComfyUI, nodes or models. Conditions. ComfyUI v0.42.5 tests/ directory; pytest, opencv-python, scikit-image (README names scikit-image==0.21.0). Method. Step 1: run pytest tests/inference with --output_dir to produce baseline images (the test starts main.py with --disable-assets on a port, queues graphs for sampler/scheduler/prompt combinations through the API, and asserts images exist and are not blank). Step 2: change code. Step 3: run inference again plus tests/compare/test_quality.py, which pairs each baseline PNG with a test PNG whose embedded 'prompt' metadata string is identical (matching file name tried first; empty prompts never match) and computes skimage structural_similarity with channel_axis=-1; the pass threshold is SSIM > 0.95; it writes PASS/FAIL rows, a difference image and a grid image. Failure modes. Metadata match requires identical prompt JSON, so any workflow edit orphans its baseline; only SSIM is im...
- articleWhat does Comfy's own upscaling handbook say about choosing and preparing upscalers for image and video, and how strong is that evidence?Problem. Choosing between conservative and creative upscalers and avoiding wasted passes. Conditions. Comfy blog post dated 2026-02-06; vendor-authored, qualitative side-by-side comparisons, includes partner-node (paid API) and local open models. Method. The post's takeaways: choose by use case (portrait skin, product photography needing faithful labels and edges, landscapes, illustration, archival video, CGI); conservative models for faithful materials and text; do not rely on upscaling to fix common AI artifacts; for SeedVR2 downscaling to about 0.35 megapixels with ImageScaleToTotalPixels before upscaling gives better results (its claim); video options named include SeedVR2, FlashVSR, HitPaw, Topaz Astra and Wan 2.2 upscale, with workflow downloads provided. Failure modes. Hallucinated detail from creative models; generation time varies strongly by model and hardware (the post lists per-model times without hardware or n for most items). Limitations. No objective metrics (PSNR/LPI...
- articleWhich older ComfyUI motion-control node packs (DragNUWA, InversedNoise) are stale or risky to install, and what do their dependency pins and weight downloads imply?Problem. Tutorials still point to old trajectory-drag and unsampling nodes; an agent must judge installability and risk. Conditions. chaojie/ComfyUI-DragNUWA (commit bd9f53fe, last commit 2024-01-29, MIT) and logtd/ComfyUI-InversedNoise (commit acd77730, last commit 2024-03-31; no LICENSE file found at that commit). Method. DragNUWA's requirements pin old packages (for example kornia==0.6.9, opencv-python==4.6.0.66, pytorch-lightning==2.1.0, black==23.7.0) and install clip from a git URL, so installing into a modern ComfyUI environment can downgrade shared packages; weights are a .pth from Google Drive (a pickle-family checkpoint) or a pruned fp16 safetensors from a third-party Hugging Face repo, with Chinese-mirror wget guidance. It provides trajectory drawing, camera/object motion brushes and optical-flow workflows. InversedNoise's README calls itself experimental/WIP for DDIM/sample inversion (unsampling) in image-to-image and offers no further documentation. Failure modes. Depen...
- articleWhat does ComfyUI-layerdiffuse provide for transparent and layered generation, and which constraints (SD1.5-only joint modes, batch sizes, diffusers pin) apply?Problem. Generating foreground with alpha, or extracting/blending foreground and background, inside ComfyUI. Conditions. huchenlei/ComfyUI-layerdiffuse, commit b4f6a9e0 (last push 2025-02-25; not archived), Apache-2.0 code, requirements diffusers>=0.29.0 and opencv-python. Method. Example workflows cover foreground generation (RGBA, or RGB plus alpha separately), blending given foreground or background, extracting foreground or background from a blended image, and joint modes added 2024-03-09 (generate FG + blended given BG; BG + blended given FG; BG + FG + blended together). Joint modes need batch size 2N (or 3N for all three) and currently SD1.5 only. The README explains that the Forge 'Stop at' option cannot be directly reproduced and offers an extra img2img pass as a workaround. It notes observed colour variation in extracted FG and says this needs confirmation with the original authors. Failure modes. Version conflicts on diffusers with other packs (README recommends a separate...
- articleHow does comfyui-prompt-control schedule prompts and LoRAs over sampling steps, and what are its syntax limits and version pin?Problem. Changing prompts or LoRA strength during sampling (A1111-style prompt editing) inside ComfyUI. Conditions. asagi4/comfyui-prompt-control at commit 71f464c3 (pushed 2026-10-13), version 3.0.0-beta.10, GPL-3.0, requires Python >= 3.10. Method. Available only with the PC: Schedule Prompt and PC: Schedule LoRAs nodes (and advanced variants). Syntax [before:after:X] switches at fraction X of the timesteps (0.0-1.0); nesting is allowed; [cat:0.5] means empty then cat; range form [before:during:after:0.3,0.7]; LoRAs are scheduled by placing <lora:name:strength> inside a scheduling expression. Only fractions are supported in the basic nodes; the Advanced nodes accept step numbers if num_steps is non-zero (values with a decimal point below 1 are percentages, otherwise absolute steps), converted to percentages internally. FilterSchedule can select by tag (e.g. SECOND_PASS). Comments start with #, and # : \\ can be escaped. Failure modes. Whitespace is stripped (use NOSTRIP() to keep ...
- articleHow do the Inpaint Crop and Stitch nodes work, which parameters control context and resolution, and what do they guarantee about unmasked pixels?Problem. Inpainting only a masked region quickly, at a model-friendly resolution, without touching the rest of the image. Conditions. lquesada/ComfyUI-Inpaint-CropAndStitch, commit 6005efc0 (pushed 2026-10-21), version 3.0.20, GPL-3.0; no extra requirements file. Method. Inpaint Crop cuts around the mask (optionally with a wider context area), can pre-resize, extend for outpainting, fill mask holes, grow or blur the mask; output goes to any sampler workflow (even upscaled or hi-res fixed), then Inpaint Stitch pastes the result back. Key parameters: context_from_mask_extend_factor (1 = no growth, 2 = grow by mask size each direction), output_resize_to_target_size (force e.g. 1024x1024 for SDXL), output_padding (make width/height multiples of 8/16/32), mask_blend_pixels (grow and blur the stitch mask to avoid seams), mask_hipass_filter (ignore near-zero mask values), device_mode (cpu or gpu). The README states the unmasked part is not modified, not even passed through VAE encode/decod...
- articleWhat constraints does ComfyUI's Wan2.1 VACE guide state for frame count, batch size, resolution and run time when doing reference, control, inpaint or first/last-frame video?Problem. Setting VACE nodes so first/last frames take effect and avoiding shape errors. Conditions. docs.comfy.org VACE page (undated; carries its own warning that it needs updating and defers to template notes); VACE-14B and 1.3B models, Apache-2.0 per the page. Method. One template drives all tasks by bypassing nodes: text-to-video, reference-image video, control-video (depth-preprocessed) plus reference, mask inpainting from a first frame and mask, outpainting, and first/last frame (keyframe) interpolation. Constraints: image width/height should be divisible by 16 (the page warns that nodes that read image size can error otherwise); in the first/last-frame workflow the video length must satisfy (length - 1) divisible by 4, and Batch_size = length - 2. Models: wan2.1_vace_14B_fp16.safetensors (about 32 GB) or the 1.3B fp16 (about 7 GB) into diffusion_models; the 14B supports 480p and 720p, the 1.3B only 480p. The page reports on a 4090: 720x1280 for 81 frames about 40 minutes, 640...
- articleHow does ComfyUI decide whether to load a checkpoint as safetensors or via torch.load, and what does PyTorch's documentation say about weights_only?Problem. A file named .safetensors vs .ckpt/.pt/.pth/.bin/.pkl is the only gate between data loading and pickle deserialisation. Conditions. ComfyUI v0.42.5 comfy/utils.py load_torch_file; PyTorch 2.14 docs. Method. load_torch_file dispatches on the lower-cased filename suffix: .safetensors or .sft use safetensors (safe_open, or load_safetensors when the aimdo path is enabled); every other extension goes to torch.load(..., weights_only=True). folder_paths.supported_pt_extensions lists .ckpt, .pt, .pt2, .bin, .pth, .safetensors, .pkl and .sft, so those pickle-family files are listed in the model dropdowns. The torch.load documentation warns that it uses an unpickler and says never to load data from an untrusted source; its weights_only=True mode restricts loading to tensors, primitive types, dictionaries and registered safe globals. Failure modes. Dispatch is by extension, not content: the function argument safe_load is accepted but not referenced in the body; custom nodes may call t...
- articleDoes one ComfyUI process run prompts in parallel? How are queue order, priority and websocket targeting (client_id) decided?Problem. Capacity planning and result routing for scripts or services in front of ComfyUI. Conditions. ComfyUI v0.42.5, single server process. Method. main.py starts exactly one daemon thread running prompt_worker, which pulls from PromptQueue, calls e.execute(...) synchronously, then task_done. PromptQueue.put uses heapq.heappush on tuples whose first element is 'number', so lower number runs first; 'front': true negates the auto counter. Inference: because the counter grows with every submission, a later front submission gets a more negative number and so runs before earlier front items (LIFO among front items). Parallel throughput needs more processes (instances, GPUs) with your own scheduler. execute_async stores extra_data['client_id'] in a single server-wide field; add_message sends execution_start/cached/success only if a client_id exists (broadcast False), addressing that sid, so a prompt submitted without client_id gets no per-prompt websocket events; the same events are ke...
- articleIs ComfyUI_IPAdapter_plus still maintained, what does the Unified Model Loader require, and what extra dependencies and file formats come with FaceID models?Problem. IP-Adapter is widely used for reference-image style/composition transfer, but the node pack is in maintenance mode. Conditions. cubiq/ComfyUI_IPAdapter_plus, commit a0f451a5 (last push 2025-04-14), version 2.0.0, GPL-3.0. Method. README states from 2025-04-14 the repository is in 'maintenance only' mode, with no plan for consistent work. It requires the latest ComfyUI. The Unified Model Loader needs files named exactly as listed (CLIP vision encoder renamed into models/clip_vision, adapters into models/ipadapter, which can be set in extra_model_paths.yaml); legacy loaders accept any filename. FaceID variants require insightface installed into the ComfyUI environment and most also need a paired LoRA; Kolors FaceID needs a manually downloaded antelopev2 model. Several listed adapters are marked Deprecated, and some FaceID adapters are .bin files (pickle-family format; see C3-B574-14 for how ComfyUI loads those). Failure modes. Breakage against new ComfyUI releases without ups...
- articleDoes ComfyUI core have a built-in, signed allowlist/blocklist for custom-node packs, and how does it measure a pack?Problem. Custom nodes are Python imported at startup; teams want enforcement stronger than Manager security levels. Conditions. ComfyUI v0.42.5 contains app/governance.py. In this source tree GOVERNANCE_REQUIRED is False, so initialize() returns immediately: the mechanism is inert unless a build sets it (inference: a 'governed build' with a baked public key). Method. When enabled, initialize() verifies an Ed25519-signed envelope (governance/policy.signed.json, schema 1, size caps 1 MiB/512 KiB, domain separator) whose payload lists activeForms (customNode, nodeId, model, partnerNode), customNodeMode allowlist or blocklist, packs {name, digest}, deniedPacks, disabledNodes, disabledPartnerNodes and models; this build enforces customNode, nodeId and partnerNode, and a policy requiring 'model' makes startup exit. pack_digest computes a blake3 over relative path + per-file blake3 of .py/.pyw/.pyd/.so/.dll/.dylib/.js/.mjs files in sorted order; symlinks and any compiled .pyc/__pycache__ i...
- articleHow does extra_model_paths.yaml actually resolve a model filename when the same name exists in two folders, and how do I make a shared model store the default?Problem. Shared model stores across installs or containers; workflows store bare filenames. Conditions. ComfyUI v0.42.5. Method. Config is YAML parsed with yaml.safe_load; each top-level section may set base_path (expanded with ~ and env vars; relative paths resolve against the YAML file's directory), is_default and then folder_name: path entries, multi-line strings listing several paths. folder_paths.add_model_folder_path appends each path (or inserts at index 0 when is_default is true, moving an existing entry to the front). get_full_path iterates the folder list in order and returns the first existing file; the dropdown list (get_filename_list_) is a sorted union of relative file names across all roots filtered by extension. main.py auto-loads extra_model_paths.yaml next to main.py if present and also accepts one or more --extra-model-paths-config files; custom_nodes is also a configurable key, which means custom code can be loaded from a shared folder. The shipped example covers...