Nodes/ComfyUI-TJ_NODE_STUDIO_ONE/Moss Image ONE STUDIO (TJ)
ComfyUI Node

Moss Image ONE STUDIO (TJ)

Draw boxes, get exact text and layout

By designloves2·Created 5 months ago·Updated 2 days ago· 46
Moss Image ONE STUDIO (TJ)
  • pipe
  • image
  • prompt
  • settings
◄prompt_override►

MOSS-Image is the rare open model that takes layout seriously. It's a ~5B text-to-image model with a Qwen3.5 text encoder and the FLUX.2 small VAE, and ComfyUI ships native nodes for it - including one that turns bounding boxes into the layout prompt the model actually reads. The catch: the official template is a graph. Moss Image ONE STUDIO (TJ) collapses that into a single node with its own panel, so you pick a mode from a dropdown instead of rewiring anything.

Fair warning: this model is quiet - no crowd-sourced verdict is coming. What you get instead is a wrapper built on ComfyUI's own MOSS-Image templates - which is why the defaults look sane rather than invented.

What the node actually does under the hood

It's a graph builder, not a black box. When you hit Generate, the node's JavaScript assembles a ComfyUI graph and submits it: UNETLoader (or UnetLoaderGGUF if your model filename ends in .gguf) → your LoRAs via LoraLoaderModelOnly → optional SkipLayerGuidanceDiTSimple → KSampler, with CLIPLoader pinned to the moss_image type, EmptyFlux2LatentImage for T2I, and VAEDecode at the end. The Python side is thin - it stores the last render and hands it to the output slot.

Which means the R2I mode isn't faking layout: it builds CreateBoundingBoxes and MOSSImageLayoutPrompt nodes and feeds their output in as the positive conditioning, exactly as the bboxes template does.

The four modes

T2I is the plain path. I2I scales your source to the working size, VAE-encodes it and re-noises by a Denoise value. INPAINT uses the shared painted-mask editor and routes through a latent noise mask plus DifferentialDiffusion, so the painted area follows your prompt and everything else is preserved. R2I (bboxes) is the one you came for: you drag boxes on a canvas at the working size, tag each as OBJECT or TEXT, describe what's inside (or type the exact characters for a TEXT box), and the boxes become the layout prompt in drawing order. A Characters field takes object box numbers (1, 3) for the boxes that should read as characters. And draw the background box first - the UI says so, and it's right.

The sockets you'll actually touch

Two optional inputs in the graph, both about reuse rather than generation.

prompt_override takes a string and replaces the node's own prompt outright - from a PromptDBLoader(TJ), any text node, or through a Reroute. pipe takes the TJ_PROMPT_PIPE from that same loader and applies prompt, seed, steps, cfg, sampler and scheduler at generation time, with missing fields falling back to the node's own settings. The node's UI never changes, so it won't confuse you mid-session. Both are ignored when the top-bar Prompt/pipe Override switch is off - that's how one loader stays wired to five nodes and gets toggled per node.

Three outputs: image (the last render, as a normal IMAGE), prompt (the text actually used, pipe and override included) and settings (JSON with model, seed, steps, cfg, sampler, scheduler, positive and negative prompt). Wire image into whatever saves, settings into PromptDBSave(TJ)'s JSON input if you keep a prompt database. Note image only fills after a run - it's a slot into the node's history, not a live feed.

Install

ComfyUI Manager, search ComfyUI-TJ_NODE_STUDIO_ONE, install, restart. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/designloves2/ComfyUI-TJ_NODE_STUDIO_ONE.git

Then - the step people skip - run the dependency installer once, because Manager's git path does not install the sibling node packs this family leans on:

cd ComfyUI/custom_nodes/ComfyUI-TJ_NODE_STUDIO_ONE
bash install_requirements.sh        # Windows: install_requirements.bat

Moss itself needs far less than the video nodes do, but the shared UI wants ComfyUI-KJNodes' Model Preview Override for live sampling previews, and ComfyUI-GGUF if you plan on GGUF diffusion models. Neither is required to generate.

Models, all from Hugging Face Comfy-Org/MOSS-Image: moss_image_sft_* or moss_image_base_* into models/diffusion_models, a qwen3.5_9b_* encoder into models/text_encoders, flux2-vae into models/vae. Then set all three in the node's ⚙ Settings. Leave one out and nothing renders - the builder stops with "No diffusion model selected / No text encoder selected / No VAE selected", depending on which slot you forgot.

Defaults, and where people get burned

The shipped defaults are 25 steps, CFG 2.5, sampler er_sde, scheduler simple - copied from the ComfyUI template. That CFG matters: this is not a guidance-distilled speed model, so unlike Z-Image Turbo or Klein at CFG 1, a negative prompt here is doing real work. The node fills in a short one by default. Don't paste your SDXL negative wall in, though - a 5B flow model at CFG 2.5 does not want a hundred weighted tokens.

Two traps. The big one: generation runs from the node's own ▶ Generate button, not ComfyUI's RUN. Queue the prompt and you get the previous image out of the output slot, which reads as a caching bug and isn't. The other is size: dimensions are snapped to multiples of 16, so a 1080-tall preset renders 1088. No error, just a render that isn't the resolution you typed.

If generation dies on a missing node class, your ComfyUI predates the MOSS-Image nodes. Update ComfyUI itself - no custom pack supplies MOSSImageLayoutPrompt.

Category ✨ TJ_Node/Generator

Inputs (2)

NameTypeDefaultDescription
prompt_overrideoptSTRINGExternal prompt override — replaces the node's own prompt. Takes the text of a PromptDBLoader (TJ) or any text node wired in.
pipeoptTJ_PROMPT_PIPEPromptDB pipe (TJ_NODE). At generation, fields present in the pipe override this node's settings; missing fields keep the node's own values. The node's UI is never changed.

Outputs (3)

NameTypeDescription
imageIMAGE—
promptSTRING—
settingsSTRING—