ComfyUI Node

Jtils

You Came for the Node, Stay for the Right-Click Search

By cnbjjj·Created 2 years ago·Updated about a year ago· 3
Jtils
  • image
  • image_ref
  • image
  • mask

ComfyUI-Jtils is one of those packs where the headline feature isn't a node at all. The thing named "Jtils" on the canvas is a barely-dressed image passthrough; the pack's actual reason to exist is a right-click canvas menu called Search Nodes by Class Type that highlights matching nodes in pink. So before you build a workflow around the node, know what you're actually getting.

The real feature: searching a huge graph

You know that feeling when you load someone's workflow and it's 200 nodes of tangled spaghetti, and you need to find every LoadImage or every KSampler? That's the problem Jtils tries to solve. Right-click anywhere on the canvas, open the 𝓙tils submenu, pick "Search Nodes by Class Type," type a string, and every node whose class name contains it flashes to a hot-pink border and gets selected.

Under the hood it's a classic frontend extension: the JavaScript monkey-patches LGraphCanvas.prototype.getCanvasMenuOptions, walks the graph via app.graphToPrompt(), and recolors matches until you deselect them. It only searches the internal class_type - the technical class name, not the friendly display name - so "KSampler" finds your samplers but a search for "sampler" will miss nothing you'd expect. It's a small tool, but for navigating the workflow-sharing culture's giant graphs it beats squinting at wires.

The Jtils node itself

Now the node. It's honest to call it a placeholder. Its INPUT_TYPES declare a required image (IMAGE) and an optional image_ref (IMAGE_FILE), and it advertises two outputs, image (IMAGE) and mask (MASK). The function body is one line: return image. That's it.

So here's the trap: the mask output is never produced. The node declares it, ComfyUI pads the missing value with nothing, and the slot you're supposed to wire into is dead. Plug the mask into a blur or a composite node and you'll get an empty input that either silently does nothing or throws. The image_ref input is equally decorative - nothing in the code ever reads it. The only thing the node actually does is echo the image back out, and since it's flagged as an output node, that echo gets previewed in the UI when the workflow runs.

Which means: if a downloaded workflow references a "Jtils" node, this passthrough will satisfy the dependency and pass your image through intact. If a tutorial tells you it's a tool, it's not. Core ComfyUI can already pass an image through any number of ways.

Install

Manager is the easy path - search "ComfyUI-Jtils" and install. Or the manual route:

cd ComfyUI/custom_nodes
git clone https://github.com/cnbjjj/ComfyUI-Jtils.git
cd ComfyUI-Jtils
pip install -r requirements.txt

Then restart ComfyUI. Good news: requirements.txt is empty - there are no Python dependencies, no models to download, nothing that can break your environment. That's rare in this ecosystem and worth appreciating.

Gotchas

  • The mask output is a lie - the biggest one, already covered. Treat it as image-only.
  • Frontend compatibility is the usual risk. The search tool hooks the legacy LiteGraph canvas. ComfyUI's newer Nodes 2.0 frontend has kept the legacy canvas around for exactly this kind of extension, but this is precisely the style of pack that upstream frontend rewrites break - if the right-click menu ever stops appearing, that's why. It's also a shared monkey-patch: two extensions patching getCanvasMenuOptions can stack menus. If your right-click menu suddenly looks weird, Jtils is a candidate culprit to disable.
  • Version 0.0.1. The changelog lists exactly one feature, the author is a solo dev ("JJ" in the package metadata), and there's no community signal anywhere - nobody's posting about this pack, so don't expect fixes or discussion.

Verdict: install it for the canvas search if you wrestle with big graphs, and treat the node itself as the harmless passthrough it is. Just don't wire that mask output anywhere.

CategoryJtils

Inputs (2)

NameTypeDefaultDescription
imageIMAGE
image_refoptIMAGE_FILE

Outputs (2)

NameTypeDescription
imageIMAGE
maskMASK