Property (CCN)
A named value you set once and read anywhere
- value
- trigger
- value
- trigger_out
ComfyUI has primitives for holding a single value, but nothing native for naming a value and retrieving it anywhere else in the graph - which is the first thing you want when the same number or string needs to live in five places. Property (CCN) is that missing variable: a named store where you set a value once under a name, and any other Property node with the same name reads it back, regardless of where it sits in the workflow.
The clever part is that it's one node doing both jobs, distinguished by whether the value input is wired:
- Connect
value→ SETTER mode. The node stores whatever you passed undernameand passes the value through. - Leave
valuedisconnected → GETTER mode. It looks upnameand outputs the stored value.
So one node, two personalities, and the type is * (ANY), meaning it stores models, latents, images, strings, tensors - anything ComfyUI can pass down a wire. That's rare and genuinely useful: most "variable" utilities are string-only.
The knobs that matter
- name - the key. Setter and getter must match exactly.
- session_scope - off = workflow scope, cleared every queue run; on = session scope, persists until ComfyUI restarts. The default is per-run, which is usually what you want for "hold this seed for this run."
- error_if_missing - off = a getter that runs before its setter returns
Noneand the graph keeps going; on = it raises with a helpful message (the strict mode that catches name typos). - trigger - wire a setter's
trigger_outinto a getter'striggerto guarantee the setter ran first. This is the fix for the classic ordering problem.
Outputs are value and trigger_out, both ANY. There's also a genuinely thoughtful touch: if a node has no inputs and nothing downstream reads its outputs, it goes dormant and does nothing - so you can park setters in a workspace without them firing.
Install
Part of ComfyCollectorNodes, one install:
cd ComfyUI/custom_nodes
git clone https://github.com/valkymaera/ComfyCollectorNodes
then restart, or install via ComfyUI Manager ("ComfyCollectorNodes"). No models, no extra deps.
Where people get burned
Execution order is the whole ballgame. On the first run, a getter can execute before its setter (ComfyUI's graph order isn't "top to bottom"), so you get None - or an error if you enabled strict mode. The pattern that fixes it: wire the setter's trigger_out into the getter's trigger. That forces ordering without touching the data flow. Second, scope: workflow scope clears every queue run, so if you set something in run one expecting it in run three, it's gone - flip session_scope on for that. And remember matching name exactly; the whole system is one typo away from silently returning None.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| name | STRING | my_var | Variable name. Setter and getter must use the same name. |
| session_scope | BOOLEAN | false | OFF = cleared each workflow run. ON = persists until ComfyUI restarts. |
| error_if_missing | BOOLEAN | false | OFF = output None and keep running when the value doesn't exist yet (e.g. a getter runs before its setter on the first execution). ON = raise an error instead (strict; useful for catching name typos between setter and getter). |
| debug | BOOLEAN | false | Print store operations to console. |
| valueopt | * | Connect to STORE the value. Leave disconnected to GET the stored value. | |
| triggeropt | * | Execution-order dependency. Wire from a setter's trigger_out to ensure it runs before this getter. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| value | * | — |
| trigger_out | * | — |