Force Connect
When ComfyUI won't let you plug a square peg into a round hole
- source
- *
You know that moment. You've built the workflow, dragged the wire, and ComfyUI refuses to connect two sockets that are obviously meant for each other - a STRING output into a COMBO input, a number into a slot the node will happily read. The graph silently ignores your drag. Force Connect is the node that says "fine, I'll do it myself": it sits between the two sockets and passes whatever you give it straight through, unmodified, so the connection happens anyway.
What it actually does
Here's the whole mechanism, and it is genuinely the whole mechanism. The node has one input, source, typed as ANY (ComfyUI's * wildcard - a socket that accepts any type of data), and one output, also *. Its backend function is a single line: return (source,). It doesn't convert, transform, or even look at your data. The "force" is just type erasure: because both its sockets are untyped, you can wire anything into source and take its output anywhere, and ComfyUI's type checker no longer has a mismatch to complain about. There's no hidden rerouting - the front-end JS the pack ships does nothing but give the node a fixed width on the canvas.
When you'd actually reach for it
Real answer: not often, and that's fine. Its natural home is the awkward corner where a node's input type is stricter than the reality of your data - the classic case being feeding a text value into a COMBO-typed input. ComfyUI has a built-in shortcut for this (hold Ctrl/Cmd while dragging to force a link anyway), but that bypass dies with your session and can be a bear in shared or API workflows. A Force Connect node makes the bypass explicit and persistent: the wire is saved, the graph loads, the data flows. The author's own docs spell out the intent - override ComfyUI's strict type-checking between two sockets that would normally be incompatible.
The gotcha: forcing isn't converting
Two things to internalize before you trust it. First, forcing a connection is not converting data. The node passes your string through byte-for-byte; it does not make it valid for the downstream node. You can force a LATENT into a slot expecting STRING, and it'll connect - then the downstream node will hit a shape it can't parse and you'll get an error that's harder to read than the one you dodged. The wildcard only buys you a seat; the downstream code still has to make sense of what you gave it. Second, this is exactly the kind of type-erasing convenience node that a chunk of the community has loudly soured on - the "Anything Anywhere" backlash argued that nodes which hide what's really on a wire make workflows impossible to debug. Force Connect is the comparatively disciplined version: it erases one connection, manually, where you can see it. Use it surgically, not as a habit, and you're fine.
Installing it
Install is the easiest part of this pack - there are no dependencies, no model downloads, no Python packages to pin (the project's dependency list is empty), and it'll run on any ComfyUI with Python 3.11+. ComfyUI Manager is the painless route: Manager → Install Custom Nodes → search "Force Connect" → install → restart. Or the manual clone:
cd ComfyUI/custom_nodes
git clone https://github.com/rookiepsi/comfypsi_force_connect.git
Then restart ComfyUI and look for it under comfypsi/utility in the node list. It shows up as "Force Connect."
Where people get burned
The #1 mistake is expecting the node to fix the mismatch. It doesn't - it just stops ComfyUI from blocking the wire. Wire it up, run, and if the downstream node throws, the problem is the data you forced through, not the connector. And because it's an ANY node, ComfyUI can't reason about what flows through it either, so a connection you force here is invisible to the graph's own sanity checks. If a shared workflow suddenly breaks after you "cleaned up" one of these, look here first. It's a tiny, honest tool - zero magic, zero deps, does one thing. That's worth having in the drawer, even if you only reach for it twice a year.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| source | * | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| * | * | — |