ꘇ Window / Screen Capture
Share a window into ComfyUI, deliberately
- image
This is the node that turns "anything I can put on screen" into an IMAGE socket. A game, a video call, a Spout-ish app's window, a PDF, a browser tab - press play, pick the source in the browser's own share dialog, and the latest sampled frame flows into your graph. It's the ordinary browser getDisplayMedia path, wrapped in a node that stays out of the way until you ask it to start.
It's an Input node in ꘇ Genereti (languel/genereti, by Liuboto, MIT, super-alpha). The pack's whole posture is that capture, audio and inference all start explicitly and never as a side effect of opening a workflow, and this node is the clearest example of that policy.
How it works, and the one field that confuses people
The schema has a single optional input, capture, and you never wire it - it's socketless, carrying a browser widget rather than a socket. Its default value is the literal string GENERETI_OFF:Window / Screen. That's not a filename; it's a sentinel. It exists so ComfyUI's preflight validation doesn't declare the node a missing wire before you've started sharing anything.
When you press the play control, the browser asks which window, tab or display to share, and the node samples frames. On Queue, the browser uploads a fresh temporary file for that run - the node fingerprints its input on the upload name, so each queue samples again rather than replaying a stale cache. The execute path then loads that file, converts it to RGB, and hands back a BHWC tensor batched as one.
Two consequences fall out of that mechanism, and both are worth knowing before you build on it:
- You get RGB. The loader converts to RGB explicitly, so alpha is gone. If you need transparency, capture something else.
- The
capturewidget is a placeholder between queues. Until you start sharing, queueing this node raisesSelect and start the Window / Screen source before queueing this workflow.That error is the design working.
Also note the sibling node ꘇ Input Source (GeneretiInputSelect, same category), which selects between Doodle, Webcam and Window / Screen inputs and evaluates only the selected one, lazily. The screen capture's own description says capture "is uploaded only when Window / Screen is the selected Genereti input" - so in a multi-source graph, starting the share isn't enough; you also have to have Window / Screen selected there. Skip that and you'll wonder why the upload never happens.
What you'd use it for
Screen capture into a creative-coding graph is a genre. The obvious uses: re-processing a game or a video player through TOP operators, feeding a talking-head call into perception nodes, grabbing a slide deck as a texture. Less obvious but more useful in practice - capturing another app's output as a live source, which is how you get around ComfyUI having no native video-file-to-live-frames path that behaves nicely.
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 capture widget ships in the pack's browser bundle, so you need the post-install refresh (and a restart first, since a refresh can't reload Python). ComfyUI 0.38.2+, Python 3.11+, recent browser. No models.
Gotchas
Nothing starts on its own. Not when the workflow loads, not when you queue, not when the graph is opened. Press the play control. If you're on a fresh browser, you'll also get the OS/browser permission prompt - the pack's verification notes mention that physical capture start/stop still needed a manual user test, so treat first-run permission behavior as something to check on your own machine rather than a known-good path.
Frame rate is whatever the browser gives you. Sample-based capture through a share stream is not a fixed-rate video source. If a downstream node needs a cap, throttle it there (the perception nodes have their own max_fps).
Restart before you refresh. It's the same ritual as the rest of this pack, and it's the answer to about half the "the node looks broken" reports: stop ComfyUI, restart it, hard-refresh the page.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| captureopt | STRING | GENERETI_OFF:Window / Screen | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |