ꘇ top.feedback
The smear trail node — and why Queue gives you nothing back
- image
- image
Feedback is the oldest trick in generative visuals: take the frame you just drew, transform it a little, fade it a little, and draw the new frame on top. Repeat and you get trails, smears, zoom tunnels, kaleidoscopic buildup. TouchDesigner users do it constantly; ComfyUI users usually can't, because the graph is acyclic - there's no way to wire a node's output back into itself.
top.feedback solves that by keeping the history inside the node. No cyclic connection, no hack. But read the next sentence before you build on it: this is a live-mode node. In a normal Queue run it returns the input untouched, because a queued graph has no notion of "the previous frame".
How it works
The node holds a previous output frame, transforms it by translate_x, translate_y, scale and rotate, multiplies it by decay, and then blends it underneath (or over) the incoming image. Two GPU textures alternate as front/back buffers, which is why there's a loop arrow on the node - click it to wipe the history and start clean.
blend is the mode that matters most:
screen(default) andaddaccumulate light. History appears through opaque black, so this is the mode for glowing trails on a dark canvas. Screen saturates more gently than add; add blows out faster.overcomposites using the source's alpha. If your source frames are fully opaque this covers the history every frame - which is correct and also why a full-frame opaque source overoverlooks like feedback isn't working.
Decay is applied per rendered frame, so trail length is a function of frame rate as well as the slider. A trail that looks right at 30fps will be noticeably longer at 120.
The inputs that matter
image in, image out. decay (0..1, default 0.96) is trail length - 0.9 is a short comet, 0.98 is a smeared mess you'll have to reset. The transform controls are what give feedback its direction: a tiny scale above 1 zooms outward forever, a small translate_x drags everything sideways, rotate spins the trail. blend picks the compositing flavour.
Output goes into top.bloom, top.convolve (blur), or straight back into the node's own upstream chain - the pack's own Texture-Lab example is drawing → feedback → blur → corner pin → composite, and the author notes that a bloomed feedback output can even drive top.displace. That's the painterly loop, and it's the best reason to own this pack.
Install
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, refresh the browser page. One frontend dependency; no model downloads. Live rendering needs WebGPU support in your browser - if the preview is static, that's the first thing to check, not the node. Find it as ꘇ top.feedback under Genereti / TOP (search genereti), and open Workflows → Genereti → ꘇ-Texture-Lab for a working chain.
Traps
Queue returns the input. This is by design and it's documented: "Queue returns current IMAGE without temporal history." If you're running a queued graph and expecting trails, you're watching the input. Feedback only exists in live mode.
A fully opaque source over over hides everything. Either use screen/add, or give your source real transparency.
You can't see the reset in the graph. History lives in the node, resets on the loop arrow, and isn't serialised into the workflow. Reopening a file doesn't restore a trail state.
Decay compounds with frame rate, as above. Tune it in the mode you'll actually run.
Pack status: super-alpha, early classroom testing. Back up your workflows.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| decay | FLOAT | 0.960–1 | — |
| translate_x | FLOAT | 0.00-4–4 | — |
| translate_y | FLOAT | 0.00-4–4 | — |
| scale | FLOAT | 1.000.001–8 | — |
| rotate | FLOAT | 0.00-360–360 | — |
| blendopt | COMBO | screen | 3 options: screen, add, over |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |