[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81143":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":15,"stars7d":15,"stars30d":15,"stars90d":14,"forks30d":14,"starsTrendScore":12,"compositeScore":16,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":17,"fork":17,"defaultBranch":18,"hasWiki":19,"hasPages":17,"topics":20,"createdAt":9,"pushedAt":9,"updatedAt":30,"readmeContent":31,"aiSummary":32,"trendingCount":14,"starSnapshotCount":14,"syncStatus":33,"lastSyncTime":34,"discoverSource":35},81143,"comfyui-CleanFreak","shootthesound\u002Fcomfyui-CleanFreak","shootthesound","One-click tidy-by-role for ComfyUI workflows. Loaders \u002F encoders \u002F samplers \u002F decoders \u002F outputs each get their own column or row, with optional colour-coded groups. Width-aware. Connections preserved.",null,"JavaScript",32,3,31,0,1,41.41,false,"main",true,[21,22,23,24,25,26,27,28,29],"ai","comfyui","generative-ai","layout","organisation","stable-diffusion","tidy","utility","workflow","2026-06-12 04:01:32","\u003Ch1 align=\"center\">CleanFreak — for ComfyUI\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\n  One-click \u003Cstrong>tidy by role\u003C\u002Fstrong> for any ComfyUI workflow.\u003Cbr>\n  Loaders go in one column. Encoders in the next. Then samplers, decoders, outputs. Width-aware. Coloured group cards. Connections preserved.\u003Cbr>\n  \u003Cem>Ships pre-classified for the entire stock node set plus the most-used community packs — Impact-Pack, controlnet_aux, rgthree-comfy, VideoHelperSuite, IPAdapter_plus, WAS Node Suite, comfyui-easy-use, KJNodes, RES4LYF, comfyui-dynamicprompts, comfyui-ollama, comfyui-automaticcfg, Comfyroll, LTXVideo \u002F LTXTricks, and the entire shootthesound pack family. Edit anything you don't like and save it — the classifier learns over time.\u003C\u002Fem>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Cstrong>1200+ node classes pre-classified out of the box.\u003C\u002Fstrong>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fbuymeacoffee.com\u002Florasandlenses\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FBuy%20me%20a%20coffee-FFDD00?style=for-the-badge&logo=buy-me-a-coffee&logoColor=black\" alt=\"Buy Me A Coffee\">\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Ctable align=\"center\">\n  \u003Ctr>\n    \u003Ctd align=\"center\">\u003Cstrong>Before\u003C\u002Fstrong>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Cstrong>After\u003C\u002Fstrong> — one click, Tidy + Groups\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>\u003Cimg src=\"before.png\" alt=\"Spaghetti workflow before CleanFreak — overlapping nodes, criss-crossing wires\" width=\"460\">\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"after.png\" alt=\"Same workflow tidied by role — loaders \u002F encoders \u002F conditioning \u002F samplers \u002F decoders \u002F outputs each in their own coloured group, neatly stacked\" width=\"460\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n\u003C\u002Ftable>\n\n---\n\n### Why I built this\n\nEvery ComfyUI workflow I open ends up looking like a plate of spaghetti within a few iterations. Existing arrange tools either reorder by execution depth (breaks when nodes have similar depth) or just snap-to-grid (doesn't actually organise anything). I wanted something that groups nodes by what they *are* — load model here, encode prompts there, sample here, decode there, save there — so the same workflow shape always lays out the same way regardless of how I built it.\n\n---\n\n### What it does\n\nRight-click on the canvas (empty space, not on a node) and pick one of:\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"menu.png\" alt=\"CleanFreak's actions in the canvas right-click menu — Tidy by Role (horizontal\u002Fvertical), Tidy + Groups, Unpack subgraphs\u002Fgroups + Tidy, Delete all groups, review & edit assignments\" width=\"460\">\n\u003C\u002Fp>\n\n- **✨ Tidy by Role (horizontal)** — columns left-to-right, no groups\n- **✨ Tidy by Role (vertical)** — rows top-to-bottom, no groups\n- **✨ Tidy by Role + Groups (horizontal)** — columns left-to-right, plus a colour-coded group card around each role bucket\n- **✨ Tidy by Role + Groups (vertical)** — same, vertical\n- **✨ Tidy by Role — Delete all groups** — wipe every group on the canvas without touching node positions\n- **✨ Tidy by Role — Unpack subgraphs\u002Fgroups + Tidy + Groups (horizontal\u002Fvertical)** — first flatten every container node (modern **subgraphs** via `graph.unpackSubgraph()` AND legacy **group nodes** via `convertToNodes()`), iterating until nothing remains so nested containers fully flatten, then tidy with coloured group cards.\n- **✨ Tidy by Role — Unpack all subgraphs \u002F group nodes (no tidy)** — flatten every container node without re-laying anything out.\n- **✨ Tidy by Role — review & edit assignments…** — open an interactive modal listing every node grouped by its current bucket, each with a dropdown to re-assign its role. Per-node overrides stick for the rest of the session and are used by every subsequent Tidy. The footer has Tidy \u002F Tidy + Groups buttons for both orientations, an **Unpack subgraphs \u002F group nodes first** toggle, plus Save \u002F Reset \u002F Forget-saved buttons.\n\nThe two `+ Groups` variants delete any pre-existing groups before drawing fresh ones, so re-tidying never stacks stale groups on top of new ones.\n\nEvery node in the workflow is classified into one of these buckets:\n\n| Role | Examples |\n|---|---|\n| `loaders` | CheckpointLoaderSimple, UNETLoader, VAELoader, CLIPLoader, LoraLoader, ControlNetLoader, … |\n| `image-input` | LoadImage, EmptyLatentImage, LoadImageMask, … |\n| `prompts` | PrimitiveNode (string), ShowText, … |\n| `encoders` | CLIPTextEncode, T5TextEncode, VAEEncode, … |\n| `conditioning` | ConditioningCombine, ConditioningSetTimestepRange, ControlNetApply, ReferenceLatent+, FluxGuidance, … |\n| `samplers` | KSampler, KSamplerAdvanced, SamplerCustom, BasicScheduler, RandomNoise, … |\n| `decoders` | VAEDecode, VAEDecodeTiled |\n| `post` | ImageUpscaleWithModel, ImageBlur, ImageScale, … |\n| `outputs` | SaveImage, PreviewImage, SaveAnimatedWEBP, … |\n| `misc` | Anything we couldn't classify — gets its own column |\n\nEach non-empty bucket becomes a column (or row, in vertical mode). Column width = the widest node in that column; nodes are centred horizontally within their column so wide and narrow nodes line up neatly.\n\nWithin each column, nodes are sorted by ComfyUI's execution order, with `SaveImage`\u002F`PreviewImage` pushed to the bottom of their column.\n\n---\n\n### How classification works\n\nFive-step lookup chain (highest priority wins):\n\n1. **Per-node session override** — anything you picked in this session's editor modal.\n2. **Per-class user override (saved to disk)** — anything you've ever pressed **Save assignments** on. Stored at `\u003CComfyUI>\u002Fuser\u002Fcleanfreak\u002Frole_overrides.json`. The file accumulates over time, so the more workflows you tidy the more nodes the classifier knows about by default.\n3. **Built-in class override table.** A lookup of every common class name → role. Out of the box this covers:\n   - **The entire stock ComfyUI node set** — checkpoint\u002FUNET\u002FVAE\u002FCLIP\u002FControlNet\u002FLoRA loaders, every text encoder, conditioning manipulators (combine \u002F concat \u002F set timestep \u002F set mask \u002F set area \u002F FluxGuidance \u002F model-sampling), KSampler + KSamplerAdvanced + custom-sampler \u002F scheduler \u002F guider \u002F noise nodes, VAEDecode tiled\u002Funtiled, image input \u002F load \u002F empty latent, save \u002F preview \u002F animated webp \u002F animated png \u002F save video \u002F save latent, image upscale \u002F blur \u002F sharpen \u002F blend \u002F crop \u002F resize \u002F scale.\n   - **A wide swathe of community packs**:\n     - `comfyui-Impact-Pack` (every detailer \u002F regional sampler \u002F SEGS pipeline \u002F scheduler \u002F SAM loader \u002F wildcard encoder \u002F sender-receiver classified)\n     - `comfyui_controlnet_aux` (all ~50 preprocessors → `post`)\n     - `rgthree-comfy` (Power LoRA Loader, Power Prompt variants, Image Resize, Image Comparer, KSampler Config, Seed)\n     - `comfyui-videohelpersuite` (every `VHS_Load*` → `image-input`, `VideoCombine` → `outputs`, batched VAE → `encoders`\u002F`decoders`)\n     - `ComfyUI_IPAdapter_plus` (model\u002Fembed\u002Finsightface loaders → `loaders`, every `IPAdapter*` applier → `conditioning`)\n     - `was-node-suite` (every checkpoint \u002F lora \u002F model loader → `loaders`, every Image filter \u002F blend \u002F crop \u002F paste \u002F mask op → `post`, every Text * → `prompts`, KSampler (WAS) \u002F KSampler Cycle → `samplers`, Image Save \u002F Write to GIF\u002FVideo \u002F Send HTTP → `outputs`)\n     - `comfyui-easy-use` (every `easy *Loader` → `loaders`, every `easy kSampler*` \u002F `easy preSampling*` \u002F `easy detailerFix` → `samplers`, every `easy ipadapterApply*` \u002F `easy instantIDApply*` \u002F `easy pulIDApply*` → `conditioning`, `easy prompt*` \u002F `easy wildcards*` → `prompts`, `easy imageSave` \u002F `easy showAnything` → `outputs`)\n     - `RES4LYF` (every `Clown*Sampler*` \u002F `Shark*Sampler*` \u002F `Re*Patcher` \u002F `ModelTimestepPatcher` → `samplers`, every `Clown*Guide*` \u002F `Clown*Style*` \u002F `ClownInpaint*` \u002F `ClownRegionalConditioning*` \u002F `Conditioning*` → `conditioning`, every `TextBox*` → `prompts`, regex catches `Sigmas *` → `samplers` and `Frames *` → `post`)\n     - `comfyui-dynamicprompts` (`DPCombinatorial`, `DPMagicPrompt`, `DPRandomGenerator`, etc. → `prompts`)\n     - `comfyui-ollama` (all `Ollama*` LLM nodes → `prompts`, since their text output is typically wired into a `CLIPTextEncode`)\n     - `comfyui-automaticcfg` (every `Automatic CFG *` model patch + `SAG delayed activation` + `Temperature *` + `Zero Uncond CFG *` → `conditioning`)\n     - `ComfyUI_Comfyroll_CustomNodes` (CR LoRA Stack \u002F CR Apply LoRA Stack → `loaders`, CR Apply ControlNet \u002F Multi-ControlNet → `conditioning`, CR Image Output → `outputs`, CR Upscale Image \u002F CR Halftone \u002F CR Vignette → `post`)\n     - `ComfyUI-LTXVideo` + LTX-Tricks + KJNodes LTXV-subset — every `LTXV*Sampler` \u002F `LTXFlowEdit*` \u002F `LTX*ODESampler` \u002F `LTX*ModelSamplingPred` → `samplers`; every guide \u002F patch \u002F attention override \u002F `STG*Guider` \u002F `Multimodal*Guider` \u002F `LTX*Audio*Mask` → `conditioning`; `LTXVTiledVAEDecode` → `decoders`; LTXVQ8\u002FGemma\u002FPrompt-Enhancer\u002FLowVRAM-* loaders → `loaders`; `LTXVGemmaEnhancePrompt` → `prompts`; `LTXVSelectLatents` \u002F `ImageToCPU` → `post`.\n     - `ComfyUI-KJNodes` (kijai) — full pack (~200 nodes): `CheckpointLoaderKJ` \u002F `DiffusionModelLoaderKJ` \u002F `VAELoaderKJ` \u002F `GGUFLoaderKJ` \u002F `DiffusionModelSelector` \u002F `Flux\u002FHunyuan\u002FWan21\u002FDiTBlockLora*` \u002F `IntrinsicLoraSampling` \u002F `DownloadAndLoadCLIPSeg` → `loaders`; `GenerateNoise` \u002F `CustomSigmas` \u002F `FlipSigmasAdjusted` \u002F `InjectNoiseToLatent` \u002F `Float↔Sigmas` \u002F `Stable-Zero123\u002FSV3D-BatchSchedule` → `samplers`; every `ConditioningSetMaskAndCombine*` \u002F `WanImageToVideoSVIPro` \u002F `StyleModelApplyAdvanced` \u002F `Apply RifleX RoPE *` \u002F `WanVideo TeaCache\u002FEnhanceAVideo\u002FNAG\u002FSkipLayerGuidance` \u002F `ScheduledCFGGuidance` \u002F `CFGZeroStarAndInit` \u002F `LeapfusionHunyuanI2VPatcher` \u002F `Hunyuan VideoEncodeKeyframesToCond` \u002F `LatentInpaintTTM` \u002F `NABLA_Attention` \u002F `CheckpointPerturbWeights` \u002F `PathchSageAttentionKJ` \u002F every `TorchCompile*` model patch \u002F `Differential Diffusion Advanced` \u002F `LTXVEnhanceAVideoKJ` \u002F `Create\u002FAppend\u002FDraw InstanceDiffusionTracking` \u002F `Custom ControlNet Weights Flux From List` \u002F `Set Shakker Labs Union ControlNet Type` → `conditioning`; `VAEDecodeLoopKJ` → `decoders`; `SaveImageWithAlpha`, `SaveImageKJ`, `SaveStringKJ`, `ModelSaveKJ`, `LoraExtractKJ`, `LoraReduceRank`, `FastPreview`, `PreviewAnimation`, `PreviewLatentNoiseMask`, `ImageAndMaskPreview`, `VisualizeSigmasKJ`, `CameraPoseVisualizer`, `BboxVisualize`, `VRAM_Debug`, `TimerNodeKJ`, all CUDA-memory-history nodes → `outputs`; `LoadAndResizeImage`, `LoadImagesFromFolderKJ`, `LoadVideosFromFolder`, `ImageGrabPIL`, `Screencap_mss`, `WebcamCaptureCV2`, `EmptyLatentImagePresets\u002FCustom`, `ImagePass`, `ModelPassThrough`, `BOOL\u002FINT\u002FFloatConstant` → `image-input`; `StringConstant(Multiline)` \u002F `JoinStrings` \u002F `WidgetToString` \u002F `SomethingToString` \u002F `Superprompt` \u002F `ScaleBatchPromptSchedule` → `prompts`; the entire image \u002F mask \u002F batch \u002F curve \u002F coord \u002F audio post-processing family (~120 nodes — every `ImageBatch*`, `Image[Pad\u002FCrop\u002FConcat\u002FGrid\u002FInsert\u002FReplace\u002FReverse\u002FShuffle\u002FSplit\u002FTransition]*`, every `Mask[Batch\u002FRound\u002FResize\u002FOffset\u002FRemap]`, `Create*Mask*`, `BatchCropFromMask*`, `BatchUncrop*`, `SplineEditor`, `PointsEditor`, audio→mask\u002Ffloat, RemapImage\u002FMaskRange, ColorMatch, AddLabel, etc.) → `post`.\n   - **Every node in `shootthesound`'s pack family** — Finding LoRA, Reference Latent+, Realtime LoRA (selective + analyzer loaders + model-layer editors + every trainer variant), Clippy Reborn, Image of the Day, Model Diff to LoRA, Wan I2V Control, LongLook.\n4. **Node category.** Many ComfyUI nodes set a `CATEGORY` like `\"loaders\"`, `\"sampling\"`, `\"image\u002Fupscaling\"`, etc. We use that as a strong fallback signal.\n5. **Class-name regex.** Generic patterns: ends in `Encode` → encoders, ends in `Decode` → decoders, contains `Sample`\u002F`Scheduler` → samplers, starts with `Load` → loaders, starts with `Save`\u002F`Preview` → outputs, contains `Conditioning`\u002F`Guidance`\u002F`ControlNet` → conditioning, etc.\n\nAnything that survives all five falls into the `misc` column.\n\nThe **review & edit assignments** modal lists every node grouped under its current bucket, with a per-row dropdown to re-assign. Footer buttons:\n\n- **Tidy \u002F Tidy + Groups (horizontal\u002Fvertical)** — apply with current assignments\n- **Save assignments** — promote every assignment in the list to a per-class default and write to `role_overrides.json`. Future workflows that contain the same classes will use these assignments automatically.\n- **Reset session edits** — drop the per-node session overrides on every visible node and re-classify from scratch.\n- **Forget saved** — wipe the entire `role_overrides.json`. Built-in classification rules still apply.\n\n---\n\n### Group cards\n\nThe `+ Groups` variants draw a coloured group card around each non-empty role bucket after tidying. Each role has its own muted-but-distinguishable colour so a glance tells you which column is which. The card title is the role's display name (`Loaders`, `Encoders`, `Conditioning`, `Samplers`, …).\n\nRe-tidying with `+ Groups` always wipes existing groups first, so stale groups never accumulate. If you only want to nuke the groups (without re-arranging nodes), use **Delete all groups**.\n\n---\n\n### Connections are never touched\n\nComfyUI links are stored by node id (not by position), so changing `node.pos = [x, y]` never breaks a wire. This pack only ever writes to `node.pos` and to the graph's groups list. No links, no inputs, no outputs, nothing else.\n\n---\n\n### HTTP routes (for the curious)\n\nThree routes live under `\u002Fcleanfreak\u002F`:\n\n- `GET  \u002Fcleanfreak\u002Foverrides` — returns `{ overrides: {ClassName: role, …} }`\n- `POST \u002Fcleanfreak\u002Foverrides` — body `{ overrides: {…} }`, replaces saved overrides with the supplied map\n- `POST \u002Fcleanfreak\u002Foverrides\u002Fclear` — wipes saved overrides (no body)\n\nStorage: `\u003CComfyUI>\u002Fuser\u002Fcleanfreak\u002Frole_overrides.json`. Live-editable on disk; restart ComfyUI to pick up manual edits.\n\n---\n\n### Quick start\n\n1. Drop the `comfyui-CleanFreak` folder into `ComfyUI\u002Fcustom_nodes\u002F`.\n2. Restart ComfyUI (or reload the browser tab if hot-reloading is on).\n3. Right-click on empty canvas space → pick a tidy option.\n\nNo node to add to your workflow. No new inputs\u002Foutputs. It's purely an editor convenience.\n\n---\n\n### Layout details\n\n- **Horizontal mode** — roles become columns, left to right in this order: `loaders → image-input → prompts → encoders → conditioning → samplers → decoders → post → outputs → misc`. Nodes stack vertically within each column.\n- **Vertical mode** — roles become rows, top to bottom in the same order. Nodes stack horizontally within each row.\n- **Column width** = `max(nodeWidth)` of every node in that column. Nodes narrower than the column are horizontally centred inside it.\n- **Row height** = `max(nodeHeight)` of every node in that row.\n- **Anchor** — the layout starts at the top-left of your current bounding box, not at canvas (0, 0). So tidying a workflow that lives in some random corner of the canvas keeps it roughly where you left it.\n- **Empty buckets** are skipped — no wasted columns.\n\n---\n\n### Limitations \u002F honest notes\n\n- **Custom nodes that don't match any rule** end up in `misc`. The classification table is exhaustive for stock and very common packs but can't be exhaustive for everything. Run the **preview classification** modal first if your workflow uses unusual nodes — anything in `misc` that should be elsewhere is something we can add to the override table.\n- **No grouping support yet.** ComfyUI groups (the coloured rectangles you can lasso) are ignored. Nodes inside groups are tidied along with everything else, breaking out of their group box. If grouping support matters to you, open an issue.\n- **No animation.** Tidying happens in one frame. If you want to undo, ComfyUI's native undo (Ctrl+Z) covers it.\n\n---\n\n### Support\n\nIf this saves you re-arranging time, consider supporting development:\n\n\u003Ca href=\"https:\u002F\u002Fbuymeacoffee.com\u002Florasandlenses\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FBuy%20me%20a%20coffee-FFDD00?style=for-the-badge&logo=buy-me-a-coffee&logoColor=black\" alt=\"Buy Me A Coffee\">\u003C\u002Fa>\n","CleanFreak 是一个用于 ComfyUI 工作流的一键整理工具。它能够根据节点的角色（如加载器、编码器、采样器、解码器和输出）自动排列，使每个角色的节点位于各自的列或行中，并支持颜色编码分组。该工具具有宽度感知功能，确保连接线保持不变。项目预设了1200多个节点分类，涵盖了ComfyUI自带的所有节点以及常用的社区扩展包，用户还可以自定义分类规则并保存，工具会随时间学习改进。适用于需要清晰组织和优化布局的AI生成工作流场景，特别适合使用Stable Diffusion等模型进行图像生成的用户。",2,"2026-06-11 04:03:40","CREATED_QUERY"]