Shot-based orchestration for ComfyUI. Build a shot out of several ComfyUI workflows, chain each workflow's outputs into the next one's inputs, run steps individually or as a chain, preview every result, and cut the finished shots together on a timeline.
ComfyUI runs one graph at a time and its IMAGE / AUDIO / LATENT values are in-memory tensors that vanish when execution ends. ComfyWebStudio ships a companion custom node pack whose output nodes persist those tensors to disk deterministically and report structured metadata back — which is what makes cross-workflow chaining possible.
| Path | What it is |
|---|---|
backend/comfywebstudio/ |
FastAPI service — orchestration, persistence, media, render |
comfy_nodes/ |
The ComfyUI custom node pack (comfyui-webstudio) |
frontend/ |
Vite + React + TypeScript UI |
tests/ |
pytest suite, including a fake ComfyUI server fixture |
- Python 3.12+ (developed on 3.14)
- Node 22+ (for the frontend only)
- A ComfyUI instance — local (fast path: shared filesystem) or remote over its HTTP/WS API
No system ffmpeg is required; rendering uses PyAV, which bundles its own FFmpeg libraries.
macOS / Linux
./start.shWindows
start.bat
The launcher installs anything missing on first run, builds the interface, starts the server on
http://127.0.0.1:8500 and opens a browser. Add --dev for hot reload, --port 9000 for a different
port, or --setup to install dependencies and stop.
Then, in Settings → ComfyUI backends, point it at your ComfyUI and press Install to add the node pack (ComfyUI needs a restart afterwards).
Workflows built from subgraphs work as they are: the inputs a subgraph promotes become editable parameters automatically, so you get the author's intended knobs without opening it up.
Open in ComfyUI opens the workflow as a properly named, saved ComfyUI workflow — one imported from ComfyUI reopens its original file — so Ctrl+S there just saves, and the change syncs straight back. ComfyUI opens inside the app, in a panel you can fill the workspace with; shift-click to use a separate browser tab instead.
Drag a shot onto another shot to place it as one node — its ports wired like any other, its values its own, and the shot it came from still live behind it. Templates do the same across projects.
Panels dock beside, above and below each other, not just as tabs: drag a tab to an edge to split, to the rim to span it, or out of the window to float it.
Using make instead
make setup # backend venv + frontend deps
make link-nodepack # symlink comfy_nodes into your ComfyUI custom_nodes
make dev # backend on :8500, frontend dev server on :5173
make test # every test suite| Menu | What it covers |
|---|---|
| File | New / open / save / duplicate a project, import workflows from ComfyUI or a file, import media, import and export projects, export a plugin |
| Edit | Undo and redo, cut / copy / paste steps and clips, duplicate, delete, select all, history, named versions, preferences |
| Window | Show or hide the side panels, zoom and fit the graph, jump between Shots, Timeline and Settings |
| Plugins | Install, enable, apply and export reusable workflow + shot packs |
| Help | Keyboard shortcuts, documentation, open ComfyUI, about |
Press Ctrl+/ for the full shortcut list, and right-click almost anything — steps, the canvas, links, shots, workflows, clips, tracks and project cards all have their own menus.
Every edit is recorded. Ctrl+H opens the history: browse what changed, name a version to come back to, roll the whole project back, or restore just one step from an earlier point without touching anything else.
ComfyWebStudio publishes what it can do as a catalogue of about thirty documented actions across the storyboard, the shots and the timeline — the same list drives an in-app agent and any external MCP client, so the two cannot drift apart.
In the app. Window ▸ Panels ▸ Agents. Pick an agent, type a goal — "a three-shot sequence about a lighthouse at dawn" — and watch it work. Three ship with the app: Sequence builder (premise → board → shots → cut), Storyboard writer and Timeline assembler. Each declares exactly which actions it may call, and anything that deletes, overwrites or renders stops and asks before it happens. Every step records what it decided, what it sent and what came back.
It runs on your own machine through the language model already configured in Settings — Ollama is the usual choice. It needs no tool-calling support from the model: each turn is constrained to a schema, so a 7B model cannot name an action that does not exist or produce arguments of the wrong shape.
From Claude Desktop, Cursor, or any MCP client.
pip install 'comfywebstudio[mcp]'{
"mcpServers": {
"comfywebstudio": {
"command": "comfywebstudio-mcp",
"env": { "CWS_URL": "http://127.0.0.1:8500" }
}
}
}The server builds its tool list from the running application, and serves the knowledgebase — what has to happen before what — as MCP resources. Start ComfyWebStudio first; the server is a client of its API, not a part of it.
| Document | What it is |
|---|---|
| docs/GUIDE.md | Using it: the workspace, shots, parameters, ComfyUI, timeline, rendering |
| docs/ARCHITECTURE.md | How it works, and why it is built the way it is |
| docs/VERIFY.md | Every test suite, plus a manual checklist |
Screenshots in the guide are generated by scripts/docs_screenshots.py against a running instance, so they
do not quietly go stale — re-run it after a UI change and commit what moves.
