Nodes/ꘇ Genereti/ꘇ Projector
ComfyUI Node

ꘇ Projector

Get the picture off the ComfyUI canvas and onto a wall

By languel·Created about a month ago·Updated 3 days ago· 1
ꘇ Projector
  • image
  • image
◄projector_controls►

ComfyUI's preview nodes are built for a person sitting at a desk, not for a room. They're small, they're inside the graph, and they're throttled to whatever makes the canvas responsive. Projector is a pass-through IMAGE node whose actual output is a button: click it and the latest queued image opens in a separate, screen-filling window. Point that at a projector or a second monitor and the graph becomes the control surface.

It's an Output-category node in ꘇ Genereti (languel/genereti, by Liuboto, MIT, super-alpha) - the realtime performance layer for ComfyUI. Display is half of what that pack is for, and the projector node is the "audience" end of it.

How it works

The graph side is trivial and honest: one IMAGE input, one IMAGE output, and execute returns the image unchanged. It is a wire you can insert anywhere without altering the stream. It also attaches a PreviewImage UI hint, so the node shows you the frame it's passing.

The real machinery is in the browser and in a small relay on the Comfy server. Same-browser-projector windows use direct bitmaps over the frontend's live path, which is the cheap case. Windows in a different browser or a different browser profile can't use that, so they fall back to a bounded in-memory JPEG relay in the backend: up to 30 sends/sec, one upload in flight at a time, latest frame only, and frames are never written to disk. That relay is deliberately tight - a 4 MB frame cap, 32 channels, 60-second expiry - which is what makes it safe to leave running.

The second input, projector_controls, is a widget, not a wire. It's socketless with the pack's own widget type, which is how the open/close controls render on the node. You won't connect anything to it.

Using it

Wire Projector downstream of whatever you want on the big screen, then use the button in the node to open the window. That's it. The window shows the latest queued image, and it keeps working while you go on editing the graph - which is the point.

One thing to internalise: this is a queued image display, not a live video pipe. The docs describe the live path elsewhere (the image preview node, the browser runtime, the direct ImageBitmap transfer), and note a measured ~41 fps for a local 512px p5 → preview → projector chain. That was a specific test on specific hardware, explicitly "not a guaranteed rate." Treat the projector as "show the last result" unless you've built a live chain feeding it.

Install

Manager → search "Genereti" → install ꘇ Genereti → restart ComfyUI → refresh the browser page. Manual:

git clone https://github.com/languel/genereti.git custom_nodes/genereti
./.venv/bin/python -m pip install -r custom_nodes/genereti/requirements.txt

The relay registers an HTTP route on the Comfy server, so restart ComfyUI once after installing - a browser refresh alone won't register it. Then refresh the page and open a fresh projector link. Requires ComfyUI 0.38.2+, Python 3.11+; no models and no extra packages.

Gotchas

Old links belong to old node instances. This is the most common confusion and it's stated directly in the pack's notes: reopen the projector from the current node after a restart or an update. A stale URL will just sit there.

Cross-profile windows are the degraded path. If you're projecting to another browser profile, you're on the JPEG relay: ~30 fps cap, one frame in flight, latest frame only. It's genuinely fine for a projector, but don't tune your patch against it if you have same-profile windows available.

Keep the source active. These display windows don't accelerate anything, and browsers throttle background tabs. If the picture freezes when you tab away, that's the browser, not the node.

Same warning as the rest of the pack: this is a super-alpha release under active change, and the README's advice - back up workflows before updating - applies double to anything you're running in front of an audience.

CategoryGenereti / Output

Inputs (2)

NameTypeDefaultDescription
imageIMAGE—
projector_controlsSTRING—

Outputs (1)

NameTypeDescription
imageIMAGE—