🧬 XS · DARE TIES Model Stack
Building the stack that feeds a DARE TIES merge
- model_stack
- profile_1
- profile_2
- profile_3
- model_stack
The DARE TIES Model Stack is the boring middle of the pack, and it's supposed to be. It doesn't load a single checkpoint and it doesn't merge anything - it just builds the shopping list of child checkpoints, their weights, and their per-block curves that DARE TIES Merge Models then consumes. Think of it as writing down who's in the blend before anyone starts cooking. If you're new to merging, this is also the least intimidating place to start, because nothing here can blow up your GPU.
How it works
The node gives you three slots. Each slot has four widgets:
- ckpt_name_N - the child checkpoint, picked from everything in
models/checkpoints. Set to "None" to skip the slot. - model_weight_N - how much this child's delta counts in the model merge. These are pre-normalization weights: with
normalize_model_weightson in the Apply node (the default), all weights are rescaled to sum to 1.0. So 1.0 and 1.0 means two equal children; 2.0 and 1.0 means the first pulls twice as hard. It's a ratio, not an absolute. - clip_weight_N - the same idea for the text-encoder delta. Only used if you turn
merge_clipon in Apply, which you probably shouldn't (SDXL CLIPs hate being merged). - enabled_N - a switch to mute a slot without deleting your settings.
The output is a DARE_TIES_MODEL_STACK list. The genuinely useful bit is that it's chainable: feed one stack node's output into the next node's model_stack input and the entries get prepended, so three-slot nodes chain into 3/6/9/12+ children. You don't need a special "9 child" variant - just stack the stacks.
Slots that are disabled, set to "None", or have both weights at zero are dropped from the list entirely. Everything else passes through with its name, weights, and any profile attached.
Wiring it up
The model_stack output has exactly two legal destinations in this pack: the model_stack input of DARE TIES Merge Models, and the model_stack input of the Stack Visualizer (which is free to hang off the same wire - perfect for previewing before a long merge).
Per-slot, there are optional profile_1/2/3 inputs. Plug a DARE TIES Profile node's output into profile_1 and that child's delta gets multiplied block-by-block across the 21 UNet blocks - e.g. a "transfer style only" curve so a child only affects style and color, not composition. No profile = flat 1.0 everywhere, which is exactly what the Apply node assumes.
Install
Via ComfyUI Manager, search "ComfyUI XS DARE TIES", or:
cd ComfyUI/custom_nodes
git clone https://github.com/x-stride/ComfyUI_XS_DARE_TIES
Restart ComfyUI. There's no requirements.txt and no model to download - the pack needs nothing beyond ComfyUI's own torch/numpy/Pillow. Your only job is having the child checkpoints on disk in models/checkpoints. Find the node under Advanced → model_merging → dare_ties.
The gotchas worth knowing
- Order matters - but only downstream. The stack node itself is dumb list-building; it faithfully preserves order. The Apply node then binds DARE masks to slot index and runs TIES sign elections over the list, so reordering children genuinely changes a
dare_delta/ties_deltamerge. If you reshuffle and the output shifts, that's the math working as documented, not a bug. - Weights are ratios, not absolutes. Two children both at 1.0 with normalization on is a 50/50 blend, not "full strength each." To push a child harder than an equal share, raise its weight or drop
normalize_model_weightsin Apply. - Nothing loads here. If you wire this straight into a KSampler expecting a model, you'll get a type error and a confused afternoon. It's the children list, not the merge - the Apply node is the only place checkpoints actually load.
A beginner's start
Put your base in a Checkpoint Loader → reference inputs of Apply. In the stack, add two children you already like at weight 1.0 each. Run the Stack Visualizer first to see the blend, then hit Apply with merge_mode=dare_ties_delta, drop_rate=0.10, ties_density=0.50. Two children, equal shares, and the recommended recipe is the whole tutorial - the stack node was the easy part.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| ckpt_name_1 | COMBO | Child checkpoint to mix into the reference. Set to 'None' to skip this slot. | |
| model_weight_1 | FLOAT | 1.000–10 | Pre-normalization weight for this child. With normalize_*_weights=True in the Apply node, weights are rescaled so they sum to 1 across all stack entries. |
| clip_weight_1 | FLOAT | 1.000–10 | Pre-normalization weight for this child's CLIP/text-encoder delta. Only used when merge_clip is not 'off' in the Apply node. |
| enabled_1 | BOOLEAN | true | Disable to skip this slot without changing its values. Disabled slots contribute nothing to the merge. |
| ckpt_name_2 | COMBO | Child checkpoint to mix into the reference. Set to 'None' to skip this slot. | |
| model_weight_2 | FLOAT | 1.000–10 | Pre-normalization weight for this child. With normalize_*_weights=True in the Apply node, weights are rescaled so they sum to 1 across all stack entries. |
| clip_weight_2 | FLOAT | 1.000–10 | Pre-normalization weight for this child's CLIP/text-encoder delta. Only used when merge_clip is not 'off' in the Apply node. |
| enabled_2 | BOOLEAN | true | Disable to skip this slot without changing its values. Disabled slots contribute nothing to the merge. |
| ckpt_name_3 | COMBO | Child checkpoint to mix into the reference. Set to 'None' to skip this slot. | |
| model_weight_3 | FLOAT | 1.000–10 | Pre-normalization weight for this child. With normalize_*_weights=True in the Apply node, weights are rescaled so they sum to 1 across all stack entries. |
| clip_weight_3 | FLOAT | 1.000–10 | Pre-normalization weight for this child's CLIP/text-encoder delta. Only used when merge_clip is not 'off' in the Apply node. |
| enabled_3 | BOOLEAN | true | Disable to skip this slot without changing its values. Disabled slots contribute nothing to the merge. |
| model_stackopt | DARE_TIES_MODEL_STACK | Optional upstream stack to extend. Entries from this input come first in the output list. | |
| profile_1opt | DARE_TIES_PROFILE | Optional UNet block curve for slot 1 (21 samples). Multiplies that child's delta per block. | |
| profile_2opt | DARE_TIES_PROFILE | Optional UNet block curve for slot 2. | |
| profile_3opt | DARE_TIES_PROFILE | Optional UNet block curve for slot 3. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model_stack | DARE_TIES_MODEL_STACK | List of child checkpoints with model_weight, clip_weight, and optional profile for UNet shaping. |