PPKSamplerAdvanced
A KSampler whose entire settings block arrives as one bundle
- model
- positive
- negative
- latent_image
- args
- LATENT
- skip
- width
- height
A normal KSampler takes a dozen settings as a dozen separate wires. PPKSamplerAdvanced takes them all as one bundle: a single args input that carries the seed, steps, CFG, sampler, scheduler, denoise, and more, handed over by the pack's PettyPaintArguments node. The point is that the petty-paint iPad app sends its settings as one blob - the app decides what to use, ComfyUI just obeys. And like the pack's VAE nodes, it has a skip mode so the whole pipeline can short-circuit when there's nothing new to render.
How it works
Feed it the standard model, positive, negative, and latent_image ports plus the args bundle, and it unpacks the bundle into the same call the stock KSampler Advanced makes: seed, steps, CFG, sampler name, scheduler, start/end steps, denoise, add-noise, and return-with-leftover-noise all come out of that one dict, then get passed to ComfyUI's common_ksampler - the exact same sampling path the built-in node uses. So the quality behavior is identical to a hand-wired KSampler Advanced; the only difference is how the settings travel.
The skip flag inside args is the interesting part. When it's set, the node skips sampling entirely and returns the input latent untouched, plus a skip boolean and the latent's dimensions (width/height ×8) so downstream nodes know what the image would have been. That's the packet's pattern: SkippableVAEEncode → this → PettyPaintVAEDecode can all agree to skip together when the iPad hasn't sent fresh art, saving a full generation pass.
The inputs and outputs that matter
args- the bundle. It'sforceInput, and it should come fromPettyPaintArguments, which is where the actual settings widgets live (seed, steps, cfg, sampler/scheduler dropdowns, denoise, start/end step, add noise, return-with-leftover-noise, and the skip toggle). If you wire in something that isn't a proper args dict, the sampler reads defaults - including an empty sampler name - which won't do what you want. Build it with the args node.model,positive,negative,latent_image- same as any KSampler.
Outputs: LATENT (sampled, or passthrough when skipped), skip (the boolean), and width / height (the latent's pixel dimensions, handy for sizing anything downstream).
Where it fits
If you're using the iPad integration, this is your sampler - the app's settings blob routes through PettyPaintArguments and lands here. If you're not, there's little reason to prefer it over the built-in KSampler Advanced; it adds a layer of indirection for no benefit in a hand-built graph. It's a genuinely useful node, but only inside its own ecosystem.
Installing it
Part of the petty-paint pack: ComfyUI Manager search "Petty Paint", or:
cd ComfyUI/custom_nodes
git clone https://github.com/mephisto83/petty-paint-comfyui-node
restart, no models to download. The pack's pinned Flask isn't imported by the current source, so the install is light.
When it bites you
The usual failure is wiring args to the wrong thing - any node that outputs * can technically connect, and the sampler will silently use defaults instead of complaining. Watch for sampler name being empty (that's the symptom). And if you skip and then feed the passthrough latent into a plain VAE decode expecting a real image, you'll decode garbage - the skip path is designed to be paired with the pack's skippable VAE nodes, not the stock ones.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| latent_image | LATENT | — | |
| args | * | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| LATENT | LATENT | — |
| skip | BOOLEAN | — |
| width | INT | — |
| height | INT | — |