ꘇ 2D stream
Video, GIFs and images as a live source in the graph
- image
- image
What it's for
ꘇ 2D stream is the pack's media source node. Load a local image, video or animated GIF, paste a direct media URL, or connect an upstream live IMAGE, and the node gives you frames. Press its play control and it starts; frames are sampled in the browser and handed to Comfy's engine.
Why does that matter in a diffusion workflow? Because a lot of the interesting stuff - feedback loops, video-to-video style pipelines, motion studies - wants a time-varying source, and Comfy's stock input path is a Load Image node that gives you one still. This node gives you a moving one, plus a passthrough that means you can swap between them without rewiring the graph.
Three ways in, and how they resolve
The node has no required inputs at all. Both of its inputs are optional, and there's a clear precedence:
capture- a socketless browser widget. Load media in the node UI and the frontend uploads a sampled frame as a temp filename at queue time. If that filename is real (it won't start withGENERETI_OFF:), the backend loads it through Comfy's annotated-path helper, keeping RGBA when the media has transparency and RGB otherwise - so a GIF with transparent regions doesn't come back with black holes.image- if there's no capture, an upstream liveIMAGEpasses through. Wire a still into it and the 2D stream is a throughput node; the pack's docs are explicit that a connected IMAGE passes through unchanged when no media is loaded.- Neither →
Load media, or connect an IMAGE source before queueing.That's a hard error, and it's the message you'll see most while learning the node.
The ui payload is a PNG of the sampled frame, capped at 1024 px, so the panel shows you what was actually sent without a full-resolution copy.
The browser parts you need to know about
This is the node where Genereti's design contract becomes visible: nothing captures or plays by itself. Media loads when you ask it to, playback starts when you press play, and camera or screen devices start from an explicit control. There's no auto-run on page load.
The framing controls share Contain / Cover / Stretch / Native semantics plus match-source / match-output / explicit sizing, and framing is applied before sampling - which is what makes a live frame and a queued frame agree. If your live preview and your queued result look different, framing is the first thing to check.
Animated GIFs progress through the browser's ImageDecoder, so they're genuinely frame-by-frame. Videos depend on your browser's codec support, which is the honest answer and also the annoying one: an obscure container that plays in VLC may not play here. Remote URLs must serve media that's CORS-readable or the frame fetch fails.
Inputs and outputs
capture- STRING, socketless widget, default placeholderGENERETI_OFF:2D stream. Don't type in it.image-IMAGE, optional.image-IMAGEout, the sampled or passed-through frame.
Install
Genereti only. Manager → search Genereti (liuboto) → install → restart → refresh the browser; the media engine is frontend JavaScript.
cd ComfyUI/custom_nodes
git clone https://github.com/languel/genereti.git genereti
cd ..
./.venv/bin/python -m pip install -r custom_nodes/genereti/requirements.txt
ComfyUI's own Python - .venv on a checkout, python_embeded\python.exe on Portable. Requirements are one line, comfyui-frontend-package>=1.53.6: no models, no ffmpeg install, no extra packs. Note the framing: this pack deliberately needs nothing downloaded for its classroom demos, and the optional MediaPipe demo only pulls its browser runtime when you explicitly ask for it. ComfyUI 0.38.2+, Python 3.11+.
Gotchas
- Local files are session resources. Reload the page and you have to reselect them. Saved URLs reload on their own but still don't start playing. Save media into the workflow if you need persistence - or just accept that URLs are the smoother path for shared graphs.
- Codec roulette for video. If a format won't play, that's the browser, not the node. GIFs are the most dependable moving source.
- It does not proxy remote media, and it doesn't embed arbitrary pages - the pack points you at
webviewfor that. - Alpha pack, no community footprint. The name appears nowhere in the Reddit corpus I searched. The README's framing stands: "super alpha - early classroom testing… back up your workflows before updating." This node's docs do include a dated validation pass, which is more than most alpha packs offer, but physical camera behaviour was explicitly not verified there.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| captureopt | STRING | GENERETI_OFF:2D stream | — |
| imageopt | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |