Nodes: Ollama, Green Screen to Transparency, Save image for Bjornulf LobeChat, Text with random Seed, Random line from input, Combine images (Background+Overlay alpha), Image to grayscale (black & white), Remove image Transparency (alpha), Resize Image, ...
A list of 162 custom nodes for Comfyui : Display, manipulate, create and edit text, images, videos, loras, generate characters and more.
You can manage looping operations, generate randomized content, trigger logical conditions, pause and manually control your workflows and even work with external AI tools, like Ollama or Text To Speech.
โ ๏ธ Warning : Very active development. Work in progress. ๐
Very active development, new nodes, new features, new ideas, new possibilities...
Let me know if you have any issues, they must be solved for everyone !
Support me, this project and my other AI exciting projects : โค๏ธโค๏ธโค๏ธ https://ko-fi.com/bjornulf โค๏ธโค๏ธโค๏ธ
1 - ๐ Text/Chat AI generation : Bjornulf Lobe Chat Fork
2 - ๐ Speech AI generation : Bjornulf Text To Speech
<u>3 - ๐จ Image AI generation : Bjornulf Comfyui custom nodes (you are here)</u>
1.
๐ Show (Text, Int, Float)
49.
๐น๐ Video Preview
68.
๐ข Add line numbers
71.
๐ Show (Int)
72.
๐ Show (Float)
73.
๐ Show (String/Text)
74.
๐ Show (JSON)
126.
๐ Note
127.
๐ผ๐ Image Note (Load image)
128.
๐ผ๐ Preview (first) image
130.
๐ฅ๐ผ๐ Image Note (Load image)
133.
๐ผ๐ Preview 1-4 images (compare)
2.
โ Write Text
3.
โ๐๐
ฐ๏ธ Advanced Write Text (+ ๐ฒ random option)
4.
๐ Combine Texts
15.
๐พ Save Text
26.
๐ฒ Random line from input
28.
๐ข๐ฒ Text with random Seed
32.
๐ง๐ Character Description Generator
48.
๐๐ฒ Text scrambler (๐ง Character)
67.
๐โโจ Text to Anything
68.
โจโ๐ Anything to Text
75.
๐โ๐ Replace text
15.
๐พ Save Text
111.
โจโ๐ข Anything to Int
112.
โจโ๐ข Anything to Float
113.
๐๐ช Text split in 5
132.
๐๐ช Text split in 10
115.
๐ฅ Load Text From Bjornulf Folder
116.
๐ฅ Load Text From Path
117.
๐๐๐
ฐ๏ธ Line selector (๐ฒ or โป or โป๐)
131.
โ๐ Write Pick Me Chain
136.
๐๐ Text Switch On/Off
138.
๐๐ Select from List
141.
๐โ๐ Global Write Pick Me
142.
๐๐ฅ Load Global Pick Me
144
๐๐ Text Analyzer
81.
๐ฅ๐๐ผ Image Text Generator ๐ผ๐๐ฅ
82.
๐ฉโ๐ฆฐ๐ Text Generator (Character Female)
83.
๐จโ๐ฆฐ๐ Text Generator (Character Male)
84.
๐พ๐ Text Generator (Character Creature)
85.
๐๐บ๐ Text Generator (Character Pose)
86.
๐ง๐จโ๐ง๐ Text Generator (Object for Character)
87.
๐๐ Text Generator (Scene)
88.
๐จ๐ Text Generator (Style)
89.
๐ Text Generator (Outfit Female)
90.
๐ Text Generator (Outfit Male)
91.
โป๐ฅ๐ List Looper (Text Generator)
92.
โป๐๐ List Looper (Text Generator Scenes)
93.
โป๐จ๐ List Looper (Text Generator Styles)
94.
โป๐๐บ๐ List Looper (Text Generator Poses)
95.
โป๐จโ๐ฆฐ๐ฉโ๐ฆฐ๐พ List Looper (Text Generator Characters)
96.
โป๐ List Looper (Text Generator Outfits Male)
97.
โป๐ List Looper (Text Generator Outfits Female)
6.
โป Loop
7.
โป Loop Texts
8.
โป Loop Integer
9.
โป Loop Float
10.
โป Loop All Samplers
11.
โป Loop All Schedulers
12.
โป Loop Combos
27.
โป Loop (All Lines from input)
33.
โป Loop (All Lines from input ๐ combine by lines)
38.
โป๐ผ Loop (Images)
39.
โป Loop (โ๐๐
ฐ๏ธ Advanced Write Text)
42.
โป Loop (Model+Clip+Vae) - aka Checkpoint / Model
53.
โป Loop Load checkpoint (Model Selector)
54.
โป๐ Loop Lora Selector
56.
โป๐ Loop Sequential (Integer)
57.
โป๐ Loop Sequential (input Lines)
90.
โป๐ฅ๐ List Looper (Text Generator)
91.
โป๐๐ List Looper (Text Generator Scenes)
92.
โป๐จ๐ List Looper (Text Generator Styles)
93.
โป๐๐บ๐ List Looper (Text Generator Poses)
94.
โป๐จโ๐ฆฐ๐ฉโ๐ฆฐ๐ List Looper (Text Generator Characters)
95.
โป๐ List Looper (Text Generator Outfits Male)
96.
โป๐ List Looper (Text Generator Outfits Female)
3.
โ๐๐
ฐ๏ธ Advanced Write Text (+ ๐ฒ random option)
5.
๐ฒ Random (Texts)
26.
๐ฒ Random line from input
28.
๐ข๐ฒ Text with random Seed
37.
๐ฒ๐ผ Random Image
40.
๐ฒ Random (Model+Clip+Vae) - aka Checkpoint / Model
41.
๐ฒ Random Load checkpoint (Model Selector)
48.
๐๐ฒ Text scrambler (๐ง Character)
55.
๐ฒ๐ Random Lora Selector
117.
๐๐๐
ฐ๏ธ Line selector (๐ฒ or โป or โป๐)
139.
๐ฒ Random Integer
140.
๐ฒ Random Float
16.
๐พ๐ผ๐ฌ Save image for Bjornulf LobeChat
17.
๐พ๐ผ Save image as tmp_api.png
Temporary API
18.
๐พ๐ผ๐ Save image to a chosen folder name
14.
๐พ๐ผ Save Exact name
123.
๐พ๐
ฐ๏ธ Save Global Variables
29.
๐ฅ๐ผ Load Image with Transparency โข
43.
๐ฅ๐ผ๐ Load Images from output folder
124.
๐ฅ๐
ฐ๏ธ Load Global Variables
13.
๐ Resize Image
22.
๐ฒ Remove image Transparency (alpha)
23.
๐ฒ Image to grayscale (black & white)
24.
๐ผ+๐ผ Stack two images (Background + Overlay)
25.
๐ฉโโข Green Screen to Transparency
29.
โฌ๏ธ๐ผ Load Image with Transparency โข
30.
๐ผโ Cut image with a mask
37.
๐ฒ๐ผ Random Image
38.
โป๐ผ Loop (Images)
43.
โฌ๏ธ๐๐ผ Load Images from output folder
44.
๐ผ๐ Select an Image, Pick
46.
๐ผ๐ Image Details
47.
๐ผ Combine Images
60.
๐ผ๐ผ Merge Images/Videos ๐น๐น (Horizontally)
61.
๐ผ๐ผ Merge Images/Videos ๐น๐น (Vertically)
62.
๐ฆ๐ Ollama Vision
70.
๐ Resize Image Percentage
80.
๐ฉท Empty Latent Selector
146
๐ผ๐น๐ช Split Image/Video Grid
147
๐ผ๐น๐จ Reassemble Image/Video Grid
160.
๐ฆ๐ Ollama Vision Prompt Selector
3.
โ๐๐
ฐ๏ธ Advanced Write Text (+ ๐ฒ random option)
117.
๐๐๐
ฐ๏ธ Line selector (๐ฒ or โป or โป๐)
123.
๐พ๐
ฐ๏ธ Save Global Variables
124.
๐ฅ๐
ฐ๏ธ Load Global Variables
129.
๐๐
ฐ๏ธ Set Variable from Text
40.
๐ฒ Random (Model+Clip+Vae) - aka Checkpoint / Model
41.
๐ฒ Random Load checkpoint (Model Selector)
42.
โป Loop (Model+Clip+Vae) - aka Checkpoint / Model
53.
โป Loop Load checkpoint (Model Selector)
125.
๐๐ Model-Clip-Vae selector (๐ฒ or โป or โป๐)
54.
โป Loop Lora Selector
55.
๐ฒ Random Lora@ Selector
114.
๐ฅ๐ Load Lora with Path
122.
๐ Combine Loras, Lora stack
106.
โ๐จ API Image Generator (FalAI) โ
107.
โ๐จ API Image Generator (CivitAI) โ
108.
โ๐ Add Lora (API ONLY - CivitAI) ๐โ
109.
โ๐จ API Image Generator (Black Forest Labs - Flux) โ
110.
โ๐จ API Image Generator (Stability - Stable Diffusion) โ
151
๐ฅ๐๐ค Load CivitAI Links
98.
๐ฅ Load checkpoint SD1.5 (+Download from CivitAi)
99.
๐ฅ Load checkpoint SDXL (+Download from CivitAi)
100.
๐ฅ Load checkpoint Pony (+Download from CivitAi)
101.
๐ฅ Load checkpoint FLUX Dev (+Download from CivitAi)
102.
๐ฅ Load checkpoint FLUX Schnell (+Download from CivitAi)
103.
๐ฅ๐ Load Lora SD1.5 (+Download from CivitAi)
104.
๐ฅ๐ Load Lora SDXL (+Download from CivitAi)
105.
๐ฅ๐ Load Lora Pony (+Download from CivitAi)
119.
๐ฅ๐๐น Load Lora Hunyuan Video (+Download from CivitAi)
121.
๐พ Huggingface Downloader
20.
๐น Video Ping Pong
21.
๐ผโ๐น Images to Video (FFmpeg Save Video)
49.
๐น๐ Video Preview
50.
๐ผโ๐น Images to Video path (tmp video)
51.
๐นโ๐ผ Video Path to Images
52.
๐๐น Audio Video Sync
58.
๐น๐ Concat Videos
59.
๐น๐ Combine Video + Audio
60.
๐ผ๐ผ Merge Images/Videos ๐น๐น (Horizontally)
61.
๐ผ๐ผ Merge Images/Videos ๐น๐น (Vertically)
76.
โ๐น FFmpeg Configuration ๐นโ
77.
๐น๐ Video details โ
78.
๐นโ๐น Convert Video
79.
๐น๐ Concat Videos from list
119.
๐ฅ๐๐น Load Lora Hunyuan Video (+Download from CivitAi)
146
๐ผ๐น๐ช Split Image/Video Grid
147
๐ผ๐น๐จ Reassemble Image/Video Grid
149
๐พ๐น Save Video (tmp_api.mp4/mkv/webm) โ ๏ธ๐ฃ
19.
๐ฆ๐ฌ Ollama Talk
31.
๐โ๐ TTS - Text to Speech
62.
๐ฆ๐ Ollama Vision
63.
๐ฆ Ollama Configuration โ
64.
๐ฆ Ollama Job Selector ๐ผ
65.
๐ฆ Ollama Persona Selector ๐ง
66.
๐โ๐ STT - Speech to Text
118.
๐ TTS Configuration โ
160.
๐ฆ๐ Ollama Vision Prompt Selector
31.
๐โ๐ TTS - Text to Speech
52.
๐๐น Audio Video Sync
59.
๐น๐ Combine Video + Audio
66.
๐โ๐ STT - Speech to Text
118.
๐ TTS Configuration โ
120.
๐โ๐ Kokoro - Text to Speech
134.
134 - ๐โถ Play Audio
145
๐โถ Audio Preview (Audio player)
148
๐พ๐ Save Audio (tmp_api.wav/mp3) โ ๏ธ๐ฃ
34.
๐งน Free VRAM hack
137.
๐๐ฒ Global Seed Manager
143
๐งฎ Basic Math
35.
โธ๏ธ Paused. Resume or Stop, Pick ๐
36.
โธ๏ธ Paused. Select input, Pick ๐
117.
๐๐๐
ฐ๏ธ Line selector (๐ฒ or โป or โป๐)
135.
๐โจ Anything Switch On/Off
136.
๐๐ Text Switch On/Off
45.
๐ If-Else (input / compare_with)
150
[Coming soon] ๐จ๐ Style Selector (๐ฒ or โป or โป๐) + Civitai urn
152
[Coming soon] ๐พ Save Tensors (tmp_api.pt) โ ๏ธ๐ฃ
153
[Coming soon] ๐ฅ Load Tensor (tmp_api.pt)
154
[Coming soon] ๐ฎ Remote VAE Decoder
155
[Coming soon] ๐ฎ Remote VAE Decoder (Tiled)
156
[Coming soon] ๐ฅ๐ฎ Load from Base64
157
[Coming soon] ๐ฎโก Execute Workflow
158
[Coming soon] ๐ฅ๐ฎ๐ Text Manager Api (Execute Workflow)
159
[Coming soon] ๐ฅ๐๐น Video Text Generator ๐น๐๐ฅ
161
[Coming soon] ๐ง๐ง Fix Face
162
[Coming soon] ๐ง Face Settings [Fix Face] โ
Comfyui is great for local usage, but I sometimes need more power than what I have...
I have a computer with a 4070 super with 12GB and flux fp8 simple wokflow take about ~40 seconds. With a 4090 in the cloud I can run flux fp16 in ~12 seconds. (There are of course also some workflow that I can't even run locally.)
My referal link for Runpod : https://runpod.io?ref=tkowk7g5 (If you use that i will have a commission, at no extra cost for you.)
If you want to use my nodes and comfyui in the cloud (and can install more stuff), I'm managing an optimized ready-to-use template on runpod : https://runpod.io/console/deploy?template=r32dtr35u1&ref=tkowk7g5
Template name : bjornulf-comfyui-allin-workspace
, can be operational in ~3 minutes. (Depending on your pod, setup and download of extra models or whatever not included.)
You need to create and select a network volume before using that, size is up to you, i have 50Gb Storage because i use cloud only for Flux or lora training on a 4090. (~0.7$/hour)
โ ๏ธ When pod is ready, you need to open a terminal in browser (After clicking on connect
from your pod) and use this to launch ComfyUI manually : cd /workspace/ComfyUI && python main.py --listen 0.0.0.0 --port 3000
or the alias start_comfy
(Much better to control it with a terminal, check logs, etc...)
After that you can just click on the Connect to port 3000
button.
As file manager, you can use the included JupyterLab
on port 8888.
If you have any issues with it, please let me know.
It will manage everything in Runpod network storage (/workspace/ComfyUI
), so you can stop and start the cloud GPU without losing anything, change GPU or whatever.
Zone : I recommend EU-RO-1
, but up to you.
Top-up your Runpod account with minimum 10$ to start.
โ ๏ธ Warning, you will pay by the minute, so not recommended for testing or learning comfyui. Do that locally !!!
Run cloud GPU only when you already have your workflow ready to run.
Advice : take a cheap GPU for testing, downloading models or settings things up.
To download checkpoint or anything else, you need to use the terminal.
For downloading from Huggingface (get token here https://huggingface.co/settings/tokens).
Here is example for everything you need for flux dev :
huggingface-cli login --token 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
huggingface-cli download black-forest-labs/FLUX.1-dev flux1-dev.safetensors --local-dir /workspace/ComfyUI/models/unet
huggingface-cli download comfyanonymous/flux_text_encoders clip_l.safetensors --local-dir /workspace/ComfyUI/models/clip
huggingface-cli download comfyanonymous/flux_text_encoders t5xxl_fp16.safetensors --local-dir /workspace/ComfyUI/models/clip
huggingface-cli download black-forest-labs/FLUX.1-dev ae.safetensors --local-dir /workspace/ComfyUI/models/vae
To use Flux you can just drag and drop in your browser comfyui interface the .json from my github repo : workflows/FLUX_dev_troll.json
, direct link : https://github.com/justUmen/ComfyUI-BjornulfNodes/blob/main/workflows/FLUX_dev_troll.json.
For downloading from civitai (get token here https://civitai.com/user/account), just copy/paste the link of checkpoint you want to download and use something like that, with your token in URL :
CIVITAI="8b275fada679ba5812b3da2bf35016f6"
wget --content-disposition -P /workspace/ComfyUI/models/checkpoints "https://civitai.com/api/download/models/272376?type=Model&format=SafeTensor&size=pruned&fp=fp16&token=$CIVITAI"
If you want to download for example the entire output folder, you can just compress it :
cd /workspace/ComfyUI/output && tar -czvf /workspace/output.tar.gz .
Then you can download it from the file manager JupyterLab.
If you have any issues with this template from Runpod, please let me know, I'm here to help. ๐
Check requirements.txt
for the latest dependencies.
First you need to find this python_embedded python.exe
, then you can right click or shift + right click inside the folder in your file manager to open a terminal there.
This is where I have it, with the command you need :
H:\ComfyUI_windows_portable\python_embeded> .\python.exe -m pip install ollama pydub opencv-python ffmpeg-python civitai-py fal_client sounddevice langdetect spacy textblob dill
When you have to install something else, you can retake the same code and install the dependency you want :
.\python.exe -m pip install whateveryouwant
You can then run comfyui.
Move to the custom_node folder and do : pip install -r requirements.txt
OR
pip install ollama
(you can also install ollama if you want : https://ollama.com/download) - You don't need to really install it if you don't want to use my ollama node. (BUT you need to run pip install ollama
)pip install pydub
(for TTS node)pip install opencv-python
If you want to use a python virtual environment only for comfyUI, which I recommended, you can do that for example (also pre-install pip) :
sudo apt-get install python3-venv python3-pip
python3 -m venv /the/path/you/want/venv/bjornulf_comfyui
Once you have your environment in this new folder, you can activate it with and install dependencies inside :
source /the/path/you/want/venv/bjornulf_comfyui/bin/activate
cd custom_nodes/Bjornulf_custom_nodes
pip install -r requirements.txt
Then you can start comfyui with this environment (notice that you need to re-activate it each time you want to launch comfyui) :
cd /where/you/installed/ComfyUI && python main.py
ollama_ip.txt
in the comfyui custom nodes folder. Minor changes, add details/updates to README.scrambler/scrambler_character.json
in the comfyui custom nodes folder.Description:
The show node will only display text, or a list of several texts. (read only node)
3 types are managed : Green is for STRING type, Orange is for FLOAT type and blue is for INT type. I put colors so I/you don't try to edit them. ๐คฃ
Update 0.61 : You now also have 4 other nodes to display format specific values : INT, FLOAT, STRING and JSON (STRING)
These are convenient because these are automatically recommended on drag and drop.
Description:
Simple node to write text / send text to another node.
Below is a simple example of how to use the write text node with a show node :
Description:
Advanced Write Text node allows for special syntax to accept random variants, like {hood|helmet}
will randomly choose between hood or helmet.
You also have seed
and control_after_generate
to manage the randomness.
It is also displaying the text in the comfyui console. (Useful for debugging)
Example of console logs :
Raw text: photo of a {green|blue|red|orange|yellow} {cat|rat|house}
Picked text: photo of a green house
You can also create and reuse variables with this syntax : <name>
.
Usage example :
โ 0.76 - New syntax available :
Groups, with no duplicate, example : {left|right|middle|group=LMR}+{left|right|middle|group=LMR}+{left|right|middle|group=LMR}
Random based on percentage : {A(80%)|B(15%)|C(5%)}
โ 0.77 - New syntax available :
2 {apple|orange|banana|static_group=FRUIT}s, one {apple|orange|banana|static_group=FRUIT} on the left, one {apple|orange|banana|static_group=FRUIT} on the right
Description:
Combine multiple text inputs into a single output. (can have separation with : comma, space, new line or nothing.)
Description:
Generate and display random text from a predefined list. Great for creating random prompts.
You also have control_after_generate
to manage the randomness.
Description:
โ ๏ธ Warning : DEPRECATED, this node doesn't work anymore.
Latest comfyui version just refuse to output 2 times the same value.
General-purpose loop node, you can connect that in between anything.
It has an optional input, if no input is given, it will loop over the value of the STRING "if_no_input" (take you can edit).
โ Careful this node accept everything as input and output, so you can use it with texts, integers, images, mask, segs etc... but be consistent with your inputs/outputs.
Do not use this Loop if you can do otherwise.
This is an example together with my node 28, to force a different seed for each iteration :
Description:
Cycle through a list of text inputs.
Here is an example of usage with combine texts and flux :
Description:
Iterate through a range of integer values, good for steps
in ksampler, etc...
โ Don't forget that you can convert ksampler widgets to input by right-clicking the ksampler node :
Here is an example of usage with ksampler (Notice that with "steps" this node isn't optimized, but good enough for quick testing.) :
Description:
Loop through a range of floating-point numbers, good for cfg
, denoise
, etc...
Here is an example with controlnet, trying to make a red cat based on a blue rabbit :
Description:
Iterate over all available samplers to apply them one by one. Ideal for testing.
Here is an example of looping over all the samplers with the normal scheduler :
Description:
Iterate over all available schedulers to apply them one by one. Ideal for testing. (same idea as sampler above, but for schedulers)
Description:
Generate a loop from a list of my own custom combinations (scheduler+sampler), or select one combo manually.
Good for testing.
Example of usage to see the differences between different combinations :
Description:
Resize an image to exact dimensions. If height or width is set to 0, it will keep the aspect ratio.
The other node will save the image to the exact path.
โ ๏ธ๐ฃ Warning : The image will be overwritten if it already exists.
Description:
Save the given text input to a file. Useful for logging and storing text data.
If the file already exist, it will add the text at the end of the file.
I recommend you to keep saving them in "Bjornulf/Text" (Which is in the Comfyui folder, next to output), this is where the node 116 Load text from folder
is looking for text files.
Description:
โ I made that node for my custom lobe-chat to send+receive images from Comfyui API : lobe-chat
It will save the image in the folder output/BJORNULF_LOBECHAT/
.
The name will start at api_00001.png
, then api_00002.png
, etc...
It will also create a link to the last generated image at the location output/BJORNULF_API_LAST_IMAGE.png
.
This link will be used by my custom lobe-chat to copy the image inside the lobe-chat project.
tmp_api.png
Temporary API โ ๏ธ๐ฃDescription:
Save image for short-term use : ./output/tmp_api.png โ ๏ธ๐ฃ
Description:
Save image in a specific folder : my_folder/00001.png
, my_folder/00002.png
, etc...
Also allow multiple nested folders, like for example : animal/dog/small
.
Description:
Use Ollama inside Comfyui. (Require the backend Ollama to be installed and currently running.)
Use by default the model llama3.2:3b
and the URL http://0.0.0.0:11434
. (For custom configuration, use node 63)
Example of basic usage :
Example of usage with context, notice that with context you can follow up a conversation, "there" is clearly understood as "Bucharest" :
You can also use use_context_file
(set to True), this will save the context in a file : ComfyUI/Bjornulf/ollama_context.txt
.
This way you can keep using the context without having to connect many nodes connected to each other, just run the same workflow several times.
Step 1 : Notice that for now context is empty, so it will be the first message in ComfyUI/Bjornulf/ollama_context.txt
:
Step 2 : Notice that now the number of lines in context file has changed (These are the same as the updated_context
):
Step 3 : Notice that the number of lines keep incrementing.
When clicking the reset Button
, it will also save the context in : ComfyUI/Bjornulf/ollama_context_001.txt
, ComfyUI/Bjornulf/ollama_context_002.txt
, etc...
โ ๏ธ If you want to have an "interactive" conversation, you can enable the option waiting_for_prompt
.
When set to True, it will create a Resume
button, use this to unpause the node and process the prompt.
Step 1: I run the workflow, notice that Show node is empty, the node is pausing the workflow and is waiting for you to edit the prompt. (Notice that at this moment, it is asking for the capital of France.)
Step 2: I edit the prompt to change France into China, but the node won't process the request until you click on Resume.
Step 3: I click on Resume button, this is when the request is done. Notice that it used China and not France.
Other options :
control_after_generate
to force the node to rerun for every workflow run. (Even if there is no modification of the node or its inputs.)max_tokens
to reduce the size of the answer, a token is about 3 english characters.โ ๏ธ Warning : Using vram_retention_minutes
might be a bit heavy on your VRAM. Think about if you really need it or not. Most of the time, when using vram_retention_minutes
, you don't want to have also a generation of image or anything else in the same time.
Description:
Create a ping-pong effect from a list of images (from a video) by reversing the playback direction when reaching the last frame. Good for an "infinity loop" effect.
Description:
Combine a sequence of images into a video file.
โ I made this node because it supports transparency with webm format. (Needed for rembg)
Temporary images are stored in the folder ComfyUI/temp_images_imgs2video/
as well as the wav audio file.
Description:
Remove transparency from an image by filling the alpha channel with a solid color. (black, white or greenscreen)
Of course it takes in an image with transparency, like from rembg nodes.
Necessary for some nodes that don't support transparency.
Description:
Convert an image to grayscale (black & white)
Example : I sometimes use it with Ipadapter to disable color influence.
But you can sometimes also want a black and white image...
Description:
Stack two images into a single image : a background and one (or several) transparent overlay. (allow to have a video there, just send all the frames and recombine them after.)
Update 0.11 : Add option to move vertically and horizontally. (from -50% to 150%)
โ Warning : For now, background
is a static image. (I will allow video there later too.)
โ ๏ธ Warning : If you want to directly load the image with transparency, use my node ๐ผ Load Image with Transparency โข
instead of the Load Image
node.
Description:
Transform greenscreen into transparency.
Need clean greenscreen ofc. (Can adjust threshold but very basic node.)
Description:
Take a random line from an input text. (When using multiple "Write Text" nodes is annoying for example, you can use that and just copy/paste a list from outside.)
You can change fixed/randomize for control_after_generate
to have a different text each time you run the workflow. (or not)
Description:
Iterate over all lines from an input text. (Good for testing multiple lines of text.)
Description:
โ This node is used to force to generate a random seed, along with text.
But what does that mean ???
When you use a loop (โป), the loop will use the same seed for each iteration. (That is the point, it will keep the same seed to compare results.)
Even with randomize
for control_after_generate
, it is still using the same seed for every loop, it will change it only when the workflow is done.
Simple example without using random seed node : (Both images have different prompt, but same seed)
So if you want to force using another seed for each iteration, you can use this node in the middle.
For example, if you want to generate a different image every time. (aka : You use loop nodes not to compare or test results but to generate multiple images.)
Use it like that for example : (Both images have different prompt AND different seed)
Here is an example of the similarities that you want to avoid with FLUX with different prompt (hood/helmet) but same seed :
Here is an example of the similarities that you want to avoid with SDXL with different prompt (blue/red) but same seed :
FLUX : Here is an example of 4 images without Random Seed node on the left, and on the right 4 images with Random Seed node :
Description:
Load an image with transparency.
The default Load Image
node will not load the transparency.
Description:
Cut an image from a mask.
Description:
Use my TTS server to generate high quality speech from text, with any voice you want, any language.
Listen to the audio example
โ Node never tested on windows, only on linux for now. โ
Use my TTS server to generate speech from text, based on XTTS v2.
โ Of course to use this comfyui node (frontend) you need to use my TTS server (backend) : https://github.com/justUmen/Bjornulf_XTTS
I made this backend for https://github.com/justUmen/Bjornulf_lobe-chat, but you can use it with comfyui too with this node.
After having Bjornulf_XTTS
installed, you NEED to create a link in my Comfyui custom node folder called speakers
: ComfyUI/custom_nodes/Bjornulf_custom_nodes/speakers
That link must be a link to the folder where you installed/stored the voice samples you use for my TTS, like default.wav
.
If my TTS server is running on port 8020 (You can test in browser with the link http://localhost:8020/tts_stream?language=en&speaker_wav=default&text=Hello) and voice samples are good, you can use this node to generate speech from text.
Details
This node should always be connected to a core node : Preview audio
.
My node will generate and save the audio files in the ComfyUI/Bjornulf_TTS/
folder, followed by the language selected, the name of the voice sample, and the text.
Example of audio file from the screenshot above : ComfyUI/Bjornulf_TTS/Chinese/default.wav/ไฝ ๅไบๅ.wav
You can notice that you don't NEED to select a chinese voice to speak chinese. Yes it will work, you can record yourself and make yourself speak whatever language you want.
Also, when you select a voice with this format fr/fake_Bjornulf.wav
, it will create an extra folder fr
of course. : ComfyUI/Bjornulf_TTS/English/fr/fake_Bjornulf.wav/hello_im_me.wav
. Easy to see that you are using a french voice sample for an english recording.
control_after_generate
as usual, it is used to force the node to rerun for every workflow run. (Even if there is no modification of the node or its inputs.)
overwrite
is used to overwrite the audio file if it already exists. (For example if you don't like the generation, just set overwrite to True and run the workflow again, until you have a good result. After you can set it to back to False. (Paraphrasing : without overwrite set to True, It won't generate the audio file again if it already exists in the Bjornulf_TTS
folder.)
autoplay
is used to play the audio file inside the node when it is executed. (Manual replay or save is done in the preview audio
node.)
So... note that if you know you have an audio file ready to play, you can still use my node but you do NOT need my TTS server to be running.
My node will just play the audio file if it can find it, won't try to connect th backend TTS server.
Let's say you already use this node to create an audio file saying workflow is done
with the Attenborough voice :
As long as you keep exactly the same settings, it will not use my server to play the audio file! You can safely turn the TTS server off, so it won't use your precious VRAM Duh. (TTS server should be using ~3GB of VRAM.)
Also connect_to_workflow
is optional, it means that you can make a workflow with ONLY my TTS node to pre-generate the audio files with the sentences you want to use later, example :
If you want to run my TTS nodes along side image generation, i recommend you to use my PAUSE node so you can manually stop the TTS server after my TTS node. When the VRAM is freed, you can the click on the RESUME button to continue the workflow.
If you can afford to run both at the same time, good for you, but Locally I can't run my TTS server and FLUX at the same time, so I use this trick. :
Description:
Generate a character description based on a json file in the folder characters
: ComfyUI/custom_nodes/Bjornulf_custom_nodes/characters
Make your own json file with your own characters, and use this node to generate a description.
โ For now it's very basic node, a lot of things are going to be added and changed !!!
Some details are unusable for some checkpoints, very much a work in progress, the json structure isn't set in stone either.
Some characters are included.
Description:
Sometimes you want to loop over several inputs but you also want to separate different lines of your output.
So with this node, you can have the number of inputs and outputs you want. See example for usage.
Description:
So this is my attempt at freeing up VRAM after usage, I will try to improve that.
For me, on launch ComfyUI is using 180MB of VRAM, after my clean up VRAM node it can go back down to 376MB.
I don't think there is a clean way to do that, so I'm using a hacky way.
So, not perfect but better than being stuck at 6GB of VRAM used if I know I won't be using it again...
Just connect this node with your workflow, it takes anything as input and return it as output.
You can therefore put it anywhere you want.
โ Comfyui is using cache to run faster (like not reloading checkpoints), so only use this free VRAM node when you need it.
โ For this node to work properly, you need to enable the dev/api mode in ComfyUI. (You can do that in the settings)
It is also running an "empty/dummy" workflow to free up the VRAM, so it might take a few seconds to take effect after the end of the workflow.
Description:
Automatically pause the workflow, and rings a bell when it does. (play the audio bell.m4a
file provided)
You can then manually resume or stop the workflow by clicking on the node's buttons.
I do that let's say for example if I have a very long upscaling process, I can check if the input is good before continuing. Sometimes I might stop the workflow and restart it with another seed.
You can connect any type of node to the pause node, above is an example with text, but you can send an IMAGE or whatever else, in the node input = output
. (Of course you need to send the output to something that has the correct format...)
Description:
Automatically pause the workflow, and rings a bell when it does. (play the audio bell.m4a
file provided)
You can then manually select the input you want to use, and resume the workflow with it.
You can connect this node to anything you want, above is an example with IMAGE. But you can pick whatever you want, in the node input = output
.
Description:
Just take a random image from a list of images.
Description:
Loop over a list of images.
Usage example : You have a list of images, and you want to apply the same process to all of them.
Above is an example of the loop images node sending them to an Ipadapter workflow. (Same seed of course.)
Description:
If you need a quick loop but you don't want something too complex with a loop node, you can use this combined write text + loop.
It will take the same special syntax as the Advanced write text node {blue|red}
, but it will loop over ALL the possibilities instead of taking one at random.
0.40 : You can also use variables <name>
in the loop.
Description:
Just simply take a trio at random from a load checkpoint node.
Notice that it is using the core Load checkpoint node. It means that all checkpoint will be preloaded in memory.
Details :
Check node number 41 before deciding which one to use.
Description:
This is another way to select a load checkpoint node randomly.
It will not preload all the checkpoints in memory, so it will be slower to switch between checkpoints.
But you can use more outputs to decide where to store your results. (model_folder
is returning the last folder name of the checkpoint.)
I always store my checkpoints in a folder with the type of the model like SD1.5
, SDXL
, etc... So it's a good way for me to recover that information quickly.
Details :
CLIP Set Last Layer
node set at -2 for a specific model, or a separate vae or clip.) Aka : All models are going to share the exact same workflow.Check node number 40 before deciding which one to use.
Node 53 is the loop version of this node.
NOTE : If you want to load a single checkpoint but want to extract its folder name (To use the checkpoint name as a folder name for example, or with if/else node), you can use my node 41 with only one checkpoint. (It will take one at random, so... always the same one.)
Description:
Loop over all the trios from several checkpoint node.
Description:
Quickly select all images from a folder inside the output folder. (Not recursively.)
So... As you can see from the screenshot the images are split based on their resolution.
It's also not possible to edit dynamically the number of outputs, so I just picked a number : 4.
The node will separate the images based on their resolution, so with this node you can have 4 different resolutions per folder. (If you have more than that, maybe you should have another folder...)
To avoid error or crash if you have less than 4 resolutions in a folder, the node will just output white tensors. (white square image.)
So this node is a little hacky for now, but i can select my different characters in less than a second.
If you want to know how i personnaly save my images for a specific character, here is part of my workflow (Notice that i personnaly use / for folders because I'm on linux) :
In this example I put "character/" as a string and then combine with "nothing". But it's the same if you do "character" and then combine with "/". (I just like having a / at the end of my folder's name...)
If you are satisfied with this logic, you can then select all these nodes, right click and Convert to Group Node
, you can then have your own customized "save character node" :
Here is another example of the same thing but excluding the save folder node :
โ ๏ธ If you really want to regroup all the images in one flow, you can use my node 47 Combine images
to put them all together.
Description:
Select an image from a list of images.
Useful in combination with my Load images from folder and preview image nodes.
You can also of course make a group node, like this one, which is the same as the screenshot above :
Description:
Complex logic node if/else system.
If the input
given is equal to the compare_with
given in the widget, it will forward send_if_true
, otherwise it will forward send_if_false
. (If no send_if_false
it will return None
.)
You can forward anything, below is an example of forwarding a different size of latent space depending if it's SDXL or not.
Here is an example of the node with all outputs displayed with Show text nodes :
send_if_false
is optional, if not connected, it will be replaced by None
.
If-Else are chainables, just connect output
to send_if_false
.
โ ๏ธ Always simply test input
with compare_with
, and connect the desired value to send_if_true
. โ ๏ธ
Here a simple example with 2 If-Else nodes (choose between 3 different resolutions).
โ Notice that the same write text node is connected to both If-Else nodes input :
Let's take a similar example but let's use my Write loop text node to display all 3 types once :
If you understood the previous examples, here is a complete example that will create 3 images, landscape, portrait and square :
Workflow is hidden for simplicity, but is very basic, just connect latent to Ksampler, nothing special.)
You can also connect the same advanced loop write text node with my save folder node to save the images (landscape/portrait/square) in separate folders, but you do you...
Description:
Display the details of an image. (width, height, has_transparency, orientation, type)
RGBA
is considered as having transparency, RGB
is not.
orientation
can be landscape
, portrait
or square
.
Description:
Combine multiple images (A single image or a list of images.)
If you want to merge several images into a single image, check node 60 or 61.
There are two types of logic to "combine images". With "all_in_one" enabled, it will combine all the images into one tensor.
Otherwise it will send the images one by one. (check examples below) :
This is an example of the "all_in_one" option disabled (Note that there are 2 images, these are NOT side by side, they are combined in a list.) :
But for example, if you want to use my node select an image, pick
, you need to enable all_in_one
and the images must all have the same resolution.
You can notice that there is no visible difference when you use all_in_one
with preview image
node. (this is why I added the show text
node, note that show text will make it blue, because it's an image/tensor.)
When you use combine image
node, you can actually also send many images at once, it will combine them all.
Here is an example with Load images from folder
node, Image details
node and Combine images
node. (Of course it can't have all_in_one
set to True in this situation because the images have different resolutions) :
Here another simple example taking a few selected images from a folder and combining them (For later processing for example) :
Description:
Take text as input and scramble (randomize) the text by using the file scrambler/character_scrambler.json
in the comfyui custom nodes folder.
Description:
This node takes a video path as input and displays the video.
Description:
This node will take a list of images and convert them to a temporary video file.
โ Update 0.50 : You can now send audio to the video. (audio_path OR audio TYPE)
Description:
This node will take a video path as input and convert it to a list of images.
In the above example, I also take half of the frames by setting frame_interval
to 2.
Note that i had 16 frames, on the top right preview you can see 8 images.
Description:
This node is an overengineered node that will try to synchronize the duration of an audio file with a video file.
โ Video ideally needs to be a loop, check my ping pong video node if needed.
The main goal of this synchronization is to have a clean transition between the end and the beginning of the video. (same frame)
You can then chain up several video and they will transition smoothly.
Some details, this node will :
It is good like for example with MuseTalk https://github.com/chaojie/ComfyUI-MuseTalk
Here is an example of the Audio Video Sync
node, notice that it is also convenient to recover the frames per second of the video, and send that to other nodes. (Spaghettis..., deal with it. ๐ If you don't understand it, you can test it.) :
โ Update 0.50 : audio_duration is now optional, if not connected it will take it from the audio.
โ Update 0.50 : You can now send the video with a list of images OR a video_path, same for audio : AUDIO or audio_path.
New v0.50 layout, same logic :
Description:
This is the loop version of node 41. (check there for similar details)
It will loop over all the selected checkpoints.
โ The big difference with 41 is that checkpoints are preloaded in memory. You can run them all faster all at once.
It is a good way to test multiple checkpoints quickly.
Description:
Loop over all the selected Loras.
Above is an example with Pony and several styles of Lora.
Below is another example, here with flux, to test if your Lora training was undertrained, overtrained or just right :
Description:
Just take a single Lora at random from a list of Loras.
Description:
This loop works like a normal loop, BUT it is sequential : It will run only once for each workflow run !!!
The first time it will output the first integer, the second time the second integer, etc...
When the last is reached, the node will STOP the workflow, preventing anything else to run after it.
Under the hood it is using a single file counter_integer.txt
in the ComfyUI/Bjornulf
folder.
โ Do not use more than one node like this one in a workflow, because they will share the same counter_integer.txt
file. (unexpected behaviour.)
Update 0.57: Now also contains the next counter in the reset button.
Description:
This loop works like a normal loop, BUT it is sequential : It will run only once for each workflow run !!!
The first time it will output the first line, the second time the second line, etc...
You also have control of the line with +1 / -1 buttons.
When the last is reached, the node will STOP the workflow, preventing anything else to run after it.
Under the hood it is using the file counter_lines.txt
in the ComfyUI/Bjornulf
folder.
Here is an example of usage with my TTS node : when I have a list of sentences to process, if i don't like a version, I can just click on the -1 button, tick "overwrite" on TTS node and it will generate the same sentence again, repeat until good.
โ Do not use more than one node like this one in a workflow, because they will share the same counter_lines.txt
file. (unexpected behaviour.)
Update 0.57: Now also contains the next counter in the reset button.
If you want to be able to predict the next line, you can use node 68, to Add line numbers.
Description:
Take two videos and concatenate them. (One after the other in the same video.)
Convert a video, can use FFMPEG_CONFIG_JSON. (From node 76 / 77)
Description:
Simply combine video and audio together.
Video : Use list of images or video path.
Audio : Use audio path or audio type.
Description:
Merge images or videos horizontally.
Here is one possible example for videos with node 60 and 61 :
Description:
Merge images or videos vertically.
Here is one possible example for videos with node 60 and 61 :
Description:
Take an image as input and will describe the image. Uses moondream
by default, but can select anything with node 63, and a custom prompt with node 161.
Description:
Use custom configurations for Ollama Talk and Vision.
You can change the ollama Url and the model used.
Some vision models can also do text to a certain extent.
Example of a Ollama Vision Node
and Ollama Talk Node
using the same Ollama Configuration Node
:
Description:
Select a personnality for your Ollama Talk Node, set it to None
for just chat.
If you want to write your own, just set it to None
and write your prompt as prefix.
Description:
Select a personnality for your Ollama Talk Node.
If you want to write your own, just set it to None
and write your prompt as prefix.
Below, an example of a crazy scientist explaining gravity. (Notice that the LLM was smart enough to understand the typo) :
Description:
Use faster-whisper
to transform an AUDIO type or audio_path into text. (Autodetect language)
โ ๏ธ Warning, this node is not compatible with python 3.13
, you need to use 3.12
. (As a gereneral rule, comfyui ecosystem still recommend you to use 3.12 : https://github.com/comfyanonymous/ComfyUI?tab=readme-ov-file#manual-install-windows-linux.)
(faster-whisper was removed from requirements.txt and must be installed manually.)
If you really want to use that node, you are responsible for installing that manually : pip install faster-whisper
.
Description:
Sometimes you want to force a node to accept a STRING.
You can't do that for example if the node is taking a LIST as input.
This node can be used in the middle to force a STRING to be used anyway.
Below is an example of that with my TTS node.
Description:
Sometimes you want to force something to be a STRING.
Most outputs are indeed text, even though they might be unusable.
This node ignore this fact and simply convert the input to a simple STRING.
Description:
This node will just add line numbers to text.
Useful when you want to use node 57 that will loop over input lines. (You can read/predict the next line.)
Description:
Resize an image by percentage.
Description:
Basic node, show an INT. (You can simply drag any INT node and it will be recommended.)
Description:
Basic node, show a FLOAT. (You can simply drag any FLOAT node and it will be recommended.)
Description:
Basic node, show a STRING. (You can simply drag any STRING node and it will be recommended.)
Description:
This node will take a STRING and format it as a readable JSON. (and pink)
Description:
Replace text with another text, allow regex and more options, check examples below :
0.70 ๏ผ Text replace now have multiline option for regex.
Description:
Create a FFMPEG_CONFIG_JSON, it will contains a JSON that can be used by other nodes :
Description:
Extract details from a video_path.
You can use the all-in-one FFMPEG_CONFIG_JSON with other nodes or just use the other variables as your want.
Description:
Convert a video, can use FFMPEG_CONFIG_JSON.
Description:
Take a list of videos (one per line) and concatenate them. (One after the other in the same video.)
Can use FFMPEG_CONFIG_JSON. (From node 76 / 77)
Description:
Tired of setting up latent space manually ?
Select one from my custom list of formats.
Just connect that to your KSampler.
Description:
Main node to generate content, doesn't really do much by itself, just camera angle
and multicharacter action
. (For example : ... eat picnic, view from above.
)
BUT, you can connect others Text Generator Nodes
to it.
โ ๏ธ Warning for "Text Generator" : This node is JUST writing text, text is then interpreted by a checkpoint (SD1.5, SDXL, Flux...) to generate an image.
Some models are very bad at doing some things, so DON'T EXPECT for everything you do to work properly all the time with every checkpoints or loras. (This node was made with FLUX in mind.)
Below is a Tutorial on how to use all my Text Generator nodes
. I did that small tutorial in 8 steps:
Step 1 : You use the main Text Generator node, it will write general details about the image (here camera_angle
and shot_type
) - For now I just combine the text to a simple "write text" that will send swamp monster
:
Step 2 : Add a specific style to your image :
Step 3 : Add scene/background to your image :
Step 4 : Add a character to the scene using a character node, instead of the Write text Node.
I will remove the "swamp monster" from the "write text node" and use my Character Node instead, I will use it to create an agressive dragon with lighting powers :
Step 5 : Character nodes (Male/Female and creatures) can contain more than one character. (But they will share the same characteristics)
Below I removed the dragon and I created 2 "Character male" fighting by using the multi_char_action
from the main node. (You can set it to CUSTOM and write your own action too.)
Step 5 : Let's try to add a location for the character, I want to put it on the left of the image. Here is a failure with the SDXL model I have been using all along :
Step 6 : Switch to FLUX to test the location_on_image
feature (which is working) :
Step 7 : Switch to API black Forest Lab with FLUX Ultra, using my API custom node 109.
If you want several characters with different characteristics (like location_on_image
or whatever), you can chain several Character Nodes together by connecting them to each other.
You can see below that I asked for 2 tiny dragons on the left and a zombie on the right.
Step 8 : And to end this tutorial, I will disable the Zombie, I will add an outfit (here a floral armor
), I will also add a pose
node for the character and also connect this pose node to an object
node. (They will together make the character hold a book
and put his hand on chin
)
Description:
Generate text related to female characters.
Need to be connected to "Text Generator" main node.
โ ๏ธ For "Text Generator" tutorial see node 81.
Description:
Generate text related to male characters.
โ ๏ธ For "Text Generator" tutorial see node 81.
Description:
Generate text related to creatures. (characters)
โ ๏ธ For "Text Generator" tutorial see node 81.
Description:
Generate text related to the pose of characters.
โ ๏ธ For "Text Generator" tutorial see node 81.
Description:
Generate text related to an object connected to a pose, that is connected to a character.
โ ๏ธ For "Text Generator" tutorial see node 81.
Description:
Generate text related to a specific scene, connects directly to the main text generator.
โ ๏ธ For "Text Generator" tutorial see node 81.
Description:
Generate text related to a specific style, connects directly to the main text generator.
โ ๏ธ For "Text Generator" tutorial see node 81.
Description:
Generate text related to a specific female outfit.
โ ๏ธ For "Text Generator" tutorial see node 81.
Description:
Generate text related to a specific male outfit.
โ ๏ธ For "Text Generator" tutorial see node 81.
Description:
Loop made to loop over elements for the main node text generator.
All the List Looper
nodes have the same logic, you should be able to use them all the same way.
Here is an example with node 92 (list looper scenes), looping over all the different weather_condition
:
โ ๏ธ Note, if you want to Loop over the elements One by One
, Not all-in one, DO NOT use this list looper nodes
!!
You can just convert the element you want as input and double click to create a new node that you can set to "increment".
Example, here you can see that the value was "incremented", aka changed to the next from the list, the next run will then have the next value from the list (and so on) :
Description:
Loop made to loop over elements for the node scenes.
โ ๏ธ For "List Looper" tutorial see node 91.
Description:
Loop made to loop over elements for the node style.
โ ๏ธ For "List Looper" tutorial see node 91.
Description:
Loop made to loop over elements for the node poses.
โ ๏ธ For "List Looper" tutorial see node 91.
Description:
Loop made to loop over elements for the node charceter (male/female/creature).
โ ๏ธ For "List Looper" tutorial see node 91.
Description:
Loop made to loop over elements for the node for male outfits.
โ ๏ธ For "List Looper" tutorial see node 91.
Description:
Loop made to loop over elements for the node for female outfits.
โ ๏ธ For "List Looper" tutorial see node 91.
Description:
This is the same as a basic "Load checkpoint" node, but the list is from civitai (not your local folder).
It will also download the file from civitai if you don't have it on your computer yet. (You need an api token from your account. - Find yours on civitai.com settings. -)
This is the sd1.5
version, it will download the models in : ComfyUI/models/checkpoints/Bjornulf_civitAI/sd1.5
After downloading, you can keep using this node as is to load your checkpoint, or use the downloaded model from a basic "Load checkpoint" node.
Description:
This is the same as a basic "Load checkpoint" node, but the list is from civitai (not your local folder).
It will also download the file from civitai if you don't have it on your computer yet. (You need an api token from your account. - Find yours on civitai.com settings. -)
This is the sdxl_1.0
version, it will download the models in : ComfyUI/models/checkpoints/Bjornulf_civitAI/sdxl_1.0
After downloading, you can keep using this node as is to load your checkpoint, or use the downloaded model from a basic "Load checkpoint" node.
Description:
This is the same as a basic "Load checkpoint" node, but the list is from civitai (not your local folder).
It will also download the file from civitai if you don't have it on your computer yet. (You need an api token from your account. - Find yours on civitai.com settings. -)
This is the pony
version, it will download the models in : ComfyUI/models/checkpoints/Bjornulf_civitAI/pony
After downloading, you can keep using this node as is to load your checkpoint, or use the downloaded model from a basic "Load checkpoint" node.
Description:
This is the same as a basic "Load checkpoint" node, but the list is from civitai (not your local folder).
It will also download the file from civitai if you don't have it on your computer yet. (You need an api token from your account. - Find yours on civitai.com settings. -)
This is the flux_d
version, it will download the models in : ComfyUI/models/checkpoints/Bjornulf_civitAI/flux_d
After downloading, you can keep using this node as is to load your checkpoint, or use the downloaded model from a basic "Load checkpoint" node.
๐ง Work in progress, need to manually clean up list, diffusers, etc.. ? ๐ง
Description:
This is the same as a basic "Load checkpoint" node, but the list is from civitai (not your local folder).
It will also download the file from civitai if you don't have it on your computer yet. (You need an api token from your account. - Find yours on civitai.com settings. -)
This is the flux_s
version, it will download the models in : ComfyUI/models/checkpoints/Bjornulf_civitAI/flux_s
After downloading, you can keep using this node as is to load your checkpoint, or use the downloaded model from a basic "Load checkpoint" node.
๐ง Work in progress, need to manually clean up list, diffusers, etc.. ? ๐ง
Description:
This is the same as a basic "Load lora" node, but the list is from civitai (not your local folder).
It will also download the file from civitai if you don't have it on your computer yet. (You need an api token from your account. - Find yours on civitai.com settings. -)
This is the sd_1.5
version, it will download the lora in : ComfyUI/models/loras/Bjornulf_civitAI/sd_1.5
After downloading, you can keep using this node as is to load your lora, or use the downloaded lora from a basic "Load lora" node.
Below is an example with Lora "Colorize" :
Description:
This is the same as a basic "Load lora" node, but the list is from civitai (not your local folder).
It will also download the file from civitai if you don't have it on your computer yet. (You need an api token from your account. - Find yours on civitai.com settings. -)
This is the sdxl_1.0
version, it will download the lora in : ComfyUI/models/loras/Bjornulf_civitAI/sdxl_1.0
After downloading, you can keep using this node as is to load your lora, or use the downloaded lora from a basic "Load lora" node.
Below is an example with Lora "Better faces" :
Description:
This is the same as a basic "Load lora" node, but the list is from civitai (not your local folder).
It will also download the file from civitai if you don't have it on your computer yet. (You need an api token from your account. - Find yours on civitai.com settings. -)
This is the pony
version, it will download the lora in : ComfyUI/models/loras/Bjornulf_civitAI/pony
After downloading, you can keep using this node as is to load your lora, or use the downloaded lora from a basic "Load lora" node.
Description:
Generate images with only a token.
This is the fal.ai
version and will save the image in ComfyUI/output/API/CivitAI/
Description:
Generate images with only a token.
This is the civit.ai
version and will save the image in ComfyUI/output/API/CivitAI/
โ ๏ธ Warning : Civitai isn't the best reliable API, sometimes it doesn't answer, or take long time to answer, some urn don't answer as well as others, etc...
Use it at your own risks, I do not recommend running anything "costly" using their API, like Flux Ultra, etc... (Use the website instead with blue buzz)
API requests (like from this node) are using yellow buzz.
Description:
Use lora with the API, below is an example to see clearly with the same seed the different with/without/lora.
Description:
Generate an image with the Black Forest Labs API. (flux)
Description:
Generate an image with the Stability API. (sd3)
Description:
Just convert anything to a valid INT. (integer)
Description:
Just convert anything to a valid FLOAT. (floating number)
Description:
Take a single input and split it in 5 with a delimiter (newline by default).
It can also ignore everything on the left side of a =
symbol if you want to use a "variable type format".
Description:
Load a lora by using it's path.
Here is a complex practical example using node 113, 114, 112 :
Description:
Just select a file from the folder Bjornulf/Text
folder, it will recover its content.
It is made to be used with node 15 Save Text
.
Description:
Just give the path of the file, it will recover its content.
If you want, with Load Text From Path
you can also recover the elements in "Bjornulf/Text" by just adding it:
Description:
Select a line from input text. If set to 0 it will take a line at random.
If line taken at random,. it will not take a line starting with the symbol #
.
So use that if you want to ignore a line.
โ 0.76 - New syntax available :
Groups, with no duplicate, example : {left|right|middle|group=LMR}+{left|right|middle|group=LMR}+{left|right|middle|group=LMR}
Random based on percentage : {A(80%)|B(15%)|C(5%)}
โ 0.77 - New syntax available :
2 {apple|orange|banana|static_group=FRUIT}s, one {apple|orange|banana|static_group=FRUIT} on the left, one {apple|orange|banana|static_group=FRUIT} on the right
Description:
New optional configuration node to connect to TTS node, it can request a list of speakers for a given language and replace in the main TTS node :
Description:
Take a CivitAI Lora to use with Hunyuan. (NSFW list not on github of course.)
The workflow below is included : workflows/HUNYUAN_basic_lora.json
) :
Description:
โ 0.76 - Due to some compatibility issues with other custom now, you now need to install it manually if you want to use it : pip install kokoro_onnx
Another Text to Speech node based on Kokoro. : https://github.com/thewh1teagle/kokoro-onnx
Lightweight, much simpler, no configuration and fully integrated into Comfyui. (No external backend to run.)
Description:
This node allows you to download models/vae/unet etc... directly from huggingface with your access token.
Description:
If you want to have multiple loras in a single node, well this is it.
Description:
So if you know how to use variables with my nodes, this node gives you the opportunity to create global variables.
This node is very simple, it will just append (or overwrite) the file : Bjornulf/GlobalVariables.txt
(You can edit that manually if you want.)
Description:
This node will load the global variables as text from the file Bjornulf/GlobalVariables.txt
.
Here is an example of usage save/load :
Description:
If you want to use and manage multiple models/clip/vae : this is the universal node for it.
You can run them in a LOOP, one at RANDOM, a LOOP SEQUENTIAL (one at a time for each workflow run) and even SELECT a specific one.
Description:
Sometimes I want to add a NOTE but I want this note to be connected to a specific spaghetti.
So you can use this to write details about a specific connection, it will move with it.
You can do whatever you want of course, below is an example about HunYuan video generation. (You can quickly switch connection to the rest of your workflow, depending on what you want to run.)
Description:
You can use this node to have it show a previously generated image and some custom text. (Use image_path or IMAGE type.)
You can use the text to display the prompt used to generate the image for example. It's behavior is like a "Preview image" node. (See node 130 if you want a behavior similar to "Load image")
Sometimes I want to display an image to explain what something specific is doing visually. (For example a stack of loras will have a specific style.)
Here is a complex example on how i use that, for a list of loras stacks. (I then "select" a style by using node 125 - Model-Clip-Vae selector
)
0.77 Multiline + image is now an issue on newer comfyui versions. Replaced with single line notes, couldn't find any clean js hack to solve the layout issue...
Description:
This node can display a preview of an image...
0.77 Multiline + image is now an issue on newer comfyui versions. Replaced with single line notes, couldn't find any clean js hack to solve the layout issue...
Description:
This node will just quickly transform a text in another text which can be quickly used for all my variables nodes.
Here is an example below with "Advanced write text", but you can use with all of them, global variables, etc...
Description:
This node is quite similar to the node 127. But this one uses LoadImage instead of a preview system.
So if you want to have a "preview" before you launch workflow one time, you can use this one.
It's behaviour is like a "Load image" node.
Description:
So this is a new "write text" node.
But with a twist. You can connect them to each other and when clicking on the PICK ME button, it will disable all other write text node of the chain and activate only the one you click on. (It will turn green.)
So with this node, you can switch from one prompt to another by the click of a button !!
Not limited to one line, you can use list, variables, etc... but below is a simple example :
Description:
Same as node 113, but split in 10 parts.
One day I had 6, and got stuck with the split in 5 node, so i guess it can be useful sometimes, let's make one with 10...
Description:
Cool node that you can use to compare several images.
The middle is a cursor that you can move wherever you want by just clicking on the image.
Below is an example, you can see that at this size/resolution, 25% is almost as good as the initial image.
Here is a zoom on the same image :
Description:
This node will just play a bell.
For example, if you have a workflow that takes a while and you want to be alerted every time it's over.
You can connect to it a custom path of an audio file :
Or send it an AUDIO type format :
Description:
Basic switch that will not send anything if toggled off.
below is an example with the compatible "combine image node", here you can see that the top image was ignored.
Description:
Tired of disconnecting nodes you don't want for a moment ?
Maybe you are working on this input, but your workflow isn't ready for it yet ?
Well now you can quickly enable / disable it. (If disabled you will see it in red.)
If connected with my combine text node, you can use a special option ONLY_ME_combine_text
that will tell combine text to write ONLY the selected node. It will ignore all the others. (Here will appear in blue.) :
Description:
Seed manager.
It is :
Description:
Select quickly an element from a LIST. (a STRING with elements separated by ; by default) Example of LIST : a;b;c;d
Below is an example for quickly selecting the third seed used by Global Seed Manager :
Description:
Simply return an INT in between the 2 values provided.
Description:
Simply return a FLOAT in between the 2 values provided.
Description:
Do you enjoy Pick Me chain nodes ?
This one is using IDENTIFIERS (global_pickme_id) instead of connections.
Just pick up a name as global_pickme_id and if the nodes have the same global_pickme_id they will automatically connect to each other.
Below is an example of write + load :
Description:
The node used to recover the values from PICK ME global write nodes.
It will return the value from the currently selecte global_pickme_id.
This node also automatically return a random value from the list with the global_pickme_id.
Below is an example of write + load :
Description:
Basic node for basic math.
Addition, multiplication...
Here is an example that I use to detect the number of "missing" frames in a video, compared to another video :
Description:
Display details about an input text.
You can use it just to recover the number of characters, you can then for example use this number to avoid too long prompts and avoid OOM :
Or extract more details about dialog and sentiment polarity of it. (For example, if you want a specific TTS voice for positive/neutral/negative.) :
Description:
Simple preview audio node that can take as input an audio_path, mp3 or wav.
Description:
This node will split a grid of images or videos into separate images or videos.
Below is an example with a grid of 6 images, it will split them into 6 separate images (3 rows X 3 columns) :
Why do I need that ? Sometimes I have several characters in a single image/video.
When I want to apply lip sync to a character, I need to split them into separate images/videos where4 the character is located, create the lip sync, and then reassemble them with node 147.
Or just to save VRAM, by processing only the part of the image that I need.
Description:
Reassemble an image/video that was grid split with node 146.
Will need to take the same grid size as input.
You can apply changes to a specific element of the grid, and then reassemble them.
You can select each part individually.
But there is also a "special" part, the MODIFIED one.
This part is selected with the MODIFIED_part and the MODIFIED_part_index (part number, if index set to 2, it will use part_2
).
Below is an example where I modify part_2 and reassmbling it. (Without using part_2 output but selectionning it using 2 as MODIFIED_part_index) :
You can also work directly with part_2, but twith this setup you can quickly switch in between parts without changing the node layout.
Below is an example where I show you that you can also influence different parts "manually". (Here, I just send part_1 to replace part 7,8,9.)
For reassembling videos it might get tricky.
For example if you used the node 52 - ๐๐น Audio Video Sync
, the modified part might be shorter/longer, change FPS etc...
You can try to re-synchronize them all if the duration was modified.
In this situation you need to use the reference_video_part_index
to select the reference video part. (Probably the same as the MODIFIED_part_index.)
Description:
Temporary save for an audio file, mp3 or wav.
Useful if you want to synchronize data in between API calls from several Comfyui instances. (Used in the background by my API nodes, like node 157 ๐ฎโก Execute Workflow
, to exchange audio files. - raw/processed -)
You can send audio_path (This will create file tmp_api.mp3
) :
Or an AUDIO type (This will create file tmp_api.wav
) :
Note that if you are sending an AUDIO type, this node will save it as a wav
file. (Even if your selection is an mp3 file.)
Description:
Temporary save for a video file, mp4, mkv or webm.
Useful if you want to synchronize data in between API calls from several Comfyui instances. (Used in the background by my API nodes, like node 157 ๐ฎโก Execute Workflow
, to exchange video files. - raw/processed -)
Description:
A new Universal node for selecting styles.
Also contains some informations for Civitai urn. (Need test and better "database" of good/fast models, i recommended you to send the urns you like manually.)
Here is an example of usage with CivitAI API node :
Here is a slightly more complex example using model urns :
NOTE : CivitAI can be particularly slow !! So you can use the option DO_NOT_WAIT instead with an optional "links_file".
It will create a file with the links to recover the generated images later with the node 151.
So you can make as many requests as you want, and come back another time to recover the images with this txt file.
Note that you can also send the LIST directly with all the values.
If you do that you can later recover the values like text and use the "autosave" option of node 151.
It will take the style and make a folder for it. Example from the image above : ./ComfyUI/output/civitai_autosave/Cinematic_photography/
It is very useful if you use node 150 as a LOOP, you can recover the images later and organise them automatically in separate folders according to the selected style.
Description:
This node must be used after using the node 150 + DO_NOT_WAIT + links_file.
When saving DO_NOT_WAIT and the "links_file" from the node 150, it will create a txt file in "ComfyUI/Bjornulf/civitai_links/", you can load them with this node.
Below are the images recovered from the file "11_mars.txt":
If you used from node 150 the LIST_from_style_selector
you can later recover the values and use the "autosave" option of node 151.
It will take the style and make a folder for it. Example from the image above : ./ComfyUI/output/civitai_autosave/Cinematic_photography/
It is very useful if you use node 150 as a LOOP, you can recover the images later and organise them automatically in separate folders according to the selected style.
Description:
This is BETA, it will save a tensor in a file.
The goal is to optimize the VRAM usage by saving tensors in files.
Description:
This is BETA, it will load a tensor.
The goal is to optimize the VRAM usage by saving tensors in files.
Description:
Simple node to decode a VAE model from a remote machine.
The VAE decode node doesn't have to be on the same machine, so if you have a remote machine and want to save the VRAM, you can use that.
The remote machine need to have my custom nodes too.
Description:
Same as 154 but with tiled version.
Description:
This is BETA, it is used to recovered some values between Comfyui instances.
Description:
This is the start of a complex new environment and this is in BETA.
The goal of this node is to run a workflow on another Comfyui instance and recover what was generated.
For now it supports image/sound/video.
It can do anything that a normal workflow can do.
Create an image, create a video, upscale an image, etc...
I will share custom JSON and a lot more cool stuff for my Kofi supporters. (https://ko-fi.com/bjornulf)
Keep in touch for more informations... Wip...
Basically use run heavy duty workflows on another machine, and recover the results.
Below is an example of a lipsync workflow that I run on another Comfyui instance. (For now local network only, but will run on runpod too.)
I use that on my laptop (192.168.1.23), that recovers the results from my "ai dedicated" desktop machine (192.168.1..100) :
Description:
This is BETA.
This node need to be used to create functional workflows to run with node 157.
It is communicating with node 157 from another Comfyui instance.
Description:
This is BETA.
This is the start of a new node that will generate a video prompt.
It's goal is to be like the "Text Generator" node, but for videos.
The "old" Text Generator main node 81 is now renamed for image only : ๐ฅ๐๐ผ Image Text Generator ๐ผ๐๐ฅ.
Description:
New layout prompt selector for Ollama Vision.
Ollama vision is now divided in 2 separate nodes.
Description:
This is BETA.
First node of a new collection of "Fix Images" nodes.
Quickly fix, control and edit faces. (and more)
Here is a zoom of that :
You can also give specific text and custom denoise for each faces :
You can also select a specific face, if set at 0 it will do all the faces, but below I set it to 1 :
This node can also fix the whole person, but i will likely make another separate node for that later :
You can preview the nodes effects very well with my Preview Image node, You can clearly see here the white box that is the detected "person" :
In the future I will make a system to "inject" a specific reusable character, probably connected to loras or suchs.
Description:
Connect to Fix Face node to modify a specific face.