ComfyUI-ZenKit
ZenKit — a UX framework for ComfyUI: panels, a theme token system and a cross-plugin event bus, exposed as window.ZenKit, with a Media Viewer, Asset Browser and Timer built in.
ZenKit turns ComfyUI into a calm, tidy workspace: dockable panels, a taskbar, full-screen apps and swappable themes. It also gives other plugins one shared toolkit to build on, so they look and behave alike. ZenKit itself adds no nodes.
<img alt="ZenKit in ComfyUI: floating media viewers, the agent panel, memory and timer panels, and the taskbar" src="docs/assets/hero.webp" width="100%">What you get
| | |
| ------------------------- | ---------------------------------------------------------------------------- |
| Panels and workspaces | Floating, docking and tiling windows that remember where you left them |
| Taskbar and apps | A permanent taskbar, a launcher, and full-screen apps with their own routes |
| Themes | 26 theme packs, written as plain JSON, that restyle ComfyUI and every plugin |
| Canvas backgrounds | Animated or image backgrounds behind the graph, with dim, frost and effects |
| Media and channels | A shared viewer, a named media bus, and refs that pass images between tools |
| Capabilities | Actions plugins offer each other, which agents can call as tools |
| UI kit | 48 themed Vue components, published as @nynxz/zenkit-ui |
Install
Search for ZenKit in ComfyUI-Manager, or use the CLI:
comfy node install comfyui-zenkit
Restart ComfyUI and the taskbar appears, with a Media Viewer, Asset Browser and Timer in its Start menu. Not using them? Turn off Built-in panels in ZenKit's settings.
Build on it
One call registers everything your plugin adds. It quietly does nothing when ZenKit isn't installed.
import { registerZenPlugin, mountVue } from '@nynxz/zenkit-client'
import Stash from './Stash.vue'
registerZenPlugin({
id: 'stash',
plugin: 'Stash',
panels: [{ id: 'main', title: 'Stash', icon: 'mdi mdi-archive', render: mountVue(Stash) }],
capabilities: [
{ id: 'search', description: 'Find saved images by text', run: ({ q }) => search(String(q)) },
],
})
Writing a node pack instead? @nynxz/zenkit-nodekit
puts Vue widgets inside nodes, and works with or without ZenKit.
Plugins
ComfyUI-ZenKit is the host, and comes with a Media Viewer, Asset Browser and Timer. Alongside it:
- ZenInspector: shows what every node pack and extension actually registered.
More are in progress. See Plugins.
Docs
Everything else is in the wiki:
getting started ·
guides ·
API reference ·
UI components ·
contributing.
The wiki is generated from docs/wiki, so fixes go through pull requests.
Develop
pnpm install
pnpm check # build, test, lint, format and typecheck everything
See Contributing for the repo layout and the release flow.
License
Released under the MIT License. © 2026 Henry Lee.