The desktop app for ComfyUI
444
stars
851
commits
TypeScript
primary language
Sep 10, 2026
updated
Comfy Desktop is the official desktop application for ComfyUI, the node-based engine for generative AI. It installs ComfyUI into a self-contained, GPU-ready environment, lets you run multiple independent setups side by side, and keeps them updated — so you spend your time building workflows instead of fighting Python, CUDA, and pip.
pygit2 bootstrap so clones work on a clean machine.dl.todesktop.com/241130tqe9q3y — one link, auto-detects your platform.
New to ComfyUI? Just download, install, and open the app — it walks you through creating your first setup. No terminal required.
Requirements: Windows, macOS (Apple Silicon), or Linux. A dedicated GPU (NVIDIA / AMD) or Apple Silicon is recommended for good performance, but not required.
Windows — run the NSIS installer (.exe) and launch from the Start Menu or desktop shortcut.
macOS — open the .dmg, drag Comfy Desktop to Applications, and launch from there.
Linux — .deb (Debian/Ubuntu), from the directory you downloaded it to:
sudo apt install ./*.deb
AppImage:
chmod +x ./*.AppImage
./*.AppImage --no-sandbox
Then launch from your application menu.
From there you can add more installs, take snapshots before risky changes, and update ComfyUI or its custom nodes per install.
Contributions are welcome. The app is an Electron + Vue 3 + TypeScript project built with electron-vite.
nvm install 22 && nvm use 22 # recommended — https://github.com/nvm-sh/nvm
corepack enable # enables pnpm (bundled with Node)
git clone https://github.com/Comfy-Org/Comfy-Desktop.git
cd Comfy-Desktop
pnpm run init
pnpm run init is the one-shot for a fresh clone: it runs pnpm install (with the postinstall + husky hooks) and pnpm run bootstrap to build the bundled bootstrap Python (see below).
pnpm run dev # Windows / macOS
./linux-dev.sh # Linux
On Windows/macOS, set up a fresh clone and start the app in one command with pnpm run init:dev.
| Command | Description |
|---|---|
pnpm run init:dev | Install dependencies, build bootstrap Python, then run pnpm run dev |
pnpm run dev | Start the app in dev mode |
pnpm test | Unit tests (Vitest) |
pnpm run test:integration | Integration suite |
pnpm run test:e2e | End-to-end tests (Playwright) |
pnpm run test:e2e:lifecycle | Lifecycle Playwright project (real installs/downloads; see e2e/README.md) |
pnpm run typecheck | Type-check (node + web + e2e + integration) |
pnpm run lint / lint:fix | Lint (ESLint) |
pnpm run format | Format (Prettier) |
pnpm run build:{win,mac,linux} | Build local distributables → dist/ |
For the test categories, how to run each, and which one a new test belongs in, see TESTING.md.
src/
main/ # Electron main process (TypeScript)
sources/ # Install-method plugins (standalone, portable, git, …)
lib/ # Shared main-process logic + IPC
preload/ # Context-bridge preload scripts
renderer/src/ # Vue 3 renderer (components, composables, stores, views)
types/ # Shared IPC types (single source of truth)
locales/ # i18n translations
The app ships a minimal (~15–20 MB) standalone Python with pygit2 baked in, under bootstrap-python/<platform>/. It provides git operations (clone, fetch, ls-remote) before any standalone ComfyUI environment is provisioned, so the app works on machines without system git.
| Command | What it does |
|---|---|
pnpm run bootstrap | Build locally via scripts/build-bootstrap-python.mjs (no system Python needed). Auto-detects the host platform and architecture; pass --platform win-x64|win-arm64|mac-arm64|linux-x64 for another. |
pnpm run bootstrap:fetch | Download a prebuilt archive from the bootstrap-v3 release (faster). Set GITHUB_TOKEN to authenticate. |
Both write to bootstrap-python/{win-x64,win-arm64,mac-arm64,linux-x64}/ (gitignored). The directory must exist before pnpm run dev or pnpm run build:*. win-arm64 is the native Windows on Arm build (NVIDIA RTX Spark, Snapdragon X); the app picks win-<process.arch> in dev and ToDesktop's targetOverrides select it for the arm64 installer.
At runtime the main process picks a git backend in priority order (src/main/lib/ipc/index.ts): bootstrap pygit2 → standalone-install pygit2 → system git. Set COMFY_FORCE_BOOTSTRAP_GIT=1 (or pnpm run dev:bootstrap) to verify the bundled path that ships to users without git.
Production builds go through ToDesktop in CI — nothing is built locally. Any maintainer can cut a release; it's one workflow run plus a PR merge.
To ship a release:
channel — stable for a real release (promotes to Latest), or rc for a pre-release test build.bump — patch / minor / major.chore: bump version to vX.Y.Z PR, authored by cloud-code-bot and labeled Release.vX.Y.Z, which triggers the ToDesktop build and ships the new version to Desktop users. No manual tagging, no draft to publish.Three workflows in .github/workflows/:
| Workflow | Trigger | Role |
|---|---|---|
version-bump.yml | manual (Run workflow) | Opens the version-bump PR (bot-authored) and labels it Release. |
release-from-pr-label.yml | pull_request_target: closed | On merge of a Release-labeled PR, tags vX.Y.Z and dispatches the build. |
build-release.yml | push of a v* tag | Runs pnpm run build, uploads Datadog sourcemaps, runs todesktop build, and publishes the GitHub Release (stable → Latest, -rc → pre-release). |
CLI equivalent of step 1:
gh workflow run version-bump.yml -f channel=stable -f bump=patch
GitHub Actions config:
APP_ID + secret CLOUD_CODE_BOT_PRIVATE_KEY — the cloud-code-bot GitHub App that opens the version-bump PR, so any maintainer can release without a personal token.TODESKTOP_ACCESS_TOKEN, TODESKTOP_EMAIL (ToDesktop CLI) and DATADOG_API_KEY (RUM sourcemaps).On Windows/macOS, app data lives under the standard Electron userData path. Dev and production use separate directories because Electron derives the name from package.json name (comfyui-desktop-2) in dev vs productName (Comfy Desktop) in packaged builds:
| Windows | macOS | Linux | |
|---|---|---|---|
| Dev | %APPDATA%\comfyui-desktop-2 | ~/Library/Application Support/comfyui-desktop-2 | ~/.config/comfyui-desktop-2 |
| Production | %APPDATA%\Comfy Desktop | ~/Library/Application Support/Comfy Desktop | ~/.config/Comfy Desktop |
On Linux the app follows the XDG Base Directory Specification for config, data, cache, and state. The default install directory is ~/ComfyUI-Installs.
If a manual update leaves the app broken (no styling, dead dropdowns — usually a stale Chromium profile), the scripts/reset-* helpers wipe every known data location. They prompt before deleting and do not touch your ~/ComfyUI-Installs.
Quit the app first, then:
# Windows (PowerShell)
iwr -useb https://raw.githubusercontent.com/Comfy-Org/Comfy-Desktop/main/scripts/reset-windows.ps1 -OutFile reset-windows.ps1
powershell -ExecutionPolicy Bypass -File .\reset-windows.ps1
# macOS
curl -fsSLO https://raw.githubusercontent.com/Comfy-Org/Comfy-Desktop/main/scripts/reset-mac.sh && bash reset-mac.sh
# Linux
curl -fsSLO https://raw.githubusercontent.com/Comfy-Org/Comfy-Desktop/main/scripts/reset-linux.sh && bash reset-linux.sh
Pass --yes (or -Yes on Windows) to skip the prompt. After cleanup, reinstall from the latest release. You may need to re-add installations via "Add existing installation" since installations.json is wiped too.
Issues and pull requests are welcome. Before opening a PR, please run pnpm run typecheck, pnpm run lint, and pnpm test locally — see Development. For coding conventions, see AGENTS.md.
Comfy Desktop is dual-licensed:
Exception: the @comfyorg/comfyui-desktop-bridge-types package (the TypeScript interface for the hosted frontend bridge) remains licensed under the MIT License. This exception applies only to that package and does not determine the licensing obligations of other repository components or combined distributions.
© Comfy Org.
TypeScript
82.2%
Vue
14.2%
CSS
1.0%
The desktop app for ComfyUI
444
stars
851
commits
TypeScript
primary language
Sep 10, 2026
updated
Comfy Desktop is the official desktop application for ComfyUI, the node-based engine for generative AI. It installs ComfyUI into a self-contained, GPU-ready environment, lets you run multiple independent setups side by side, and keeps them updated — so you spend your time building workflows instead of fighting Python, CUDA, and pip.
pygit2 bootstrap so clones work on a clean machine.dl.todesktop.com/241130tqe9q3y — one link, auto-detects your platform.
New to ComfyUI? Just download, install, and open the app — it walks you through creating your first setup. No terminal required.
Requirements: Windows, macOS (Apple Silicon), or Linux. A dedicated GPU (NVIDIA / AMD) or Apple Silicon is recommended for good performance, but not required.
Windows — run the NSIS installer (.exe) and launch from the Start Menu or desktop shortcut.
macOS — open the .dmg, drag Comfy Desktop to Applications, and launch from there.
Linux — .deb (Debian/Ubuntu), from the directory you downloaded it to:
sudo apt install ./*.deb
AppImage:
chmod +x ./*.AppImage
./*.AppImage --no-sandbox
Then launch from your application menu.
From there you can add more installs, take snapshots before risky changes, and update ComfyUI or its custom nodes per install.
Contributions are welcome. The app is an Electron + Vue 3 + TypeScript project built with electron-vite.
nvm install 22 && nvm use 22 # recommended — https://github.com/nvm-sh/nvm
corepack enable # enables pnpm (bundled with Node)
git clone https://github.com/Comfy-Org/Comfy-Desktop.git
cd Comfy-Desktop
pnpm run init
pnpm run init is the one-shot for a fresh clone: it runs pnpm install (with the postinstall + husky hooks) and pnpm run bootstrap to build the bundled bootstrap Python (see below).
pnpm run dev # Windows / macOS
./linux-dev.sh # Linux
On Windows/macOS, set up a fresh clone and start the app in one command with pnpm run init:dev.
| Command | Description |
|---|---|
pnpm run init:dev | Install dependencies, build bootstrap Python, then run pnpm run dev |
pnpm run dev | Start the app in dev mode |
pnpm test | Unit tests (Vitest) |
pnpm run test:integration | Integration suite |
pnpm run test:e2e | End-to-end tests (Playwright) |
pnpm run test:e2e:lifecycle | Lifecycle Playwright project (real installs/downloads; see e2e/README.md) |
pnpm run typecheck | Type-check (node + web + e2e + integration) |
pnpm run lint / lint:fix | Lint (ESLint) |
pnpm run format | Format (Prettier) |
pnpm run build:{win,mac,linux} | Build local distributables → dist/ |
For the test categories, how to run each, and which one a new test belongs in, see TESTING.md.
src/
main/ # Electron main process (TypeScript)
sources/ # Install-method plugins (standalone, portable, git, …)
lib/ # Shared main-process logic + IPC
preload/ # Context-bridge preload scripts
renderer/src/ # Vue 3 renderer (components, composables, stores, views)
types/ # Shared IPC types (single source of truth)
locales/ # i18n translations
The app ships a minimal (~15–20 MB) standalone Python with pygit2 baked in, under bootstrap-python/<platform>/. It provides git operations (clone, fetch, ls-remote) before any standalone ComfyUI environment is provisioned, so the app works on machines without system git.
| Command | What it does |
|---|---|
pnpm run bootstrap | Build locally via scripts/build-bootstrap-python.mjs (no system Python needed). Auto-detects the host platform and architecture; pass --platform win-x64|win-arm64|mac-arm64|linux-x64 for another. |
pnpm run bootstrap:fetch | Download a prebuilt archive from the bootstrap-v3 release (faster). Set GITHUB_TOKEN to authenticate. |
Both write to bootstrap-python/{win-x64,win-arm64,mac-arm64,linux-x64}/ (gitignored). The directory must exist before pnpm run dev or pnpm run build:*. win-arm64 is the native Windows on Arm build (NVIDIA RTX Spark, Snapdragon X); the app picks win-<process.arch> in dev and ToDesktop's targetOverrides select it for the arm64 installer.
At runtime the main process picks a git backend in priority order (src/main/lib/ipc/index.ts): bootstrap pygit2 → standalone-install pygit2 → system git. Set COMFY_FORCE_BOOTSTRAP_GIT=1 (or pnpm run dev:bootstrap) to verify the bundled path that ships to users without git.
Production builds go through ToDesktop in CI — nothing is built locally. Any maintainer can cut a release; it's one workflow run plus a PR merge.
To ship a release:
channel — stable for a real release (promotes to Latest), or rc for a pre-release test build.bump — patch / minor / major.chore: bump version to vX.Y.Z PR, authored by cloud-code-bot and labeled Release.vX.Y.Z, which triggers the ToDesktop build and ships the new version to Desktop users. No manual tagging, no draft to publish.Three workflows in .github/workflows/:
| Workflow | Trigger | Role |
|---|---|---|
version-bump.yml | manual (Run workflow) | Opens the version-bump PR (bot-authored) and labels it Release. |
release-from-pr-label.yml | pull_request_target: closed | On merge of a Release-labeled PR, tags vX.Y.Z and dispatches the build. |
build-release.yml | push of a v* tag | Runs pnpm run build, uploads Datadog sourcemaps, runs todesktop build, and publishes the GitHub Release (stable → Latest, -rc → pre-release). |
CLI equivalent of step 1:
gh workflow run version-bump.yml -f channel=stable -f bump=patch
GitHub Actions config:
APP_ID + secret CLOUD_CODE_BOT_PRIVATE_KEY — the cloud-code-bot GitHub App that opens the version-bump PR, so any maintainer can release without a personal token.TODESKTOP_ACCESS_TOKEN, TODESKTOP_EMAIL (ToDesktop CLI) and DATADOG_API_KEY (RUM sourcemaps).On Windows/macOS, app data lives under the standard Electron userData path. Dev and production use separate directories because Electron derives the name from package.json name (comfyui-desktop-2) in dev vs productName (Comfy Desktop) in packaged builds:
| Windows | macOS | Linux | |
|---|---|---|---|
| Dev | %APPDATA%\comfyui-desktop-2 | ~/Library/Application Support/comfyui-desktop-2 | ~/.config/comfyui-desktop-2 |
| Production | %APPDATA%\Comfy Desktop | ~/Library/Application Support/Comfy Desktop | ~/.config/Comfy Desktop |
On Linux the app follows the XDG Base Directory Specification for config, data, cache, and state. The default install directory is ~/ComfyUI-Installs.
If a manual update leaves the app broken (no styling, dead dropdowns — usually a stale Chromium profile), the scripts/reset-* helpers wipe every known data location. They prompt before deleting and do not touch your ~/ComfyUI-Installs.
Quit the app first, then:
# Windows (PowerShell)
iwr -useb https://raw.githubusercontent.com/Comfy-Org/Comfy-Desktop/main/scripts/reset-windows.ps1 -OutFile reset-windows.ps1
powershell -ExecutionPolicy Bypass -File .\reset-windows.ps1
# macOS
curl -fsSLO https://raw.githubusercontent.com/Comfy-Org/Comfy-Desktop/main/scripts/reset-mac.sh && bash reset-mac.sh
# Linux
curl -fsSLO https://raw.githubusercontent.com/Comfy-Org/Comfy-Desktop/main/scripts/reset-linux.sh && bash reset-linux.sh
Pass --yes (or -Yes on Windows) to skip the prompt. After cleanup, reinstall from the latest release. You may need to re-add installations via "Add existing installation" since installations.json is wiped too.
Issues and pull requests are welcome. Before opening a PR, please run pnpm run typecheck, pnpm run lint, and pnpm test locally — see Development. For coding conventions, see AGENTS.md.
Comfy Desktop is dual-licensed:
Exception: the @comfyorg/comfyui-desktop-bridge-types package (the TypeScript interface for the hosted frontend bridge) remains licensed under the MIT License. This exception applies only to that package and does not determine the licensing obligations of other repository components or combined distributions.
© Comfy Org.
TypeScript
82.2%
Vue
14.2%
CSS
1.0%