This is a notation format I have developed for describing workflows. It is Topology based, shows explicit connection points, is rule based.
COMFYUI WORKFLOW NOTATION STANDARD
PURPOSE
This notation exists to communicate ComfyUI workflows with engineering precision.
Goals:
- Eliminate ambiguity
- Allow exact workflow reconstruction
- Clearly distinguish reused nodes vs new nodes
- Preserve workflow topology visibility
- Make debugging easier
- Prevent hidden assumptions
- Make workflows readable like electrical schematics
==================================================
RULE 1 — EXACT NODE NAMES
Always use exact ComfyUI node names.
GOOD:
Load Checkpoint
KSampler BASE
Apply Regional IPAdapters
Load ControlNet Model
BAD:
Checkpoint Loader
Sampler
ControlNet Thing
No aliases.
No shorthand.
==================================================
RULE 2 — PRIMARY INPUT PORT
Primary consumed datatype appears beside node.
Format:
Node Name (primary_input)
Examples:
KSampler BASE (latent_image)
VAE Encode (pixels)
Load Image (image)
Apply ControlNet (positive)
==================================================
RULE 3 — INBOUND CONNECTIONS
Secondary inputs appear vertically aligned.
Format:
Node Name (primary)
(input) ← Source Node (output)
(input) ← Source Node (output)
Example:
KSampler BASE (latent_image)
(model) ← Apply Regional IPAdapters (model)
(positive) ← Final Apply ControlNet (positive)
(negative) ← Final Apply ControlNet (negative)
Rules:
- Inputs align vertically
- Arrow points toward consumer
- Datatype shown explicitly
==================================================
RULE 4 — OUTBOUND CONNECTIONS
Outputs leave node through outbound block.
Format:
Node Name
outbound
(datatype)
↓
Example:
VAE Decode BASE
outbound
(image)
↓
Fan-out:
VAE Decode BASE
outbound
(image) → Save Image (images)
(image) → Upscale Image By (image)
↓
Rules:
- Show all fan-outs
- Shared outputs shown explicitly
- Never assume downstream nodes
==================================================
RULE 5 — FLOW DIRECTION
Workflow flow moves top to bottom.
GOOD:
Load Image
↓
VAE Encode
↓
KSampler
↓
VAE Decode
BAD:
Load Image → VAE Encode → KSampler
==================================================
RULE 6 — PARAMETERS
Parameters belong inside node block.
Example:
KSampler BASE
seed: 12345
steps: 25
cfg: 7
sampler_name: dpmpp_2m
scheduler: karras
denoise: 0.35
Rules:
- Consistent indentation
- Show important parameters
- Avoid hidden settings
==================================================
RULE 7 — NODE REUSE
Reused nodes referenced explicitly.
GOOD:
Load Checkpoint
outbound
(model) → KSampler BASE
(model) → KSampler REFINE
BAD:
Load Checkpoint BASE
Load Checkpoint REFINE
Reuse existing nodes.
==================================================
RULE 8 — NODE LABELS
Multiple similar nodes require labels.
GOOD:
KSampler BASE
KSampler REFINE
VAE Decode BASE
VAE Decode FINAL
BAD:
KSampler
KSampler
==================================================
RULE 9 — MASK RULES
Mask semantics written explicitly.
Example:
Load Image MASK
mask rule:
WHITE = editable
BLACK = protected
Example:
WHITE = oval interior only
BLACK = bat
BLACK = lettering
BLACK = mud
BLACK = border
Never assume mask meaning.
==================================================
RULE 10 — CONDITIONING PATHS
Positive and negative conditioning shown completely.
Example:
CLIP Text Encode POSITIVE
text:
"muddy rallycross bat"
CLIP Text Encode NEGATIVE
text:
"extra limbs blur"
KSampler
(positive) ← CLIP POSITIVE
(negative) ← CLIP NEGATIVE
No hidden conditioning.
==================================================
RULE 11 — CONTROLNET PATHS
Preprocessors must be shown.
Example:
Load Image
outbound
(image)
↓
Canny Edge Preprocessor
outbound
(image)
↓
Apply Advanced ControlNet
(control_net)
(image)
(positive)
(negative)
==================================================
RULE 12 — VAE PATHS REQUIRED
Always show latent transitions.
Required structure:
Load Image
↓
VAE Encode
↓
KSampler
↓
VAE Decode
Do not omit VAE nodes.
==================================================
RULE 13 — COMPOSITE OPERATIONS
Composite operations require all inputs shown.
Example:
Image Composite Masked
(source)
(destination)
(mask)
==================================================
RULE 14 — NO HIDDEN ASSUMPTIONS
If reconstruction requires guessing:
Notation incomplete.
Show:
seed
cfg
steps
scheduler
sampler
denoise
mask blur
resize scale
model source
vae source
No assumptions.
==================================================
RULE 15 — VARIABLE LOCKING
Workflow debugging principle:
LOCK EVERYTHING
CHANGE ONLY X
CFG testing:
LOCK:
seed
steps
model
sampler
prompt
CHANGE:
cfg
Logo editing:
LOCK:
bat
text
mud
border
CHANGE:
oval gray
IPAdapter tuning:
LOCK:
weight
CHANGE:
noise
==================================================
RULE 16 — ENGINEERING STANDARD
Workflow notation should read like:
- electrical schematic
- wiring diagram
- engineering drawing
Goal:
Someone unfamiliar with workflow reconstructs it exactly.
If guessing required:
Notation incomplete.
Here is the default ComfyUI workflow shown in this notation format:
===== DEFAULT COMFYUI WORKFLOW =====
# ===== DEFAULT COMFYUI WORKFLOW =====
Load Checkpoint (#4) (model)
checkpoint:
Juggernaut_X_RunDiffusion.safetensors
outbound
(model) → KSampler (#3) (model)
(clip) → CLIP Text Encode POSITIVE (#6) (clip)
(clip) → CLIP Text Encode NEGATIVE (#7) (clip)
(vae) → VAE Decode (#8) (vae)
CLIP Text Encode POSITIVE (#6) (clip)
(clip) ← Load Checkpoint (#4) (clip)
text: "beautiful scenery nature glass bottle landscape,
purple galaxy bottle,"
outbound
(conditioning)
↓
CLIP Text Encode NEGATIVE (#7) (clip)
(clip) ← Load Checkpoint (#4) (clip)
text: "text, watermark"
outbound
(conditioning)
↓
Empty Latent Image (#5) (latent)
width: 512
height: 512
batch_size: 1
outbound
(latent)
↓
KSampler (#3) (latent_image)
(model) ← Load Checkpoint (#4) (model)
(positive) ← CLIP Text Encode POSITIVE (#6) (conditioning)
(negative) ← CLIP Text Encode NEGATIVE (#7) (conditioning)
(latent_image) ← Empty Latent Image (#5) (latent)
seed: 156680208700286
control_after_generate: randomize
steps: 20
cfg: 8.0
sampler_name: euler
scheduler: normal
denoise: 1.00
outbound
(latent)
↓
VAE Decode (#8) (samples)
(vae) ← Load Checkpoint (#4) (vae)
inbound
(samples) ← KSampler (#3) (latent)
outbound
(image)
↓
Save Image (#9) (images)
filename_prefix: ComfyUI
inbound
(images) ← VAE Decode (#8) (image)
