SAX Primitive Store
One place for every number in your workflow — SAX Primitive Store
- out_0
- out_1
- out_2
- out_3
- out_4
- out_5
- out_6
- out_7
- out_8
- out_9
- out_10
- out_11
- out_12
- out_13
- out_14
- out_15
- out_16
- out_17
- out_18
- out_19
- out_20
- out_21
- out_22
- out_23
- out_24
- out_25
- out_26
- out_27
- out_28
- out_29
- out_30
- out_31
SAX Primitive Store is a glorified shelf for your workflow's numbers - and that's a good thing. Instead of typing the same seed into three samplers, the same CFG into two, and the same width into a crop node, you define each value once here and fan it out. Every item you add becomes its own output slot, so changing a number in one place updates every consumer. This is the "one source, many consumers" pattern from the plumbing layer, packaged as a single node with a decent editor instead of five loose primitive nodes.
The difference from plain ComfyUI primitives is the SEED type. This node treats a seed as a first-class citizen with a random mode, which is exactly the thing you want when you're comparing runs without typing seeds by hand.
How it works
Items live in an items_json string that the UI manages for you - you don't hand-edit JSON. Each item has a type and a value: INT, FLOAT, STRING, BOOLEAN, or SEED. On execution the node parses the list, converts each value to its type, and emits it from the matching out_0 through out_31 slot (32 max). Unused slots just output None.
The clever bit is inside IS_CHANGED. When an item is a SEED set to random mode, the node returns float("NaN") from IS_CHANGED, which forces ComfyUI to re-execute it every single run - that's the engine's documented always-rerun trick, and it's what makes "give me a fresh random seed each run" work from a node that otherwise looks static. It's also the footgun: a random SEED here makes everything downstream of it rerun every time, which costs you the cache and can slow a big workflow.
The inputs that matter
items_json- the only real input, and you barely touch it directly; the node UI turns it into a proper editor with drag-to-change ints and float sliders.- Outputs:
out_0…out_31, all*-typed, each wired to the nodes that need that value.
When you'd use it
Any workflow where the same value appears twice. The classic one is a seed shared by a KSampler and a filename template; the SAX-flavored one is a shared steps/cfg that both a main sampler and a detailer read, so you tune generation settings in one spot. If a value genuinely belongs to only one node, don't bother - the store adds a hop for no benefit.
Installing it
It ships in the SAX_Bridge pack. ComfyUI Manager → "Install via Git URL" → https://github.com/so16tm/SAX_Bridge, or:
cd ComfyUI/custom_nodes
git clone https://github.com/so16tm/SAX_Bridge
Restart, and it's under SAX/Bridge/Utility. No dependencies beyond ComfyUI.
Gotchas
Renaming isn't supported - the docs say to delete and re-add an item to rename it, and that breaks any wires attached to the old slot. Budget for that. And keep an eye on the random-seed rerun cost: if a workflow suddenly feels slower, a SEED in random mode is usually the culprit, poisoning the cache for everything downstream.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| items_jsonopt | STRING | [] | — |
Outputs (32)
| Name | Type | Description |
|---|---|---|
| out_0 | * | — |
| out_1 | * | — |
| out_2 | * | — |
| out_3 | * | — |
| out_4 | * | — |
| out_5 | * | — |
| out_6 | * | — |
| out_7 | * | — |
| out_8 | * | — |
| out_9 | * | — |
| out_10 | * | — |
| out_11 | * | — |
| out_12 | * | — |
| out_13 | * | — |
| out_14 | * | — |
| out_15 | * | — |
| out_16 | * | — |
| out_17 | * | — |
| out_18 | * | — |
| out_19 | * | — |
| out_20 | * | — |
| out_21 | * | — |
| out_22 | * | — |
| out_23 | * | — |
| out_24 | * | — |
| out_25 | * | — |
| out_26 | * | — |
| out_27 | * | — |
| out_28 | * | — |
| out_29 | * | — |
| out_30 | * | — |
| out_31 | * | — |