IAMCCS MOSS Result — Canvas / cine_linx
The node that closes the MOSS loop without wiring a cycle
- images
- cine_linx
- image
- Mboard_project
Here's a problem you've probably hit in concept: you designed a frame in a visual editor node, you rendered it, and now you want the render back on the editor's canvas so you can nudge a box and go again. In ComfyUI that's a cycle - result feeding the thing that produced it - and cycles don't run. IAMCCS_MOSSFrameResult exists to break that loop from outside the graph.
What it is
It's the terminal node of the MOSS frame-design pair. You give it the decoded image and the project from IAMCCS_MOSSFrameDesigner, and it does four jobs at once: saves a PNG, pushes the render back to the designer's canvas over a websocket instead of a wire, bakes any overlay text regions into the pixels, and publishes an cine_linx bus payload so a MiniMax H3 branch can pick the frame up as a reference image.
That last part is the workflow payoff. MiniMax H3 takes reference pictures, and this node publishes rendered_images plus an H3 reference slot and role into the linx resource map - so the frame you just designed arrives downstream as a configured reference rather than a loose image you have to re-wire by hand.
How it works
Four mechanics are worth knowing, because each one shows up later as a "why did it do that".
It's an output node, and it always runs. Its IS_CHANGED returns a fresh uuid4 every call - the pack's way of saying saving and notifying the editor are side effects. So queueing always re-saves and always fires the websocket, which is the difference between an editor that updates and one that looks broken because ComfyUI skipped a cached node.
The canvas update is a websocket, not a link. Saving sends iamccs-moss-render with the designer's node id and the generated image, and the frontend redraws. That's why the graph has no cycle even though data conceptually flows backwards.
Overlay text is drawn with Pillow, after diffusion. Regions marked kind: "text" with text_mode: "overlay" are composited deterministically - the box decides the wrap width, font size auto-scales to about 4.5% of image height unless you set one, and it walks a list of common system fonts. So the words are genuinely exact, which is what you want for signage, captions and title cards. The price is that they look like composited type, not painted type.
The project is embedded in the PNG. The saved file carries the Mboard project JSON in its text metadata, and the same project is also updated in-memory with a base64 copy of the render so the designer can show it next run.
Inputs and outputs
- images - the decoded render. One detail: the first image is what goes into the embedded canvas payload, while the whole batch goes to the PNG save. Batch more than one frame in and the editor will only ever show you the first.
- project_data - forced input from the designer's
project_dataoutput. It's a string; wire it properly rather than pasting JSON. - filename_prefix - defaults to
IAMCCS_MOSS/Frame, standard ComfyUI output-folder conventions.
Outputs:
- cine_linx - the bus payload for downstream IAMCCS/H3 nodes.
- image - the (possibly text-composited) image, passed through so you can keep using ordinary image nodes.
- Mboard_project - the project as JSON string, in
IAMCCS.Mboardformat. Save it. It's your editable document, and it round-trips back into the designer.
The pack also exposes two localhost-only HTTP routes next to this node - /iamccs/moss/project-folders and /iamccs/moss/save-mboard - that let the editor browse a folder and write a .Mboard file. Both refuse non-local requests on purpose, so don't try to save projects through a tunnel.
Installing it
Same pack, same route: ComfyUI Manager → search IAMCCS Nodes → restart → hard-refresh the browser once. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/IAMCCS/IAMCCS-nodes.git
No models, no extra dependencies beyond what the pack already needs - it's Pillow, aiohttp and ComfyUI's own SaveImage. The frontend half (canvas refresh) needs the pack's JS to load, which is the hard-refresh bit.
Where people get burned
The editor never updates. Three suspects, in order: two copies of the pack in custom_nodes, a stale browser cache, or a graph where project_data isn't actually coming from the designer node - that's how the node finds the designer to notify.
You queued from the API and nothing happened. The websocket route to the editor only works in a live browser session, and the notification is keyed on the designer node id found in the prompt. API-only runs still save the PNG and still give you Mboard_project; they just can't redraw a UI that isn't open.
"Text overlay box is outside the image." The overlay region's coordinates don't land in the frame once your canvas size changed. Fix the box in the designer - the same project drives both nodes, so the error surfaces here even though the mistake is upstream.
It re-runs every queue and your graph feels slower. That's the always-dirty IS_CHANGED. It's the cost of an editor that updates live; put this node at the end of a chain, not in the middle of one.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| project_data | STRING | — | |
| filename_prefix | STRING | IAMCCS_MOSS/Frame | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| cine_linx | IAMCCS_SUPERNODE_LINX | — |
| image | IMAGE | — |
| Mboard_project | STRING | — |