Install any skill in seconds. Free to start, no credit card required.
Get Started Free →artokun/workflow-layout
Lay out and organize a ComfyUI workflow cleanly on the live panel canvas — dependency-layered node placement with no overlaps, subgraphs, colored group boxes, and subgraph rail alignment.
Passed 14 of 16 test cases with the skill, and 5 of 16 without it.
and 10 more in the full report
12 fixed7 passed either way3 still failing0 broke
Tokens, turns and time describe resource use, not a dollar price.
One of 9 test cases the skill fixed. Same model, same prompt, with and without the skill.
After moving several nodes into subgraphs, empty group color bands from the old layout remain floating on the canvas. Which tool cleans up these orphaned group boxes?
| Checked | Without skill | With skill |
|---|---|---|
| Specifies panel_remove_group to delete unused empty group bounds. | Missed | Passed |
The instructions your model reads when the skill loads.
Turn a tangled graph into a clean left-to-right dataflow a human reads at a glance,
using the panel_* canvas tools. The golden rule: never lay out blind. Read the
real node sizes and rail positions first, then compute positions from them.
panel_query_graph {fields:'detail', limit:200, max_chars:60000}. READ FIRST, every time. Returns, for the graph you're viewing:
pos [x,y], size [w,h] (body only), and full_height (the
TRUE rendered footprint = title bar + body; use this for vertical stacking),groups (id, title, color, bounding [x,y,w,h]),rails: the input / output boundary
node positions. Everything below is computed from these numbers.panel_edit_node({node_id, pos?, size?, title?, collapsed?, preset?|color?|bgcolor?})
atomically moves, resizes, retitles, collapses, or color-codes a node. Widget
values remain on their dedicated tool; execution mode is available as mode when needed.panel_create_group (pass node_ids to
auto-wrap, or bounds [x,y,w,h]; color hex), panel_move_group, panel_edit_group,
panel_remove_group.panel_create_subgraph(node_ids),
panel_enter_subgraph / panel_exit_subgraph, panel_get_subgraph,
panel_promote_widget, panel_move_rail(rail, [x,y]) (rail = "input"|"output",
must be inside the subgraph), panel_expose_subgraph_output(from_node_id, from_output) /
panel_expose_subgraph_input(to_node_id, to_input) (expose an interior slot on the
boundary rail; must be inside the subgraph), and panel_unpack_subgraph(node_id)
(expand/dissolve a subgraph back into the parent, the inverse of panel_create_subgraph).panel_canvas({action:"fit"}) to frame the result; panel_save_workflow to persist.connected_from (ignore unconnected
widget inputs; only node→node edges matter).layer(n) = 0 if it has no incoming node edges, else 1 + max(layer(of its sources)).
Layers become columns, left → right.x = X0 + layer * COL_PITCH, where COL_PITCH ≈ widest node.size[0] in that column + ~80.y[i+1] = y[i] + node[i].full_height + ROW_GAP. Use full_height (fromtest cases passed, vs 5 / 16 without
More skills from the same source and nearby in the registry, with their headline benchmark lift.