Skip to content

Plugins

github-actions[bot] edited this page Oct 18, 2026 · 3 revisions

Plugins

The ComfyUI plugins that live in this repo under plugins/. ComfyUI-ZenKit is the host; the rest are ZenKit plugins built on it.

Plugin Adds Nodes Needs ComfyUI-ZenKit In publish-registry Version
ComfyUI-ZenKit window.ZenKit, taskbar, panels, themes, settings 4 is the host yes 0.3.0
ComfyUI-ZenInspector Install-wide debug panel none yes yes 0.3.0
ComfyUI-ZenAgent Agent panel on a local OpenAI-compatible model none yes no, still in testing 0.1.0
ComfyUI-ZenExample Reference plugin exercising the toolkit none yes no, read it in the repo 0.1.0

More plugins are in progress and will be documented here when they ship.

Every plugin:

  • Is a V3 pack: __init__.py exposes comfy_entrypoint, sets WEB_DIRECTORY = "./js", and does not define NODE_CLASS_MAPPINGS.
  • Registers its Python routes as an import side effect, guarded so a failure never blocks ComfyUI from loading.
  • Builds its frontend into js/main.js with zenPluginConfig. All but ComfyUI-ZenKit use sharedRuntime: true: their vue, @nynxz/zenkit-ui and @nynxz/zenkit-client imports load from /zenkit/runtime/*.js, so they do not work without ComfyUI-ZenKit.
  • Declares [tool.zenkit] id in pyproject.toml, which ZenInspector reads to match the pack to its registerZenPlugin({ id }) registration.

ComfyUI-ZenKit

The runtime host, with its built-in panels and the channel nodes they show.

Part What it does
js/main.js Installs window.ZenKit (installZenKit from @nynxz/zenkit-core), the taskbar, the theme system and the background. Sets window.ZenKitPending = true before installing so plugins wait for zen:ready. With ?zen-panel=<id> in the URL it mounts just that panel fullscreen (detached-panel window).
runtime/ vue.js, ui.js, client.js (+ chunks/), built by zenRuntimeConfig: the single Vue, zenkit-ui and zenkit-client every sharedRuntime plugin imports
themes/ 26 theme packs as themes/<id>/theme.json, discovered at runtime (no rebuild to add one). See Themes.
ComfyUI settings Background, layout and appearance settings
src/suite/, suite/ The built-in panels and their nodes and routes
Commands ZenKit.openSettings, ZenKit.togglePanels, ZenKit.Themes (also placed in the logo menu); an action-bar button opens Zen Settings

Routes:

Route Purpose
GET /zenkit/runtime/{path} Serves runtime/*.js (chunks are cached immutable)
GET /zenkit/themes Theme packs found on disk, with CSS file refs inlined
GET /zenkit/thumb?type=&filename=&subfolder=&size= Cached JPEG thumbnail of an input/output/temp file (first frame for video). Used by zenThumbUrl in @nynxz/zenkit-client.

Built-in panels

Once a separate pack (ComfyUI-ZenSuite), now part of ComfyUI-ZenKit. They register through registerZenPlugin like any plugin's (plugin id zensuite, so saved layouts keep working), and the Built-in panels setting (ZenKit.BuiltinPanels) leaves them out of the Start menu. If an old ComfyUI-ZenSuite is still installed, ZenKit leaves all of this to it and logs a reminder to remove it.

Panels (registered, none open automatically):

Panel id Title Notes
zensuite:viewer Media Viewer Multi-instance; follows a channel (see Channels and media)
zensuite:assets Asset Browser Browses input/output folders
zensuite:timer Timer

Capabilities: viewer.show and viewer.merge (see Capabilities).

Nodes (category Zen/Suite; the ids are unchanged, so workflows saved with ZenSuite load):

Node id Display name Does
zen.Channel.SyncImage Zen Sync Image Publishes an image to a channel; passes it through
zen.Channel.Sync Zen Sync Publishes an image, mask, video or audio to a channel; passes it through
zen.Channel.Save Zen Save Saves to the output folder (workflow embedded) and publishes the saved file
zen.Channel.Preview Zen Channel Preview A live wall of recent images on a channel, on the graph
zen.Bind Zen Bind Controls for widgets of other nodes in one place, on the node or in a panel

The Sync/Save nodes hide their channel/enable widgets and show them in a popover from a header cog; Channel Preview replaces its widgets with a live grid.

Zen Bind is canvas-only: no Python class, kept out of the prompt, so it never runs or touches the cache. Right-click any node → Bind to Zen Bind to add one of its widgets (a new Bind node appears beside it if there is none; with several, pick which), or use + on the node to pick widgets from any node in the graph. Each binding gets the control its widget calls for — numbers with the widget's own range and step (seeds get a dice), combos searchable, toggles, text — and edits go to the widget itself, its callback included, so they behave exactly as editing it on its node; changes made on the canvas show up in the list as they happen. Double-click a label to rename it, drag the grip to reorder; a binding whose node was deleted stays, greyed, until unbound. Widgets fed by a link can't be bound (their value comes from the link). Widgets a ZenKit pack mounts — a LoRA stack, a scene editor — are bound as themselves: Zen Bind shows the pack's own component, kept in step with the node (see zenMirror in Nodekit panels and canvas); the pack needs a nodekit with mirrors. The bindings are the node's properties, so they save with the workflow. The node pops out into a ZenKit panel (zenbind:<graph>:<node>) to tile into a workspace; it reopens with the workflow.

Routes: GET /zensuite/roots, /zensuite/assets, /zensuite/outputs, /zensuite/thumb, /zensuite/search (Asset Browser), and /zensuite/visual for the experimental search by description, which embeds files with a model from models/embedders and loads nothing until it is first used.

ComfyUI-ZenInspector

A debug panel for the whole ComfyUI install, not just ZenKit: every node pack and frontend extension, what each actually registered, and where the sources disagree.

Registers
Panel zeninspector:inspector (Zen Inspector)
Route GET /zeninspector/inspect: packs that failed to import, versions, git refs, pyproject identity, declared vs effective node ownership

It joins /object_info, /extensions, the live page (app.extensions, registered node types, the open graph), the inspect route, and ZenKit's plugin ledger (window.ZenKit.plugins).

Clone this wiki locally