Updated: Mar 26, 2026
toolDownload
1 variant available
Introduction
(Note: English is not my native language, so I used AI assistance to help translate and polish this tutorial)
In this tutorial, I want to show the workflow I currently use for my image generation process.
This is not something I built in a single day. I developed it gradually over time, testing different nodes, settings, and small adjustments until I found a setup that gave me a good balance between quality, control, and performance.
One important point is that I work with a relatively weak GPU with only 8 GB of VRAM. Because of that, I had to build a workflow that could still produce good results without relying on very heavy tools or unnecessarily demanding methods.
That is also why this workflow does not use SD Upscale. While it can be useful, it is also heavier, and with my hardware it is not the most practical choice. I preferred to focus on a simpler pipeline that is easier to run and still capable of producing solid results even on a lower-VRAM setup.
I decided to publish 2 variants of this workflow:
a base version
a fixed version of the base workflow, for people who may have issues with one specific node
I still recommend reading the full tutorial before using the files directly, because understanding what each stage does makes it much easier to choose the right version and adapt it to your own setup.
In the next sections, I will go through the process step by step.
1. Model, LoRA Setup and Guidance
This first block contains the core setup of the workflow: the checkpoint, the LoRA loaders, and the guidance subgraph.

Checkpoint
The checkpoint is loaded through a simple node and acts as the base model for the whole workflow.
LoRA Setup
Right after the checkpoint, I use a dedicated LoRA subgraph.

One of the main reasons I built it this way is convenience and readability.
This setup allows me to see both:
the LoRA file name
the trigger words / keywords associated with that LoRA
This makes the workflow easier to manage, especially when working with multiple LoRAs or when switching between different characters, outfits, or enhancement LoRAs.

As shown in the image, one example is my OC Yuki LoRA.
In that block, I can quickly check the file name, adjust the LoRA strength, and also see the keywords needed to activate it properly in the prompt.
That is useful because it reduces guesswork and makes it easier to keep the prompt consistent with the LoRA being used.
At the moment, I included 8 LoRA blocks, which is enough for my current use case.
Of course, this part is fully expandable, so if you need more LoRA slots, you can extend it without much difficulty.
Of course, if you only want to use a few LoRAs, simply bypass the others by clicking the second icon shown in the image.

Guidance Subgraph
The last part of this block is the guidance subgraph.
Inside it, I included:
Dynamic Thresholding
Skimmed CFG
FreeU
At the moment, I am not using FreeU actively, because I am still testing it and I have not found values that I consider fully reliable for my workflow yet.
The other two, Dynamic Thresholding and Skimmed CFG, are more advanced and can be harder to explain clearly in a short tutorial.
Because of that, I will not go too deep into their technical behavior here.
What I can say is that both can have a noticeable impact on the final result, so if you want to experiment with them, do it carefully.
My recommendation is to change the values very gradually, increasing or decreasing them only a little at a time, because even small adjustments can produce visible differences in the image.
For further explanation about this block, feel free to ask ChatGPT for more detailed information.
2. Basic Generation Settings

This block contains the main generation settings: CFG, seed, image size, sampler, orientation, and aspect ratio.
The CFG value is set here, and thanks to the guidance setup from the previous block, I can also work with higher CFG values more comfortably, sometimes even around 10, depending on the image and the model.
For the empty latent image size, I recommend starting with a relatively higher base resolution, like in my example. This helps produce a stronger first result already in the first KSampler pass, with better structure and overall image quality from the start.
I also added orientation and aspect ratio settings in this block. These make it easier to control the overall framing of the image from the beginning. Depending on your needs, the orientation can be set manually, for example portrait or landscape, but it can also be randomized if you want more variation across generations.
For the seed, you can choose either:
a fixed seed if you want repeatability
a random seed if you want more variation between generations
As for the sampler, that often comes down to personal preference. In many cases, it is also worth following the recommendations given by the creator of the checkpoint you chose in the first block.
3. Prompt and Embeddings

This block is quite straightforward.
Here you will find:
one box for the positive prompt
one box for the negative prompt
6 embedding slots for the positive side
6 embedding slots for the negative side
There is nothing especially complicated here. This is simply the section where you build the main prompt structure of the image and add any embeddings you want to use.
Each embedding slot can be bypassed (CTRL+B) depending on your needs, and you can also adjust its intensity directly in the node. This gives you a bit more control without having to rewrite the prompt every time.
4. First KSampler Pass

In this block, you will find the KSampler I personally prefer to use for the first pass.
The main reason I like this version is that it lets me preview the image in real time while it is being generated, which makes the workflow more comfortable to use and easier to monitor.
Another useful detail is that this KSampler already includes a decode step inside the node, so it can output the image directly without needing a separate VAE Decode node afterward. The important thing is to make sure the VAE is connected to the KSampler, which in my workflow is already handled through the Anything Everywhere connection behind the checkpoint loader.
For the scheduler, this is mostly up to personal preference. Different samplers and schedulers behave differently, so I recommend choosing the combination that fits your taste and also checking the suggestions provided by the creator of the checkpoint when available.
As for the number of steps, in my case I usually need at least 50 steps with the scheduler I use. That said, this is not a fixed rule. It depends on the sampler, the scheduler, and the kind of result you want, so feel free to adjust it based on your own preferences and workflow.
5. Second Pass / First Upscale

This is the first upscale stage of the workflow.
For this part, I use this specific KSampler setup because it includes a script input that allows me to run a latent upscale while also connecting an upscaler model, as in my case. Another useful feature is that it can also load a ControlNet model, which helps keep the image more coherent during the upscale and refinement stage.
I especially find this useful for more difficult images, such as complex poses or compositions where I want to preserve the original structure more reliably. In those cases, ControlNet can help maintain pose, shapes, and even colors more consistently.
To use this script correctly, the KSampler on the right should have:
denoise set to 0
steps set to 1
This is important because the actual settings for this stage are controlled inside the script node, not in the KSampler itself.
The main values you will usually want to adjust in the script are:
denoise
hires steps
These are the settings that most directly affect the final quality of the upscaled result.
When I use ControlNet, I often work with a slightly higher denoise value, since the ControlNet helps keep the image under control. However, you should still be careful with the number of steps, because higher values can increase generation time quite a lot.
For the upscale amount, I personally would not recommend going much beyond 2x. The main reasons are generation time and decoding limitations. This KSampler also supports tiled decode, which can help, but above 2x upscale you may start to see more artifacts or other image problems.
To the right of the KSampler, there is also an Image Comparer node, which lets you compare the image before and after the upscale, so you can clearly see what changed during this stage.
It is also worth mentioning that this script node can be problematic. Some users are not able to use it correctly or may run into compatibility issues. That is exactly why I created a second version of the workflow that does not rely on this node. The downside is that, without it, ControlNet cannot be used during this stage.
6. Eye Detailer


This step is dedicated to improving the eyes, which are one of the most important focal points in the final image.
There is not much to explain here from a workflow perspective: the purpose of this block is simply to refine the eye area and improve clarity, sharpness, and overall detail.
As with some of the previous advanced nodes, this block includes several settings that can noticeably affect the result. If you want to modify the values, I recommend changing them carefully and testing them gradually.
For more detailed explanations about the settings in this block, feel free to ask ChatGPT for additional help.
7. Third KSampler Pass

This is the third KSampler pass, although in most cases I leave it bypassed.
There is not much more to explain compared to the previous upscale stage. The main purpose of this pass is to further refine micro-details and increase the resolution even more. In some images, this can noticeably improve smaller details and give the final result a more polished look.
That said, this step also makes the process significantly slower, so I do not use it all the time. It can be helpful for certain images, but it can also introduce new problems if used too aggressively, so I recommend being careful with it.
I also do not recommend using ControlNet in this stage, because the generation time becomes extremely long and usually is not worth it.
Inside this group, there is also an automatic bypass mechanism that disables another node later in the workflow when this group is active. Because of that, it is important to always bypass the entire group itself, rather than only disabling single nodes inside it.
8. Upscale Node

This upscale node is only activated when the third KSampler pass is disabled.
Its purpose is to enlarge the image and improve the overall clarity of the result. In my case, I use RealESRGAN_x4plus_anime_6B, which works well for anime-style images and often helps make the image look cleaner and sharper after upscaling.
So this node acts as a simpler final upscale option when I decide not to use the third KSampler pass.
This block is used for the final image polishing and color correction stage.
At this point, the main generation process is already complete, so this section is focused on small visual adjustments that improve the final presentation of the image.
In this updated version, the block includes the following steps:
Image Color Match for adjusting the overall color relationship based on a reference
Olm Image Adjust for fine control over brightness, contrast, gamma, shadows, midtones, highlights, saturation, value, and vibrance
CR Color Tint for applying a subtle color tint when needed
Image Sharpen for adding a final sharpening pass
Start/final preview node for comparing the image before and after the correction stage
This part is much more subjective than the previous stages, so I do not think there is a single correct set of values. The settings used here will depend heavily on the specific image and on the final look you want to achieve.
For that reason, I recommend treating this block as a final polishing step and adjusting the values based on your own taste.
The preview / comparison node in this section also makes it easier to clearly evaluate the changes before saving the final result.
10. Save Node

Finally, this is the save node.
Here you can choose:
the file name
the output folder
the image format
the quality settings
the metadata options
Regarding metadata, you can decide whether to save:
the full workflow
only the generation values / parameters
or no metadata at all
So this block is simply the final export stage, where you decide how the finished image will be saved.
11. ControlNet

This is the ControlNet block, and it is connected to the first pass of the workflow.
That means it should be activated at the beginning of the generation process, when the image has not been created yet. Its purpose is to guide the model toward a more specific pose or structure from the start. It is especially useful when the composition is difficult and you want stronger control over the initial result.
In this setup, you can choose up to 3 preprocessors.
Most of the time, I only use one or two of them together, so if the third one is not needed, I simply bypass it. This helps reduce unnecessary processing time, so if you are not using a preprocessor, make sure to bypass it.
Inside the Multi-ControlNet Stack node, you can control:
the strength of each ControlNet
when it starts affecting the generation
when it stops affecting the generation
This gives you a lot of flexibility. For example, you can let ControlNet strongly guide the image at the beginning, then stop it later so the model has more freedom during the rest of the generation.
Also, try to match the pose you want to achieve as closely as possible with the prompt itself, so make sure to write the prompt carefully.
Just make sure to keep the On / Off switches consistent with the preprocessors you are actually using.
One important note: in the example shown here, I did not use ControlNet for the final image, so this section is only included for reference. The settings you see in the screenshot are not the ones used for the generation shown in the tutorial.
Fixed Version
I created this second fixed version of the workflow for users who may have problems with the script node used in the base version.
In this version, the second pass uses a simpler upscale setup. Instead of relying on the script-based upscale node, the image is first upscaled with a standard upscale model and then refined through the second-pass KSampler.
Because of that, the settings for this stage must be adjusted directly inside the KSampler, not in a separate script node.
The main downside is that ControlNet cannot be used in this stage the same way it can in the base workflow. However, this version is more practical for users who run into compatibility issues and still want a working alternative.
So if you use this version, you simply need to tune the values inside the KSampler itself, especially:
steps
denoise
The same logic also applies to the third pass: in this version, adjustments are made directly in the KSampler rather than through a separate scripted setup.
Generation Tips

I usually work with a fixed seed and change it manually when needed.
When generating an image, I recommend blocking the workflow at the next step so you can check the result stage by stage.
For example, if I am starting from scratch, before launching the workflow I block the second KSampler group. I do not bypass it — I block it. This way, the workflow stops after the first KSampler pass, and I can decide whether I want to continue with the next stages or try again by changing the seed, the prompt, or other settings.
This is very useful because it lets you evaluate the base image first instead of running the entire workflow every time.
To block a stage, simply click the eye icon on the group. That will stop the generation at that point. As you can see the eye is closed that means you blocked the generation util this point.
(this only works with fixed seeds)
Final Notes
Thank you very much for downloading the workflow and taking the time to read this tutorial.
I really appreciate it, and I hope it can be useful for you.

If you try the workflow, I would be very happy to see your results, so feel free to leave a comment and post the images you create under the workflow page.
If you run into any problems, do not hesitate to contact me.
Thanks again, and see you next time.
Let me know if you liked it.

