dark HUB Prompt Library
The image-first prompt shelf you sync from GitHub
- prompt
- title
- preview_url
If you've ever stared at a CLIP Text Encode and thought "what was that prompt I liked last week?", you've already met the problem this node exists for. Prompt management is the least glamorous problem in ComfyUI - r/StableDiffusion still gets threads asking "how do you actually keep track of prompts that work?" and the answer is usually some guy's homemade JSON file. dark HUB Prompt Library (darkHUB) is that homemade JSON file, productized: a single node that holds a catalog of prompts, shows you a preview image for each one, and can sync the whole list from a GitHub-hosted JSON. Pick an entry in the UI, and the node hands you the prompt text to feed your sampler.
It's one node in a one-node pack, and it's brand new - zero community footprint so far, so treat this as early-version advice. The idea is solid, though: most prompt-browser nodes are text list boxes. This one is image-first, which is the right call for a photorealistic workflow where you're browsing by mood ("which of these looks like the shot I want?") rather than by keyword.
How it works
The mechanism is refreshingly simple and needs no models, no API keys, and no heavy dependencies. darkHUB fetches a catalog JSON from catalog_url - by default the pack's own catalog/prompts.json on raw.githubusercontent.com - and parses it into {id, title, prompt, image} entries. It caches the fetched catalog for 30 seconds, resolves your prompt_id against it, and serves preview images through ComfyUI's own backend (/darkhub/api/...), which proxies remote images and enforces a 5 MB cap. A SHA-256 fingerprint in IS_CHANGED means the node only re-runs when the resolved prompt or catalog actually changes - no needless re-queues.
The clever bit is the fallback chain. sync_mode is an enum with three values: remote_first (try remote, fall back to local), local_only (never touch the network), and remote_only. If the remote fetch fails - GitHub raw down, no internet, blocked proxy - it silently falls back to the shipped local catalog, and if that misses the id, it uses the fallback_prompt you stored in the workflow. That last one is the workflow-portability trick: your workflow file carries a working prompt even if every catalog disappears.
The inputs that matter
Four inputs, and honestly only two you'll touch most days:
prompt_id- the id of the catalog entry to resolve. The UI sets it when you click an item, so you rarely type it.catalog_url- point this at your own GitHub raw JSON to replace the default catalog. You can even paste a repo URL; the node normalizesblob/links to raw automatically.fallback_prompt- the workflow-stored emergency prompt.sync_mode- setlocal_onlyif you're offline or don't trust the remote.
Outputs are three strings: prompt, title, and preview_url. Wire prompt into a CLIP Text Encode's text input and you're done; the other two are handy for a Note node or logging.
Installing it
The README says ComfyUI Manager will work "once this repository is published to the Comfy Registry" - which, as of writing, it isn't. So the real way today is manual:
cd ComfyUI/custom_nodes
git clone https://github.com/Cyber05CC/dark-HUB.git
cd dark-HUB && pip install -r requirements.txt
Then restart ComfyUI. The only Python requirement is aiohttp, which ComfyUI already ships, so the pip step is usually a no-op. No model files to download, no CUDA anything.
Where people get burned
Honest warning: the shipped catalog and the default fallback_prompt are unapologetically explicit adult content - think "photorealistic, uncensored, no professional studio look" as a deliberate style. That's the author's target audience (the pack's Telegram is darken_HUB), not a bug. But it means two things: don't demo this on a shared screen before swapping catalog_url, and if you're at all squeamish, replace the catalog with your own JSON in the first five minutes. The format is just {"prompts": [{"id", "title", "prompt", "image"}]}.
The other gotcha is the 30-second cache. Edit your remote JSON and the node won't see it for half a minute, which feels like "it's broken" until you know. And the 8-second fetch timeout means a slow connection just triggers the local fallback - check the console for the warning if prompts seem stuck on defaults. None of this is fatal; it's early software with a clean idea, and for the "keep my prompts in sync across machines" itch it scratches well.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt_id | STRING | fashion-editorial | — |
| catalog_url | STRING | https://raw.githubusercontent.com/Cyber05CC/dark-HUB/main/catalog/prompts.json | — |
| fallback_prompt | STRING | Photorealistic close-up photograph taken with a standard iPhone camera (natural smartphone quality, good sharpness, realistic lighting, slight natural grain and depth of field, no professional studio look, exactly like a casual iPhone 15/16 snapshot), indoor room with visible ceiling lights. A beautiful young woman with long straight brown hair, light skin, subtle makeup, and seductive direct gaze at the camera is lying back with legs spread wide. She wears a white sheer lace bra with delicate floral embroidery and a small pink bow in the center, plus a matching white lace thong pulled completely to the side, fully exposing her vagina. One hand with clean French manicure (white nail tips) rests on her inner thigh. Extreme high-definition uncensored close-up focus on her vagina: detailed pink inner labia slightly parted and glistening with natural moisture and a little creamy fluid, visible clitoris hood and texture, realistic skin pores, natural folds, subtle redness and wetness, every detail sharp and explicit with no blurring, no censorship, no pixelation, full anatomical visibility in perfect HD clarity. Natural indoor lighting, realistic skin tones and shadows exactly as captured by an iPhone camera. | — |
| sync_mode | COMBO | remote_first | 3 options: remote_first, local_only, remote_only |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| prompt | STRING | — |
| title | STRING | — |
| preview_url | STRING | — |