Repository navigation
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__.pyexposescomfy_entrypoint, setsWEB_DIRECTORY = "./js", and does not defineNODE_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.jswithzenPluginConfig. All but ComfyUI-ZenKit usesharedRuntime: true: theirvue,@nynxz/zenkit-uiand@nynxz/zenkit-clientimports load from/zenkit/runtime/*.js, so they do not work without ComfyUI-ZenKit. - Declares
[tool.zenkit] idinpyproject.toml, which ZenInspector reads to match the pack to itsregisterZenPlugin({ id })registration.
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. |
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.
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).
Getting started
Guides
- Panels and workspaces
- Apps and routing
- Themes
- Backgrounds
- Channels and media
- Jobs
- Capabilities
- Storage and bus
Node packs
UI components
Reference