ꘇ top.feedbackref
Reach back one frame from anywhere in the graph
- image
- image
ComfyUI graphs can't loop. A wire goes one way, so the second you want a pixel that depends on the output of the node chain you're currently building, you're stuck. top.feedbackref is the escape hatch: it reads a live node or output, including a composite that comes after it in the graph, and hands you its previous frame. It's how you build a real feedback system - as opposed to top.feedback, which keeps its own history internal - without a cyclic connection.
Everything you know about dependency cycles is why this node has to exist. The KB's node-plumbing doc makes the same point from the other direction: ComfyUI's execution is a backward walk from output nodes, and anything that would need its own result is simply not expressible. A one-frame delay is the standard fix, and it's what this implements.
How it works
You point reference at a live IMAGE node or output. It accepts a #nodeID, an @persistentRef, or a unique node title - type the node's name in, or pick from the list. The field is a plain string widget, and the tooltip spells out the rest: convert the field to a STRING input and you can wire it instead of typing. It samples the previous frame and is explicitly not a queued IMAGE connection.
The pattern the author recommends, and the one that works: feed this node through your processing into a composite with the fresh source, then point the reference at that composite. You get a loop, one frame deep, with no cycle in the graph.
Optional image seeds the first frame from a queued IMAGE - wire a constant or a loaded picture in and your loop starts from something instead of from nothing. width and height size the empty seed when there's no seeding image, so an un-seeded loop begins as a transparent frame of that size.
The inputs that matter
reference is the node. image (optional) is the seed. width/height are the fallback dimensions. One image output.
This is the node to reach for when top.feedback's self-contained history isn't enough - when the thing you want to feed back is a composite that includes the feedback, a bloomed version of it, or a corner-pinned version of it. At that point internal state can't help you and you need a reference.
Install
ComfyUI Manager → search ꘇ Genereti → install, or:
git clone https://github.com/languel/genereti.git custom_nodes/genereti
./.venv/bin/python -m pip install -r custom_nodes/genereti/requirements.txt
Restart and refresh. Requirements are one frontend pin - no models, no services - and live reference sampling needs a WebGPU-capable browser. Find it as ꘇ top.feedbackref under Genereti / TOP; search genereti since the leading glyph sorts badly.
Traps
In Queue it does nothing clever. Documented behaviour: "Queue returns the seed or transparent IMAGE, never follows browser references." If you queue a workflow with a feedbackref in it, that branch is empty or seeded - no history, no loop. Live mode only.
References break on rename. Picking by node title means renaming or recreating that node quietly changes what you're reading. Prefer #nodeID for workflows you'll save and re-open.
One frame is one frame. There's no longer history here; if you need a long trail with a specific blend, top.feedback (or a chain of these) is more direct.
Feedback + opaque sources still behave the way feedback does - a full-frame opaque image composited with over erases history. Same physics, different node.
Pack status: super-alpha, early classroom testing. Back up your workflows before updating.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| reference | STRING | Pick a live IMAGE node/output, or type #nodeID, @persistentRef, or a unique node title. Convert this field to a STRING input for a wired reference. Samples the previous frame; this is not a queued IMAGE connection. | |
| width | INT | 5121–4096 | — |
| height | INT | 5121–4096 | — |
| imageopt | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |