⏸ PSampler (Custom)
Pause a hand-built sigma schedule — Sampler Custom, but you can hold it
- model
- positive
- negative
- sampler
- sigmas
- latent_image
- output
- denoised_output
What it actually is
PSampler (Custom) is the pausable version of ComfyUI's Sampler Custom, from the same FreezeFrame pack as the plain PSampler. Where the standard node swaps your sampler_name/scheduler dropdowns for a raw SAMPLER object and a SIGMAS schedule, this one does the same - and adds the pack's signature ⏸️ PAUSE / ▶️ RESUME buttons so you can hold the run between steps.
This is a niche within a niche: you only reach for Sampler Custom when you want finer control over the noise schedule than the stock dropdowns give you. If you're still picking "DPM++ 2M Karras, 20 steps" and moving on, the plain PSampler is the better fit. If you're hand-building schedules, this is the one with the brake pedal.
How it works
Same core trick as every node in the pack: the sampler runs ComfyUI's sample_custom loop, and after each step a callback checks a shared pause flag. While paused it sleeps in 0.1s slices at a safe step boundary - GPU idle, latent and process resident in RAM. The buttons POST to a /comfy/pause_signal endpoint; the node never modifies the sampling math, only the cadence.
What's different from the standard node is the data plumbing. Instead of choosing a sampler and scheduler from menus, you feed in:
sampler(SAMPLER) - the sampler object, pulled from a sampler-select node.sigmas(SIGMAS) - the noise schedule as actual sigma values, produced by a scheduler node. This is the whole point of the custom variant: the schedule is a first-class input you can build, reshape, or split across samplers.add_noise(a boolean, default true) - inject fresh noise for this pass, or leave the latent's existing noise alone (the img2img/inpainting move).noise_seed,cfg(default 8.0),positive,negative,latent_image.
Two outputs come out: output - the actual sampled latent, and denoised_output - the model's clean "predicted image" (x0) at the end, handy when you want the clean estimate separately for a second pass or for feeding back into a re-noise stage. Both are LATENT, so output goes to VAEDecode or the next sampler.
Why pause here at all
Custom-schedule workflows are exactly the long, fiddly ones where a misjudged schedule reveals itself at step 15 of 40. Being able to stop, look at the preview, and decide whether to let the rest of the schedule run or abort and re-tune it is the practical use. It's also the thermal relief valve for the GPU sitting at 90°C on a 10-minute custom run.
Install
Zero dependencies, no requirements.txt, no model downloads - the cleanest kind of custom node install:
# ComfyUI Manager → "Install Custom Nodes" → search "FreezeFrame"
# or:
cd ComfyUI/custom_nodes
git clone https://github.com/c0dezer019/FreezeFrame
# restart ComfyUI
The node appears under sampling/FreezeFrame as ⏸ PSampler (Custom). (The README's clone example has a placeholder URL - trust Manager or the real repo.)
Gotchas
The pack-wide rules apply: edits made while paused only affect the next queued job, never the running one; the pause lands between steps, not mid-kernel; and the state is RAM-only, so a restart while paused kills the run. One Custom-specific note: because sigmas comes in as an input, "changing the schedule" mid-pause still won't touch the current run - the SIGMAS object was already bound when sampling started.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| add_noise | BOOLEAN | true | — |
| noise_seed | INT | 00–18446744073709550000 | — |
| cfg | FLOAT | 8.00–100 | — |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| sampler | SAMPLER | — | |
| sigmas | SIGMAS | — | |
| latent_image | LATENT | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| output | LATENT | — |
| denoised_output | LATENT | — |