New: Earn 20% as an AgentAlley affiliate. Share your link and earn on every sale you refer. Join now New: Earn 20% as an affiliate. Join now

Configure and author rgthree-comfy nodes

by artokun · MIT license · ★ 759 on GitHub · updated Sep 21

Rgthree comfy cover

Configure and author rgthree-comfy nodes — Fast Groups Bypasser/Muter (group toggles), Power Lora Loader, Context/Context Big, Seed, Any Switch. Use when a workflow contains rgthree nodes, when asked to add stage/section toggles or an…

---
name: rgthree
description: Configure and author rgthree-comfy nodes — Fast Groups Bypasser/Muter (group toggles), Power Lora Loader, Context/Context Big, Seed, Any Switch. Use when a workflow contains rgthree nodes, when asked to add stage/section toggles or an A/B switch, when stacking LoRAs, or when an rgthree node needs configuring. Covers the frontend-only nodes that are absent from /object_info and the properties-not-widgets configuration model.
---

# rgthree-comfy

`rgthree-comfy` is one of the most widely installed packs, so its nodes turn up in a
large share of community workflows. Three of its properties make it a recurring
agent-failure mode — all three fail *quietly enough* to look like success.

## The three things that catch agents out

**1. Some rgthree nodes are FRONTEND-ONLY.** They are registered by the pack's JS
(`registerCustomNodes()`), have no Python class, and are therefore **absent from
`/object_info` by design**. Checking `/object_info` and concluding "this node doesn't
exist" is wrong. `/object_info` lists 24 rgthree *backend* types; the toggles are not
among them.

Overview

rgthree-comfy is one of the most widely installed packs, so its nodes turn up in a large share of community workflows. Three of its properties make it a recurring agent-failure mode — all three fail quietly enough to look like success.

Manual install (npx, ZIP)
Claude Codenpx skills add artokun/comfyui-mcp --skill rgthree -g -a claude-code
Claude Code (degit)npx degit artokun/comfyui-mcp/plugin/skills/rgthree#main ~/.claude/skills/rgthree
Claude.ai / desktopZip the folder and upload it under Settings → Capabilities → Skills.
Codex, Cursor, other agentsPoint them at SKILL.md. The other files are plain text.

Connects with Agent Alley MCP · agentalley.io/mcp

Files included

  • SKILL.md12.9 KB
Read SKILL.md here
artokun/main1 file shown
SKILL.md
Show the full text222 lines

rgthree-comfy

rgthree-comfy is one of the most widely installed packs, so its nodes turn up in a large share of community workflows. Three of its properties make it a recurring agent-failure mode — all three fail quietly enough to look like success.

The three things that catch agents out

1. Some rgthree nodes are FRONTEND-ONLY. They are registered by the pack's JS (registerCustomNodes()), have no Python class, and are therefore absent from /object_info by design. Checking /object_info and concluding "this node doesn't exist" is wrong. /object_info lists 24 rgthree backend types; the toggles are not among them.

2. They are configured through PROPERTIES, not widgets. matchTitle, toggleRestriction and sort live in node.properties (right-click → Properties), not in widgets. Use panel_set_property. panel_set_widget does not silently half-work — it refuses, with has no widget "matchTitle" (available: …) listing the widgets that do exist. That refusal is the fastest confirmation you are on the properties path; read it rather than retrying the write.

3. Fast Groups nodes take NO wiring and enumerate GROUPS by title. Leave the OPT_CONNECTION output unconnected. The node renders one toggle per matching group, so the groups must exist and be named before the node is useful.

Which rgthree nodes panel_add_node will actually add

The panel authorizes every add against fresh /object_info and fails closed on a type it cannot find. Genuinely frontend-only types are exempt only via an explicit allowlist (FRONTEND_ONLY_NODE_TYPES), so the exemption covers seven rgthree types and no others:

Frontend-only, panel_add_node WORKS Frontend-only, panel_add_node REFUSES
Fast Groups Bypasser (rgthree) Bookmark (rgthree)
Fast Groups Muter (rgthree) Mute / Bypass Relay (rgthree)
Fast Bypasser (rgthree) Mute / Bypass Repeater (rgthree)
Fast Muter (rgthree) Fast Actions Button (rgthree)
Node Collector (rgthree) Random Unmuter (rgthree)
Label (rgthree)
Reroute (rgthree)

A refusal in the right-hand column is the guard working as designed, not a broken pack and not something to work around — the node has no backend def and is not on the allowlist. Say so and pick a different approach (the Bypasser/Muter cover almost every real toggle need). Everything with a Python class — Power Lora Loader, Context*, Seed, Any Switch, Power Prompt, Image Comparer — is a normal backend node and adds normally.

Fast Groups Bypasser / Muter

Fast Groups Bypasser (rgthree) sets the nodes of a group to bypass (mode 4 — the node is skipped and its input passes through). Fast Groups Muter (rgthree) sets them to mute (mode 2 — the node does not execute and everything downstream dies). Prefer the Bypasser for toggling an optional stage inside a chain; reach for the Muter only when you genuinely want to stop a branch.

All of the following are node properties — set them with panel_set_property:

Property Values Default Notes
matchTitle regex, case-insensitive "" Set this. Empty means every group in the workflow becomes a toggle. It is a real regex matched unanchored against the group title, so anchor it (^STAGE) or it matches mid-title.
matchColors comma-separated colors "" Alternative filter; pairs with a color convention.
toggleRestriction default / max one / always one default Both non-default values enforce mutual exclusion (they are matched on the substring " one"). Do NOT set either if the user may ever want all stages on in one queue.
sort position / alphanumeric / custom alphabet position The default means moving a group on the canvas silently reorders the toggles. alphanumeric is stable — prefer it.
customSortAlphabet string "" Only read when sort is custom alphabet.
showNav bool true Per-row jump-to-group arrow.
showAllGraphs bool true Include groups that live inside subgraphs.
matchTitle does not rebuild the toggle list on the first write

panel_set_property stores matchTitle (and matchColors / sort / …) and the reply from/to is truthful. Fast Groups nodes do not implement onPropertyChanged. The toggle list is rebuilt by rgthree's refreshWidgets() on a service tick (~8 ms after add, then every ~500 ms), and leftover-row removal increments the index while splicing — a 22-group list can stall at 13 with non-matching Enable … rows still present. A never-drawn node can also come back as widgets:{} — that means the list has not been built yet, not that there are no matching groups. panel_query_graph also keys widgets by name, and every toggle is named RGTHREE_TOGGLE_AND_NAV, so a built list collapses to one key.

Do this:

  1. Set matchTitle immediately after panel_add_node (before the first unfiltered refresh paints every group).
  2. Re-read with panel_query_graph {ids:[<id>], fields:'detail'}.
  3. If widgets is empty or the canvas still shows Enable rows that do not match the regex, set matchTitle again. Do not delete and re-add the node — that is slower and still needs a second set.
Recipe — make pipeline stages toggleable
  1. panel_create_group per stage, with a prefixed title (STAGE 1 — …) so one anchored regex selects exactly the intended set.

  2. Verify group membership before you trust it. Group membership is purely geometric: LiteGraph counts a node as a member when its centre falls inside the box, and the auto-fit box around your node_ids will happily swallow unrelated neighbours. When the live members differ from what you asked for, the result carries extra_node_ids, missing_node_ids and a warning alongside requested_node_ids — read them. (They appear only when you passed node_ids and something differs, so their absence is a real all-clear.)

    A stray node here is not cosmetic: toggling one stage will disable part of another. To fix it, move the nodes apart (panel_edit_node, or panel_auto_layout) so the regions are contiguous, or set an explicit bounds with panel_edit_group — then re-check. panel_move_group does not help: by default it drags the contained nodes along with the box, so the same nodes stay inside it.

  3. panel_add_node(class_type="Fast Groups Bypasser (rgthree)"). Leave its output unwired. Add nodes one at a time, not as a parallel batch.

  4. panel_set_property → matchTitle = ^STAGE, and sort = alphanumeric. Set them immediately after the add, then re-read the node. If widgets is empty or leftover Enable rows remain, set matchTitle again — do not delete and re-add.

  5. Toggle, then verify with panel_graph_outline — it tags nodes [bypass] / [mute].

Power Lora Loader (rgthree)

A backend node (present in /object_info) that stacks N LoRAs in one node. Each row is a widget named lora_1, lora_2, … whose value is a composite object {on: bool, lora: "subdir\\name.safetensors", strength: float, strengthTwo: float|null} (strengthTwo is the separate CLIP strength, null in the simple view). Rows are identified by the presence of a lora key, and the node's control widgets are appended after them, so do not index positionally — address the row by name.

Rows CAN be created programmatically. A freshly added Power Lora Loader has no lora_N widgets at all — the on-canvas "➕ Add Lora" button opens a chooser on a mouse event that no panel tool can press, but panel_set_widget does not need it: writing lora_1 (then lora_2, …) with a JSON object STRING creates the row and the reply carries created_widget: "lora_1". Create rows in order, one call each:

panel_set_widget(node_id=<id>, widget="lora_1",
  value='{"on":true,"lora":"subdir/turbo.safetensors","strength":1,"strengthTwo":null}')

# A Windows subdir separator is a JSON escape — write it DOUBLED in the string:
#   "lora":"Anima\\Tools\\turbo.safetensors"

Re-read with panel_query_graph {ids:[<id>], fields:'detail'} to confirm the row landed. If you need a stack from scratch, create lora_1, then lora_2, and so on; do not assume a skipped number is the next row.

On an existing row, write ONE field with dotted sub-field addressing — it merges onto the current object and preserves every other field:

panel_set_widget(node_id=<id>, widget="lora_1.strength", value=0.8)
panel_set_widget(node_id=<id>, widget="lora_2.on",       value=false)
panel_set_widget(node_id=<id>, widget="lora_1.lora",     value="style/foo.safetensors")

Writing a bare scalar to lora_1 itself is the trap: it would set one field and null the rest, so it is refused. To change several fields at once, pass a JSON object STRING (the value argument accepts only string/number/boolean, so a literal object fails tool validation before any write) — it is parsed and merged:

panel_set_widget(node_id=<id>, widget="lora_1", value='{"on":false,"strength":0.6}')

Fields are schema-checked: on non-nullable boolean, strength non-nullable number, lora nullable string, strengthTwo nullable number. An unknown field name (a typo like lora_1.strenght) is refused, not silently created, and nested paths are unsupported.

Clearing a nullable field takes the JSON-string form, not a dotted write. The panel accepts null for lora / strengthTwo, but value is typed string | number | boolean, so a bare value=null is rejected by tool-arg validation before any write happens — the same schema limit as the whole-row case above. Clear it through the string:

panel_set_widget(node_id=<id>, widget="lora_1", value='{"lora":null}')

Turning a LoRA off (lora_N.on = false) is usually safer than clearing it anyway.

Other commonly-seen rgthree nodes

  • Context / Context Big / Context Switch / Context Merge — bundle MODEL/CLIP/VAE/conditioning into one RGTHREE_CONTEXT wire. These are NOT virtual wiring. Unlike Get/Set buses they are real executable backend nodes, so panel_strip_workflow and panel_flatten_workflow deliberately keep them — they run. Do not expect either tool to dissolve a Context chain. There is no hidden edge to resolve: every link is a real link, traceable with panel_query_graph. What a Context hides is which field a downstream node pulls out of the bundle, so read the chain node by node. (panel_slice_workflow still carves one pipeline out of a toggled monolith, and panel_strip_workflow still resolves any genuine Get/Set buses and Reroutes around it.)
  • Seed (rgthree) — it deletes the built-in control_after_generate widget on creation, so do not try to write it; the widget is not there. Control is by SPECIAL SEED VALUES written to the seed widget instead: -1 randomize, -2 increment, -3 decrement. Any concrete seed is returned unchanged — 42 stays 42 every run — so to pin a run, write the number; to re-randomize, write -1. The frontend resolves a special value into a real seed before queueing and shows the result in a read-only last_seed widget, so a seed re-read after a run may not be the special value the user set (a fixed seed, however, is stable).
  • Any Switch (rgthree) — the first non-null input wins; a common A/B toggle paired with bypassed branches. An empty Context counts as null, so an unfilled Context branch is skipped rather than selected.

Gotchas

  • A bypassed node is skipped and passes its input through; a muted node kills everything downstream. Choosing the Muter where the Bypasser was meant breaks the chain rather than shortening it.
  • Always panel_graph_outline before a run — a stale toggle is a top cause of a wrong render, and the outline marks [bypass] / [mute] explicitly.
  • rgthree's Bookmark nodes respond to keypresses and are inert to agents.

Sources

  • Official: https://github.com/rgthree/rgthree-comfy
  • Empirical: frontend-only allowlist and properties-not-widgets notes verified against the installed pack and the panel guard. #1808 matchTitle rebuild: Fast Groups have no onPropertyChanged; refreshWidgets() leftover removal is removeWidget(index++) in fast_groups_muter.ts; first unfiltered tick is scheduled from addFastGroupNode in fast_groups_service.ts.
1---
2name: rgthree
3description: Configure and author rgthree-comfy nodes — Fast Groups Bypasser/Muter (group toggles), Power Lora Loader, Context/Context Big, Seed, Any Switch. Use when a workflow contains rgthree nodes, when asked to add stage/section toggles or an A/B switch, when stacking LoRAs, or when an rgthree node needs configuring. Covers the frontend-only nodes that are absent from /object_info and the properties-not-widgets configuration model.
4---
5 
6# rgthree-comfy
7 
8`rgthree-comfy` is one of the most widely installed packs, so its nodes turn up in a
9large share of community workflows. Three of its properties make it a recurring
10agent-failure mode — all three fail *quietly enough* to look like success.
11 
12## The three things that catch agents out
13 
14**1. Some rgthree nodes are FRONTEND-ONLY.** They are registered by the pack's JS
15(`registerCustomNodes()`), have no Python class, and are therefore **absent from
16`/object_info` by design**. Checking `/object_info` and concluding "this node doesn't
17exist" is wrong. `/object_info` lists 24 rgthree *backend* types; the toggles are not
18among them.
19 
20**2. They are configured through PROPERTIES, not widgets.** `matchTitle`,
21`toggleRestriction` and `sort` live in `node.properties` (right-click → Properties),
22not in `widgets`. Use **`panel_set_property`**. `panel_set_widget` does not silently
23half-work — it **refuses**, with `has no widget "matchTitle" (available: …)` listing
24the widgets that do exist. That refusal is the fastest confirmation you are on the
25properties path; read it rather than retrying the write.
26 
27**3. Fast Groups nodes take NO wiring and enumerate GROUPS by title.** Leave the
28`OPT_CONNECTION` output unconnected. The node renders one toggle per matching group,
29so **the groups must exist and be named before the node is useful**.
30 
31## Which rgthree nodes `panel_add_node` will actually add
32 
33The panel authorizes every add against fresh `/object_info` and **fails closed** on a
34type it cannot find. Genuinely frontend-only types are exempt only via an explicit
35allowlist (`FRONTEND_ONLY_NODE_TYPES`), so the exemption covers **seven** rgthree
36types and no others:
37 
38| Frontend-only, `panel_add_node` WORKS | Frontend-only, `panel_add_node` REFUSES |
39|---|---|
40| `Fast Groups Bypasser (rgthree)` | `Bookmark (rgthree)` |
41| `Fast Groups Muter (rgthree)` | `Mute / Bypass Relay (rgthree)` |
42| `Fast Bypasser (rgthree)` | `Mute / Bypass Repeater (rgthree)` |
43| `Fast Muter (rgthree)` | `Fast Actions Button (rgthree)` |
44| `Node Collector (rgthree)` | `Random Unmuter (rgthree)` |
45| `Label (rgthree)` | |
46| `Reroute (rgthree)` | |
47 
48A refusal in the right-hand column is the guard working as designed, **not** a broken
49pack and not something to work around — the node has no backend def and is not on the
50allowlist. Say so and pick a different approach (the Bypasser/Muter cover almost every
51real toggle need). Everything with a Python class — Power Lora Loader, Context*, Seed,
52Any Switch, Power Prompt, Image Comparer — is a normal backend node and adds normally.
53 
54## Fast Groups Bypasser / Muter
55 
56`Fast Groups Bypasser (rgthree)` sets the nodes of a group to **bypass** (mode `4` —
57the node is skipped and its input passes through). `Fast Groups Muter (rgthree)` sets
58them to **mute** (mode `2` — the node does not execute and everything downstream
59dies). **Prefer the Bypasser** for toggling an optional stage inside a chain; reach
60for the Muter only when you genuinely want to stop a branch.
61 
62All of the following are node properties — set them with `panel_set_property`:
63 
64| Property | Values | Default | Notes |
65|---|---|---|---|
66| `matchTitle` | regex, case-insensitive | `""` | **Set this.** Empty means every group in the workflow becomes a toggle. It is a real regex matched *unanchored* against the group title, so anchor it (`^STAGE`) or it matches mid-title. |
67| `matchColors` | comma-separated colors | `""` | Alternative filter; pairs with a color convention. |
68| `toggleRestriction` | `default` / `max one` / `always one` | `default` | Both non-default values enforce mutual exclusion (they are matched on the substring `" one"`). Do NOT set either if the user may ever want all stages on in one queue. |
69| `sort` | `position` / `alphanumeric` / `custom alphabet` | `position` | The default means **moving a group on the canvas silently reorders the toggles**. `alphanumeric` is stable — prefer it. |
70| `customSortAlphabet` | string | `""` | Only read when `sort` is `custom alphabet`. |
71| `showNav` | bool | `true` | Per-row jump-to-group arrow. |
72| `showAllGraphs` | bool | `true` | Include groups that live inside subgraphs. |
73 
74### matchTitle does not rebuild the toggle list on the first write
75 
76`panel_set_property` stores `matchTitle` (and `matchColors` / `sort` / …) and
77the reply `from`/`to` is truthful. Fast Groups nodes **do not implement
78`onPropertyChanged`**. The toggle list is rebuilt by rgthree's
79`refreshWidgets()` on a service tick (~8 ms after add, then every ~500 ms),
80and leftover-row removal increments the index while splicing — a 22-group
81list can stall at 13 with non-matching `Enable …` rows still present. A
82never-drawn node can also come back as `widgets:{}` — that means the list
83has **not been built yet**, not that there are no matching groups.
84`panel_query_graph` also keys widgets by name, and every toggle is named
85`RGTHREE_TOGGLE_AND_NAV`, so a built list collapses to one key.
86 
87**Do this:**
88 
891. Set `matchTitle` **immediately** after `panel_add_node` (before the first
90 unfiltered refresh paints every group).
912. Re-read with `panel_query_graph {ids:[<id>], fields:'detail'}`.
923. If `widgets` is empty **or** the canvas still shows `Enable` rows that do
93 not match the regex, **set `matchTitle` again**. Do **not** delete and
94 re-add the node — that is slower and still needs a second set.
95 
96### Recipe — make pipeline stages toggleable
97 
981. `panel_create_group` per stage, with a **prefixed title** (`STAGE 1 — …`) so one
99 anchored regex selects exactly the intended set.
100 
1012. **Verify group membership before you trust it.** Group membership is purely
102 **geometric**: LiteGraph counts a node as a member when its *centre* falls inside
103 the box, and the auto-fit box around your `node_ids` will happily swallow unrelated
104 neighbours. When the live members differ from what you asked for, the result
105 carries `extra_node_ids`, `missing_node_ids` and a `warning` alongside
106 `requested_node_ids` — **read them**. (They appear only when you passed `node_ids`
107 *and* something differs, so their absence is a real all-clear.)
108 
109 A stray node here is not cosmetic: toggling one stage will disable part of another.
110 To fix it, **move the nodes apart** (`panel_edit_node`, or `panel_auto_layout`) so
111 the regions are contiguous, or set an explicit `bounds` with `panel_edit_group` —
112 then re-check. `panel_move_group` does **not** help: by default it drags the
113 contained nodes along with the box, so the same nodes stay inside it.
114 
1153. `panel_add_node(class_type="Fast Groups Bypasser (rgthree)")`. Leave its output
116 unwired. Add nodes one at a time, not as a parallel batch.
117 
1184. `panel_set_property` → `matchTitle` = `^STAGE`, and `sort` = `alphanumeric`.
119 Set them immediately after the add, then re-read the node. If `widgets` is
120 empty or leftover `Enable` rows remain, set `matchTitle` again — do not
121 delete and re-add.
122 
1235. Toggle, then verify with `panel_graph_outline` — it tags nodes `[bypass]` / `[mute]`.
124 
125## Power Lora Loader (rgthree)
126 
127A **backend** node (present in `/object_info`) that stacks N LoRAs in one node. Each row
128is a widget named **`lora_1`, `lora_2`, …** whose value is a composite object
129`{on: bool, lora: "subdir\\name.safetensors", strength: float, strengthTwo: float|null}`
130(`strengthTwo` is the separate CLIP strength, `null` in the simple view). Rows are
131identified by the **presence of a `lora` key**, and the node's control widgets are
132appended *after* them, so do not index positionally — **address the row by name**.
133 
134**Rows CAN be created programmatically.** A freshly added Power Lora Loader has
135**no `lora_N` widgets at all** — the on-canvas "➕ Add Lora" button opens a chooser on a
136mouse event that no panel tool can press, but `panel_set_widget` does not need it:
137writing `lora_1` (then `lora_2`, …) with a **JSON object STRING** creates the row and
138the reply carries `created_widget: "lora_1"`. Create rows **in order**, one call each:
139 
140```
141panel_set_widget(node_id=<id>, widget="lora_1",
142 value='{"on":true,"lora":"subdir/turbo.safetensors","strength":1,"strengthTwo":null}')
143 
144# A Windows subdir separator is a JSON escape — write it DOUBLED in the string:
145# "lora":"Anima\\Tools\\turbo.safetensors"
146```
147 
148Re-read with `panel_query_graph {ids:[<id>], fields:'detail'}` to confirm the row
149landed. If you need a stack from scratch, create `lora_1`, then `lora_2`, and so on;
150do not assume a skipped number is the next row.
151 
152On an existing row, write ONE field with **dotted sub-field addressing** — it merges
153onto the current object and preserves every other field:
154 
155```
156panel_set_widget(node_id=<id>, widget="lora_1.strength", value=0.8)
157panel_set_widget(node_id=<id>, widget="lora_2.on", value=false)
158panel_set_widget(node_id=<id>, widget="lora_1.lora", value="style/foo.safetensors")
159```
160 
161Writing a **bare scalar to `lora_1` itself** is the trap: it would set one field and
162null the rest, so it is refused. To change several fields at once, pass a **JSON
163object STRING** (the `value` argument accepts only string/number/boolean, so a literal
164object fails tool validation before any write) — it is parsed and merged:
165 
166```
167panel_set_widget(node_id=<id>, widget="lora_1", value='{"on":false,"strength":0.6}')
168```
169 
170Fields are schema-checked: `on` non-nullable boolean, `strength` non-nullable number,
171`lora` nullable string, `strengthTwo` nullable number. An unknown field name (a typo like
172`lora_1.strenght`) is **refused**, not silently created, and nested paths are unsupported.
173 
174**Clearing a nullable field takes the JSON-string form, not a dotted write.** The panel
175accepts `null` for `lora` / `strengthTwo`, but `value` is typed `string | number |
176boolean`, so a bare `value=null` is rejected by tool-arg validation before any write
177happens — the same schema limit as the whole-row case above. Clear it through the string:
178 
179```
180panel_set_widget(node_id=<id>, widget="lora_1", value='{"lora":null}')
181```
182 
183Turning a LoRA **off** (`lora_N.on = false`) is usually safer than clearing it anyway.
184 
185## Other commonly-seen rgthree nodes
186 
187- **Context / Context Big / Context Switch / Context Merge** — bundle
188 MODEL/CLIP/VAE/conditioning into one `RGTHREE_CONTEXT` wire. **These are NOT virtual
189 wiring.** Unlike Get/Set buses they are real executable backend nodes, so
190 `panel_strip_workflow` and `panel_flatten_workflow` deliberately **keep** them — they
191 run. Do not expect either tool to dissolve a Context chain. There is no hidden edge to
192 resolve: every link is a real link, traceable with `panel_query_graph`. What a Context
193 hides is *which field* a downstream node pulls out of the bundle, so read the chain
194 node by node. (`panel_slice_workflow` still carves one pipeline out of a toggled
195 monolith, and `panel_strip_workflow` still resolves any genuine Get/Set buses and
196 Reroutes around it.)
197- **Seed (rgthree)** — it **deletes the built-in `control_after_generate` widget** on
198 creation, so do not try to write it; the widget is not there. Control is by SPECIAL
199 SEED VALUES written to the `seed` widget instead: **`-1` randomize, `-2` increment,
200 `-3` decrement**. Any concrete seed is returned **unchanged** — `42` stays `42` every
201 run — so to pin a run, write the number; to re-randomize, write `-1`. The frontend
202 resolves a special value into a real seed *before* queueing and shows the result in a
203 read-only `last_seed` widget, so a `seed` re-read after a run may not be the special
204 value the user set (a fixed seed, however, is stable).
205- **Any Switch (rgthree)** — the first non-null input wins; a common A/B toggle paired
206 with bypassed branches. An **empty Context counts as null**, so an unfilled Context
207 branch is skipped rather than selected.
208 
209## Gotchas
210 
211- A **bypassed** node is skipped and passes its input through; a **muted** node kills
212 everything downstream. Choosing the Muter where the Bypasser was meant breaks the
213 chain rather than shortening it.
214- Always `panel_graph_outline` before a run — a stale toggle is a top cause of a wrong
215 render, and the outline marks `[bypass]` / `[mute]` explicitly.
216- rgthree's `Bookmark` nodes respond to keypresses and are inert to agents.
217 
218## Sources
219 
220- **Official:** https://github.com/rgthree/rgthree-comfy
221- **Empirical:** frontend-only allowlist and properties-not-widgets notes verified against the installed pack and the panel guard. `#1808` matchTitle rebuild: Fast Groups have no `onPropertyChanged`; `refreshWidgets()` leftover removal is `removeWidget(index++)` in `fast_groups_muter.ts`; first unfiltered tick is scheduled from `addFastGroupNode` in `fast_groups_service.ts`.
222 
View all files on GitHub →

Details

Updated
Sep 21, 2026
License
MIT
Stars on the repo
★ 759
Checked
Source
artokun/comfyui-mcp ↗
Creator
artokun · 44 listings
View creator

Similar skills

See all →
SkillReverse engineer native, managed, Electron/JavaScriptREAmorluto/rea · by morlutoReverse engineer native, managed, Electron/JavaScript, packaged, firmware, and browser targets with REA. Use shipped-artifact or requested runtime evidence to explain features, compare versions, decompile code, or guide a reconstruction. Skip REA for ordinary source-repository architecture analysis.★ 316k GitHub starsSkillBrainstorms ideas into designs before any creative workBrainstorming Ideas Into Designsobra/superpowers · by obraYou MUST use this before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation.★ 290k GitHub starsSkillRequires technical rigor and verificationCode Review Receptionobra/superpowers · by obraUse when receiving code review feedback, before implementing suggestions, especially if feedback seems unclear or technically questionable - requires technical rigor and verification, not performative agreement or blind implementation★ 290k GitHub starsSkillDiagnosis loop for hard bugs and performance regressionsDiagnosing bugsmattpocock/skills · by mattpocockDiagnosis loop for hard bugs and performance regressions. Use when the user says "diagnose"/"debug this", or reports something broken/throwing/failing/slow.★ 267k GitHub starsSkillImplement the result of /to-spec and /to-tickets in codeImplement specmattpocock/skills · by mattpocockImplement the result of /to-spec and /to-tickets in code.★ 267k GitHub starsSkillWriting a PR bodymattpocock/skills · by mattpocockUse when writing a PR body.★ 267k GitHub stars

More from artokun

SkillTrain custom LoRAs with ostris AI-ToolkitAI-Toolkit LoRA Trainer (WAN 2.2 & Z-Image)artokun/comfyui-mcp · by artokunTrain custom LoRAs with ostris AI-Toolkit. Covers WAN 2.2/2.1 (people, styles, video motion) and Z-Image (Turbo & Base, low-VRAM image LoRAs). Use when the user wants to train a WAN or Z-Image LoRA; covers local + RunPod setup, dataset prep, key params, and using the result in a ComfyUI workflow.★ 759 GitHub starsSkillAnime/illustration text-to-imageANIMA 1.0 (Anima Base Ultra) Text-to-Image Workflowsartokun/comfyui-mcp · by artokunAnime/illustration text-to-image (ANIMA 1.0, ~2B Cosmos DiT). Use for anime, manga, illustrated characters; accepts Danbooru tags + natural language; runs/trains on <6GB VRAM; includes anime inpainting via Anima-LLLite ControlNet★ 759 GitHub starsSkillAuthoring & Publishing ComfyUI Custom Nodesartokun/comfyui-mcp · by artokunAuthoring & publishing ComfyUI custom nodes to the Comfy Registry, covering node structure, pyproject.toml spec, comfy-cli publishing, and CI★ 759 GitHub starsSkillTrain a custom anime LoRA on the ANIMA base modelCitron Anima LoRA Trainerartokun/comfyui-mcp · by artokunTrain a custom anime LoRA on the ANIMA base model with Citron's local Gradio trainer (kohya sd-scripts), <6GB VRAM, character/style LoRAs; covers setup, dataset prep, training params, and using the result in the anima-base workflow★ 759 GitHub starsSkillDiscover Civitai models with the BUILT-IN downloadmodelCivitai + comfyui-mcpartokun/comfyui-mcp · by artokunDiscover Civitai models with the BUILT-IN download_model action:"search_civitai" and install/generate them locally. Find a checkpoint/LoRA/embedding on Civitai, download it into ComfyUI, and use its trigger words. Optionally pair the official Civitai MCP for community features (images browsing, posting, collections).★ 759 GitHub starsSkillDiagnose and fix video/image color OBJECTIVELYColor Correction (measure, don't eyeball)artokun/comfyui-mcp · by artokunDiagnose and fix video/image color OBJECTIVELY with the get_image (action:"analyze_color") tool (scopes/stats such as black/white points, contrast, saturation, clipping, cast) instead of eyeballing a contact sheet. Covers the "washed out" signature, why reference color-match (mkl/ColorMatch/ColorMatchAdobe) CAN'T add contrast a flat source lacks, the levels/contrast-stretch fix (core AdjustContrast / CurveEditor), the measure→fix→re-measure loop, the side-by-side sandbox pattern, and where to place the fix in a render graph (after decode, before save). Use when a render looks washed out / flat / dull / over-saturated / color-cast, or when deciding between a color-match and a contrast/levels fix.★ 759 GitHub stars