Skip to content

Comfy-Org/ComfyUI_frontend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ComfyUI_frontend

Official front-end implementation of ComfyUI.

Website Discord Matrix

Release Schedule

Nightly Release

Nightly releases are published daily at https://github.com/Comfy-Org/ComfyUI_frontend/releases.

To use the latest nightly release, add the following command line argument to your ComfyUI launch script:

--front-end-version Comfy-Org/ComfyUI_frontend@latest

For Windows Stand-alone Build Users

Edit your run_cpu.bat or run_nvidia_gpu.bat file as follows:

.\python_embeded\python.exe -s ComfyUI\main.py --windows-standalone-build --front-end-version Comfy-Org/ComfyUI_frontend@latest
pause

Stable Release

Stable releases are published weekly in the ComfyUI main repository, aligned with ComfyUI backend's stable release schedule.

Feature Freeze

There will be a 2-day feature freeze before each stable release. During this period, no new major features will be merged.

Release Summary

Major features

v1.3.22: Integrated server terminal

Press Ctrl + ` to toggle integrated terminal.

integrated_terminal_demo.mp4
v1.3.7: Keybinding customization

Basic UI

image

Reset button

image

Edit Keybinding

image image

keybinding_demo.mp4
v1.2.4: Node library sidebar tab

Drag & Drop

nodelib_dnd.mp4

Filter

nodelist_filter.mp4
v1.2.0: Queue/History sidebar tab
QueueDemo2.mp4
v1.1.0: Node search box

Fuzzy search & Node preview

image

Release link with shift

07.07.2024_23.27.39_REC.mp4

QoL changes

v1.3.32: **Litegraph** Nested group
nested-groups-ii.mp4
v1.3.24: **Litegraph** Group selection
litegraph-multi-group-select.mp4
v1.3.6: **Litegraph** Toggle link visibility
link_toggle.mp4
v1.3.4: **Litegraph** Auto widget to input conversion

Dropping a link of correct type on node widget will automatically convert the widget to input.

fast_connect_demo2.mp4
v1.3.4: **Litegraph** Canvas pan mode

The canvas becomes readonly in pan mode. Pan mode is activated by clicking the pan mode button on the canvas menu or by holding the space key.

pan_mode.mp4
v1.3.1: **Litegraph** Shift drag link to create a new link
rec.webm
v1.2.62: **Litegraph** Show optional input slots as donuts

GYEIRidb0AYGO-v

v1.2.44: **Litegraph** Double click group title to edit
groupTitleEditDemo.mp4
v1.2.39: **Litegraph** Group selected nodes with Ctrl + G
quickGroupDemo.mp4
v1.2.38: **Litegraph** Double click node title to edit
editFinalDemo.mp4
v1.2.7: **Litegraph** drags multiple links with shift pressed
batch_connect_demo.mp4
batch_disconnect.mp4
v1.2.2: **Litegraph** auto connects to correct slot

Before

link_slot_broken.mp4

After

link_slot_fixed.mp4
v1.1.8: **Litegraph** hides text overflow on widget value
overflowfix.mp4

Developer APIs

v1.3.34: Register about panel badges
app.registerExtension({
  name: 'TestExtension1',
  aboutPageBadges: [
    {
      label: 'Test Badge',
      url: 'https://example.com',
      icon: 'pi pi-box'
    }
  ]
})

image

v1.3.22: Register bottom panel tabs
app.registerExtension({
  name: 'TestExtension',
  bottomPanelTabs: [
    {
      id: 'TestTab',
      title: 'Test Tab',
      type: 'custom',
      render: (el) => {
        el.innerHTML = '<div>Custom tab</div>'
      }
    }
  ]
})

image

v1.3.22: New settings API

Legacy settings API.

// Register a new setting
app.ui.settings.addSetting({
  id: 'TestSetting',
  name: 'Test Setting',
  type: 'text',
  defaultValue: 'Hello, world!'
})

// Get the value of a setting
const value = app.ui.settings.getSettingValue('TestSetting')

// Set the value of a setting
app.ui.settings.setSettingValue('TestSetting', 'Hello, universe!')

New settings API.

// Register a new setting
app.registerExtension({
  name: 'TestExtension1',
  settings: [
    {
      id: 'TestSetting',
      name: 'Test Setting',
      type: 'text',
      defaultValue: 'Hello, world!'
    }
  ]
})

// Get the value of a setting
const value = app.extensionManager.setting.get('TestSetting')

// Set the value of a setting
app.extensionManager.setting.set('TestSetting', 'Hello, universe!')
v1.3.7: Register commands and keybindings

Extensions can call the following API to register commands and keybindings. Do note that keybindings defined in core cannot be overwritten, and some keybindings are reserved by the browser.

  app.registerExtension({
    name: 'TestExtension1',
    commands: [
      {
        id: 'TestCommand',
        function: () => {
          alert('TestCommand')
        }
      }
    ],
    keybindings: [
      {
        combo: { key: 'k' },
        commandId: 'TestCommand'
      }
    ]
  })
v1.3.1: Extension API to register custom topbar menu items

Extensions can call the following API to register custom topbar menu items.

  app.registerExtension({
    name: 'TestExtension1',
    commands: [
      {
        id: 'foo-id',
        label: 'foo',
        function: () => {
          alert(1)
        }
      }
    ],
    menuCommands: [
      {
        path: ['ext', 'ext2'],
        commands: ['foo-id']
      }
    ]
  })

image

v1.2.27: Extension API to add toast messagei

Extensions can call the following API to add toast messages.

  app.extensionManager.toast.add({
    severity: 'info',
    summary: 'Loaded!',
    detail: 'Extension loaded!',
    life: 3000
  })

Documentation of all supported options can be found here: https://primevue.org/toast/#api.toast.interfaces.ToastMessageOptions

image

v1.2.4: Extension API to register custom sidebar tab

Extensions now can call the following API to register a sidebar tab.

  app.extensionManager.registerSidebarTab({
    id: "search",
    icon: "pi pi-search",
    title: "search",
    tooltip: "search",
    type: "custom",
    render: (el) => {
      el.innerHTML = "<div>Custom search tab</div>";
    },
  });

The list of supported icons can be found here: https://primevue.org/icons/#list

We will support custom icons later.

image

Development

Tech Stack

Git pre-commit hooks

Run npm run prepare to install Git pre-commit hooks. Currently, the pre-commit hook is used to auto-format code on commit.

Dev Server

Note: The dev server will NOT load any extension from the ComfyUI server. Only core extensions will be loaded.

  • Start local ComfyUI backend at localhost:8188
  • Run npm run dev to start the dev server
  • Run npm run dev:electron to start the dev server with electron API mocked

Access dev server on touch devices

Enable remote access to the dev server by setting VITE_REMOTE_DEV in .env to true.

After you start the dev server, you should see following logs:

> [email protected] dev
> vite


  VITE v5.4.6  ready in 488 ms

  ➜  Local:   http://localhost:5173/
  ➜  Network: http://172.21.80.1:5173/
  ➜  Network: http://192.168.2.20:5173/
  ➜  press h + enter to show help

Make sure your desktop machine and touch device are on the same network. On your touch device, navigate to http://<server_ip>:5173 (e.g. http://192.168.2.20:5173 here), to access the ComfyUI frontend.

Unit Test

  • git clone https://github.com/comfyanonymous/ComfyUI_examples.git to tests-ui/ComfyUI_examples or the EXAMPLE_REPO_PATH location specified in .env
  • npm i to install all dependencies
  • npm run test:generate to fetch tests-ui/data/object_info.json
  • npm run test:generate:examples to extract the example workflows
  • npm run test to execute all unit tests.

Component Test

Component test verifies Vue components in src/components/.

  • npm run test:component to execute all component tests.

Playwright Test

Playwright test verifies the whole app. See https://github.com/Comfy-Org/ComfyUI_frontend/blob/main/browser_tests/README.md for details.

LiteGraph

This repo is using litegraph package hosted on https://github.com/Comfy-Org/litegraph.js. Any changes to litegraph should be submitted in that repo instead.

Test litegraph changes

  • Run npm link in the local litegraph repo.
  • Run npm link @comfyorg/litegraph in this repo.

This will replace the litegraph package in this repo with the local litegraph repo.

Internationalization (i18n)

Our project supports multiple languages using vue-i18n. This allows users around the world to use the application in their preferred language.

Supported Languages

  • en (English)
  • zh (中文)
  • ru (Русский)
  • ja (日本語)
  • ko (한국어)

How to Add a New Language

We welcome the addition of new languages. You can add a new language by following these steps:

1. Generate language files

We use lobe-i18n as our translation tool, which integrates with LLM for efficient localization.

Update the configuration file to include the new language(s) you wish to add:

const { defineConfig } = require('@lobehub/i18n-cli');

module.exports = defineConfig({
  entry: 'src/locales/en.json', // Base language file
  entryLocale: 'en',
  output: 'src/locales',
  outputLocales: ['zh', 'ru', 'ja'], // Add the new language(s) here
});

Set your OpenAI API Key by running the following command:

npx lobe-i18n --option

Once configured, generate the translation files with:

npx lobe-i18n locale

This will create the language files for the specified languages in the configuration.

2. Update i18n Configuration

Import the newly generated locale file(s) in the src/i18n.ts file to include them in the application's i18n setup.

3. Enable Selection of the New Language

Add the newly added language to the following item in src/constants/coreSettings.ts:

  {
    id: 'Comfy.Locale',
    name: 'Locale',
    type: 'combo',
    // Add the new language(s) here
    options: [
      { value: 'en', text: 'English' },
      { value: 'zh', text: '中文' },
      { value: 'ru', text: 'Русский' },
      { value: 'ja', text: '日本語' }
    ],
    defaultValue: navigator.language.split('-')[0] || 'en'
  },

This will make the new language selectable in the application's settings.

4. Test the Translations

Start the development server, switch to the new language, and verify the translations. You can switch languages by opening the ComfyUI Settings and selecting from the ComfyUI > Locale dropdown box.

Deploy

  • Option 1: Set DEPLOY_COMFYUI_DIR in .env and run npm run deploy.
  • Option 2: Copy everything under dist/ to ComfyUI/web/ in your ComfyUI checkout manually.

Publish release to ComfyUI main repo

Run following command to publish a release to ComfyUI main repo. The script will create a new branch and do a commit to web/ folder by checkout dist.zip from GitHub release.

  • python scripts/main_repo_release.py <path_to_comfyui_main_repo> <version>