Initial commit: UTFCN — Use The (F***ing) Core Nodes

A ComfyUI companion that suggests core / available equivalents for custom
nodes and replaces them in a workflow.

- Backend (utfcn_core.py, __init__.py): read-only /utfcn/scan analysis that
  ranks equivalents in three tiers (curated → exact-signature → partial
  heuristic) from the live node registry.
- Frontend (web/utfcn.js): on-add mode (Off / Suggest / Force auto-replace),
  bulk "Replace with core / available…" command + Extensions menu with a
  preview-then-confirm dialog, and a right-click single-node replace. The swap
  engine only rewires losslessly.
- mappings.json: 7 hand-verified curated rules mined from installed packs
  (essentials, KJNodes, WAS); user_mappings.json for user overrides.
- Docs + branding: README, icon and social banner (SVG + PNG), GPL-3.0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-02 10:26:30 +02:00
commit 16f4e93a3a
13 changed files with 1141 additions and 0 deletions
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

+33
View File
@@ -0,0 +1,33 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 256 256">
<defs>
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#15161a"/>
<stop offset="1" stop-color="#202127"/>
</linearGradient>
<radialGradient id="glow" cx="0.5" cy="0.42" r="0.62">
<stop offset="0" stop-color="#34d399" stop-opacity="0.30"/>
<stop offset="1" stop-color="#34d399" stop-opacity="0"/>
</radialGradient>
</defs>
<rect width="256" height="256" rx="56" fill="url(#bg)"/>
<rect width="256" height="256" rx="56" fill="url(#glow)"/>
<rect x="6" y="6" width="244" height="244" rx="50" fill="none" stroke="#34d399" stroke-opacity="0.45" stroke-width="3"/>
<!-- custom node (amber) — the one being replaced -->
<rect x="30" y="92" width="60" height="72" rx="16" fill="#e0a244" fill-opacity="0.12" stroke="#e0a244" stroke-width="8" stroke-linejoin="round"/>
<circle cx="90" cy="112" r="5" fill="#e0a244"/>
<circle cx="90" cy="144" r="5" fill="#e0a244"/>
<!-- core node (green) — the replacement -->
<rect x="166" y="92" width="60" height="72" rx="16" fill="#34d399" fill-opacity="0.16" stroke="#5be08a" stroke-width="8" stroke-linejoin="round"/>
<path d="M181 129 l11 12 l18 -23" fill="none" stroke="#5be08a" stroke-width="9" stroke-linecap="round" stroke-linejoin="round"/>
<!-- swap arrows in the gap: custom -> core, core -> custom -->
<g stroke="#e8eaed" stroke-width="9" stroke-linecap="round">
<line x1="102" y1="112" x2="150" y2="112"/>
<line x1="154" y1="146" x2="106" y2="146"/>
</g>
<path d="M150 100 L166 112 L150 124 Z" fill="#e8eaed"/>
<path d="M106 134 L90 146 L106 158 Z" fill="#e8eaed"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

+63
View File
@@ -0,0 +1,63 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1280" height="640" viewBox="0 0 1280 640" font-family="'DejaVu Sans','Noto Sans',sans-serif">
<defs>
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#15161a"/>
<stop offset="1" stop-color="#202127"/>
</linearGradient>
<radialGradient id="glow" cx="0.74" cy="0.42" r="0.6">
<stop offset="0" stop-color="#34d399" stop-opacity="0.28"/>
<stop offset="1" stop-color="#34d399" stop-opacity="0"/>
</radialGradient>
<linearGradient id="title" x1="0" y1="0" x2="1" y2="0">
<stop offset="0" stop-color="#5be08a"/>
<stop offset="1" stop-color="#37c8c3"/>
</linearGradient>
</defs>
<rect width="1280" height="640" fill="url(#bg)"/>
<rect width="1280" height="640" fill="url(#glow)"/>
<rect x="8" y="8" width="1264" height="624" rx="28" fill="none" stroke="#34d399" stroke-opacity="0.22" stroke-width="2"/>
<!-- ==== left: text ==== -->
<text x="92" y="150" fill="#7f8797" font-size="24" letter-spacing="6" font-weight="600">COMFYUI · CUSTOM NODE</text>
<text x="86" y="286" fill="url(#title)" font-size="150" font-weight="800" letter-spacing="2">UTFCN</text>
<text x="92" y="346" fill="#e8eaed" font-size="46" font-weight="700">Use The Core Nodes</text>
<text x="92" y="402" fill="#9aa0ac" font-size="25">Spots custom nodes that re-implement core, and</text>
<text x="92" y="436" fill="#9aa0ac" font-size="25">replaces them with the built-in equivalent — safely.</text>
<!-- feature pills -->
<g font-size="22" font-weight="600" text-anchor="middle">
<rect x="92" y="474" width="132" height="48" rx="24" fill="#34d399" fill-opacity="0.12" stroke="#34d399" stroke-opacity="0.45" stroke-width="2"/>
<text x="158" y="505" fill="#cfead9">Suggest</text>
<rect x="240" y="474" width="132" height="48" rx="24" fill="#34d399" fill-opacity="0.12" stroke="#34d399" stroke-opacity="0.45" stroke-width="2"/>
<text x="306" y="505" fill="#cfead9">Replace</text>
<rect x="388" y="474" width="176" height="48" rx="24" fill="#34d399" fill-opacity="0.12" stroke="#34d399" stroke-opacity="0.45" stroke-width="2"/>
<text x="476" y="505" fill="#cfead9">Force mode</text>
</g>
<text x="92" y="576" fill="#6f7684" font-size="23">github.com/ethanfel/ComfyUI-UTFCN</text>
<!-- ==== right: node-swap vignette ==== -->
<g>
<rect x="806" y="188" width="404" height="304" rx="30" fill="#ffffff" fill-opacity="0.03" stroke="#34d399" stroke-opacity="0.16" stroke-width="2"/>
<!-- custom node (amber) -->
<rect x="838" y="262" width="140" height="140" rx="20" fill="#e0a244" fill-opacity="0.12" stroke="#e0a244" stroke-width="7" stroke-linejoin="round"/>
<circle cx="978" cy="300" r="6" fill="#e0a244"/>
<circle cx="978" cy="364" r="6" fill="#e0a244"/>
<text x="908" y="442" fill="#e0a244" font-size="26" font-weight="700" text-anchor="middle">custom</text>
<!-- core node (green) -->
<rect x="1038" y="262" width="140" height="140" rx="20" fill="#34d399" fill-opacity="0.16" stroke="#5be08a" stroke-width="7" stroke-linejoin="round"/>
<path d="M1086 332 l16 17 l26 -33" fill="none" stroke="#5be08a" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"/>
<text x="1108" y="442" fill="#5be08a" font-size="26" font-weight="700" text-anchor="middle">core</text>
<!-- swap arrows in the gap (custom -> core, core -> custom) -->
<g stroke="#e8eaed" stroke-width="8" stroke-linecap="round">
<line x1="984" y1="306" x2="1020" y2="306"/>
<line x1="1032" y1="358" x2="996" y2="358"/>
</g>
<path d="M1020 295 L1034 306 L1020 317 Z" fill="#e8eaed"/>
<path d="M996 347 L982 358 L996 369 Z" fill="#e8eaed"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB