Draw Things Sampler
Your ComfyUI sampler, except Draw Things does the actual denoising
- model
- image
- mask
- lora
- control_net
- upscaler
- refiner
- hints
- IMAGE
- AUDIO
First, the honest headline: this pack is deprecated. The README says so in its first line - the project moved, and you should switch to the official draw-things-comfyui extension. Plenty of workflows still ship with these nodes installed, though, so here's what this one does while it still works.
DrawThingsSampler is the centerpiece of the pack - the node every other "Draw Things" node feeds into. Instead of sampling with ComfyUI's own KSampler (which uses ComfyUI's checkpoints and your GPU), this node packages your settings and pushes them over gRPC to a Draw Things server - the macOS/iOS app or the gRPCServerCLI binary - and that server does the denoising. The image comes back and lands in the normal IMAGE output you'd wire straight into a SaveImage.
In plain terms: ComfyUI becomes the graph editor, Draw Things becomes the inference engine. That's the play on Apple Silicon, or if you want Draw Things' heavily optimized low-VRAM engine (it runs Wan 2.1 14B on a 16 GiB MacBook Air) driven by a visual workflow instead of the app's own UI.
How it works
The sampler connects to a gRPC service at server:port (defaults: localhost, port 7859, TLS on - Draw Things uses its own pinned root cert). It calls the server's model browser to populate the model dropdowns, builds a FlatBuffers config from your widgets, then fires a streaming GenerateImage request. The stream carries per-step progress and previews back, and the final image arrives as a normal ComfyUI tensor. Everything else in this pack - the LoRA, ControlNet, refiner, upscaler, and prompt nodes - exists to hand this node pre-built inputs.
The inputs that matter
The node has a settings dropdown with three states - Basic, Advanced, All - that collapse and reveal the giant pile of widgets. Beginners want Basic. Start there:
- model - a dropdown filled from Draw Things' own model library, not ComfyUI's
modelsfolder. Install models in Draw Things, not in ComfyUI. - positive / negative - wire the
POSITIVEandNEGATIVEstring outputs from the prompt nodes in here. - width / height, steps, cfg - standard sampler fare. CFG 4.5 is a sane default for SD-family checkpoints; on guidance-distilled models (Flux-style, low CFG) it's wrong - see below.
- seed + seed_mode -
ScaleAlike(the default) keeps seeds reproducible across resolutions;Legacyis old behavior. If you're switching between local and cloud draws,ScaleAlikeis the one that behaves. - strength - 1.0 means pure text-to-image. Feed an image into the optional
imageinput and drop strength to 0.4–0.6 for img2img; the tooltip says it plainly: lower strength means more influence from the original. - sampler_name - mirrors Draw Things' samplers (DPM++ 2M Karras, Euler A, LCM, TCD, the AYS and Trailing variants). For SD 1.5/SDXL, DPM++ 2M Karras at 20–30 steps is the reliable default; distilled models want their own few-step sampler instead.
- num_frames / fps / motion_scale - these only matter for video models (Wan, Hunyuan, SVD). Ignore them for stills.
Everything past Basic is Draw Things' own parameter surface - high_res_fix, tiled_diffusion, tea_cache, shift, causal_inference for video, and more. All genuinely wired to the server; none of it is decoration.
Installing it
Via ComfyUI Manager, search ComfyUI-DrawThings-gRPC, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Jokimbe/ComfyUI-DrawThings-gRPC
Then restart. The node's real dependency list (grpcio, flatbuffers, protobuf, fpzip) installs with it. You also need the server side: in the Draw Things app, enable API Server, set Protocol to gRPC, TLS to Enabled, Enable Model Browser to Enabled, and Response Compression to Disabled. Or run the CLI:
gRPCServerCLI-macOS [path to models] --no-response-compression --model-browser
Troubleshooting
The error you'll actually hit is "Couldn't connect to Draw Things gRPC server." Usual culprits, in order: Draw Things' API server isn't running, the server isn't localhost/port isn't 7859, use_tls doesn't match the server's TLS setting, or - the sneaky one - Response Compression is still enabled, which the protocol expects off. The Model Browser also has to be on, or the model dropdowns stay empty.
One more trap: if images come out with no prompt influence or the negative field does nothing, check CFG. On guidance-distilled models CFG 1 is the real default and the negative prompt is inert there; this node's 4.5 default targets classic SD-family checkpoints. And remember - if Draw Things can't find a model you downloaded, it isn't installed in Draw Things.
Since the pack is frozen, hit the Discord linked in the README for support, and plan the migration to the official extension eventually. It works today; it's just not getting fixed.
Inputs (64)
| Name | Type | Default | Description |
|---|---|---|---|
| settings | COMBO | Basic | 3 options: Basic, Advanced, All |
| server | STRING | localhost | The IP address of the Draw Things gRPC Server. |
| port | STRING | 7859 | The port that the Draw Things gRPC Server is listening on. |
| use_tls | BOOLEAN | true | — |
| model | DT_MODEL | The model used for denoising the input latent. | |
| strength | FLOAT | 1.000–1 | When generating from an image, a high value allows more artistic freedom from the original. 1.0 means no influence from the existing image (a.k.a. text to image). |
| seed | INT | 0-1–4294967295 | The random seed used for creating the noise. |
| seed_mode | COMBO | ScaleAlike | 4 options: Legacy, TorchCpuCompatible, ScaleAlike, NvidiaGpuCompatible |
| width | INT | 512128–8192 | — |
| height | INT | 512128–8192 | — |
| steps | INT | 201–150 | The number of steps used in the denoising process. |
| num_frames | INT | 141–257 | The total number of frames to be generated. This value will be rounded up to the next valid value for the selected model. |
| cfg | FLOAT | 4.50–50 | The Classifier-Free Guidance scale balances creativity and adherence to the prompt. Higher values result in images more closely matching the prompt however too high values will negatively impact quality. |
| cfg_zero_star | BOOLEAN | false | — |
| cfg_zero_star_init_steps | INT | 00–50 | — |
| speed_up | BOOLEAN | true | — |
| guidance_embed | FLOAT | 4.50–50 | — |
| sampler_name | COMBO | DPM++ 2M AYS | The algorithm used when sampling, this can affect the quality, speed, and style of the generated output. |
| stochastic_sampling_gamma | FLOAT | 0.300–1 | — |
| res_dpt_shift | BOOLEAN | true | — |
| shift | FLOAT | 1.000.1–16 | — |
| batch_size | INT | 11–4 | — |
| fps | INT | 51–30 | — |
| motion_scale | INT | 1270–255 | — |
| guiding_frame_noise | FLOAT | 0.020–1 | — |
| start_frame_guidance | FLOAT | 1.00–25 | — |
| causal_inference | INT | 00–129 | Set to 0 to disable causal inference |
| causal_inference_pad | INT | 00–129 | — |
| clip_skip | INT | 11–23 | — |
| sharpness | FLOAT | 0.60–30 | — |
| mask_blur | FLOAT | 1.50–50 | — |
| mask_blur_outset | INT | 0-100–1000 | — |
| preserve_original | BOOLEAN | true | — |
| high_res_fix | BOOLEAN | false | — |
| high_res_fix_start_width | INT | 448128–2048 | — |
| high_res_fix_start_height | INT | 448128–2048 | — |
| high_res_fix_strength | FLOAT | 0.700–1 | — |
| tiled_decoding | BOOLEAN | false | — |
| decoding_tile_width | INT | 640128–2048 | — |
| decoding_tile_height | INT | 640128–2048 | — |
| decoding_tile_overlap | INT | 12864–1024 | — |
| tiled_diffusion | BOOLEAN | false | — |
| diffusion_tile_width | INT | 512128–2048 | — |
| diffusion_tile_height | INT | 512128–2048 | — |
| diffusion_tile_overlap | INT | 6464–1024 | — |
| tea_cache | BOOLEAN | false | — |
| tea_cache_start | INT | 50–1000 | — |
| tea_cache_end | INT | 2-151–150 | A positive value corresponds to last step tea_cache should be appplied. Use a negative value to specify steps from the end+1. IE: -1 is the last step, -2 is the second to last step, and so on. |
| tea_cache_threshold | FLOAT | 0.200–1 | — |
| tea_cache_max_skip_steps | INT | 31–50 | — |
| separate_clip_l | BOOLEAN | false | — |
| clip_l_text | STRING | — | |
| separate_open_clip_g | BOOLEAN | false | — |
| open_clip_g_text | STRING | — | |
| color_calibration | COMBO | Disabled | 2 options: Disabled, Lab |
| imageopt | IMAGE | — | |
| maskopt | MASK | A black/white image where black areas will be kept and the rest will be regenerated according to your strength setting. | |
| positiveopt | STRING | The conditioning describing the attributes you want to include in the image. | |
| negativeopt | STRING | The conditioning describing the attributes you want to exclude from the image. | |
| loraopt | DT_LORA | — | |
| control_netopt | DT_CNET | — | |
| upscaleropt | DT_UPSCALER | — | |
| refineropt | DT_REFINER | — | |
| hintsopt | DT_HINTS | Hint images, or control inputs, are used with ControlNets and certain other models, like Kontext, to help guide the generation. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| AUDIO | AUDIO | — |