Ruben-BilboX PromptGeek Photo Prompt
Pick the Camera, Film Stock, and Photographer — Then Watch the Prompt Build Itself
- full_composed_prompt
- subject_only
Most photorealistic prompts are a wish list that starts with "photo of" and then you type from memory. This node is the antidote: it hands you the vocabulary a photographer actually uses - film stocks, camera bodies, lighting names, 38 photographers - as dropdowns whose tooltips show a sample photo before you commit. Its data comes from PromptGeek's Creating Photorealistic Images With AI book, and the point is that you don't need to know what "chiaroscuro" means in a prompt; the node shows you.
There's a backstory worth knowing. The original was BilboX's "photographers helper node," posted to r/comfyui in early 2024 and then abandoned. Its main draw - live style previews - broke as ComfyUI's UI evolved. RubenAlba95 (Rubendarr on Reddit) forked it in April 2025, fixed the preview, and this is that fork. So you're getting a node whose entire reason to exist is the part that had rotted.
How it actually works (spoiler: not in Python)
Here's the honest mechanism, because the README doesn't spell it out: the node composes the prompt in your browser, not on the backend. The Python class is basically a passthrough - it loads a JSON of options to populate the dropdowns, then returns whatever's sitting in the preview widget. The real work happens in the pack's frontend extension, which watches the node, stitches your picks into the PromptGeek template, and writes the result into a read-only preview widget. That preview string is what comes out as full_composed_prompt.
The template, from the source: [style] photo of [subject], [framing], [setting_background], [lighting], [camera_angle], [camera_properties], [film_types], [lenses], [filters_effects], in the style of [photographer]. Note the subject placeholder tells you the expected shape: [SUBJECT], [IMPORTANT FEATURE], [MORE DETAILS], [POSE OR ACTION] - you type "a woman in a red coat, freckles, walking through rain," and the dropdowns do the rest.
The inputs and outputs that matter
You set exactly two things by hand and pick the rest from menus:
subject- the only free-text field that's truly yours. This is the heart of the prompt; everything else is garnish.preview- auto-filled and read-only once the frontend is working. Don't fight it.style,framing,lighting,camera_angle,camera_properties,film_types,lenses,filters_effects,photographers- curated dropdowns, roughly 4 to 39 options each. Hover a choice to see an example image and a description.log_prompt- flip to "Yes" and the composed prompt prints to your console. Useful when you're checking what got wired where.
Outputs: full_composed_prompt (STRING) is the finished positive prompt - wire it straight into a CLIP Text Encode. subject_only (STRING) is just your subject text, handy if you want to feed the subject to a separate node like an IPAdapter or a second encode without re-typing it.
Install
It's in the ComfyUI registry, so the easy route is ComfyUI Manager → search "ruben-bilbox-comfyui". Otherwise:
cd ComfyUI/custom_nodes
git clone https://github.com/RubenAlba95/ruben-bilbox-comfyui.git
Then restart ComfyUI. No model files to download. The pack's requirements (colour-science, numpy, imageio, opencv-python) exist for the post-processing nodes that share the pack - the photo prompt node itself is dependency-light, since all its magic lives in the browser. Manager should pull the deps for you; a manual clone may need a pip install -r requirements.txt for the LUT/vignette nodes, not for this one.
Where people get burned
Because composition is browser-side, everything hinges on the frontend extension loading. If preview stays empty, your full_composed_prompt output is empty - that's the classic failure, and it's the exact bug this fork was made to fix. Restart ComfyUI, hard-refresh the browser (Ctrl+Shift+R - cached JS is the usual suspect), and check the browser console for errors.
A couple more from the community thread where the author launched this: Manager's "install from GitHub" occasionally failed to clone for people - use the registry install or the manual clone instead. And one cloud-host user (mimicPC) never got the node to appear at all, which fits - a node that ships a web directory is more fragile on hosted ComfyUI than on your own box.
One thing to know about the pack generally: its __init__.py registers a server endpoint that can shut down or restart the machine. That's a bizarre bonus feature - fine on your localhost, but don't install this on a server you don't fully trust.
My take: this is aimed at the SDXL-era comma-block style of prompting, which is exactly the dialect that still works there. Camera names and film stocks are high-leverage on LLM-encoder models like Flux and Z-Image too, so the vocabulary isn't wasted on newer checkpoints. It's a niche tool and 100% optional - but if you're stuck typing the same "shot on ..." boilerplate by hand, it earns its keep.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| style | COMBO | 19 options: , abstract, analogue, beauty, candid, documentary photography, +13 | |
| subject | STRING | — | |
| framing | COMBO | 5 options: , close up on face, full body, head shot, upper body | |
| setting_background | STRING | — | |
| lighting | COMBO | 21 options: , bounced lighting, candlelight, chiaroscuro, cinematic lighting, soft diffused lighting, +15 | |
| camera_angle | COMBO | 5 options: , dutch angle, from above/high angle, from below/low angle, eye level | |
| camera_properties | COMBO | 21 options: , Aaton LTR, ARRI ALEXA 65, Bolex H16, RED Digital Cinema Camera, Canon EOS 5D, +15 | |
| film_types | COMBO | 13 options: , Agfa Vista, Cinestill 800T, Ektar 100, film grain, Ilford HP5 Plus, +7 | |
| lenses | COMBO | 4 options: , 50mm, 8mm Fisheye Lens, Voigtländer Nokton 50mm f1.1 | |
| filters_effects | COMBO | 20 options: , black and white, color filter, bokeh, desaturated, grunge filter, +14 | |
| photographers | COMBO | 39 options: , Alberto Seveso, Alex Timmermans, Alfred Stieglitz, Ando Fuchs, Anne Brigman, +33 | |
| preview | STRING | — | |
| log_prompt | COMBO | No | 2 options: No, Yes |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| full_composed_prompt | STRING | — |
| subject_only | STRING | — |