Nodes/ComfyUI Preset Switcher/Preset Switcher (Style)
ComfyUI Node

Preset Switcher (Style)

Save checkpoint, LoRAs, and prompts together

By MosnowLab·Created 4 months ago·Updated 4 months ago· 0
Preset Switcher (Style)
    • current_preset
    preset_trigger

    Switching models in ComfyUI is manual busywork. You want to try a different checkpoint, the LoRA stack that goes with it, and the prompts - that's a good ten clicks and one "wait, did I update the negative?" moment, every single time. Preset Switcher (Style) is the fix: point it at the nodes in your graph that define a look, hit Save Current Config, and the whole combo becomes one named entry in a dropdown. Later, picking that entry rewrites those nodes back for you.

    It's one of three nodes in the small, recent MosnowLab ComfyUI-Preset-Switcher pack, sitting alongside a LoRA-focused twin and a visual gallery. Nothing to download, nothing to configure, no API key.

    How it works (read this, it explains everything)

    The node cheats, in a good way. The Python class behind it is nearly empty - its execute method just returns an empty string. All the real logic lives in the pack's JavaScript, which grows a row of widgets onto the node and talks to ComfyUI's backend through small HTTP routes (/preset-switcher/presets/save, etc.). When you save, the JS reads the current values off the nodes you bound it to and writes a JSON file into custom_nodes/ComfyUI-Preset-Switcher/presets/. When you switch, it writes those values back into the bound nodes' widgets. Nothing flows through wires - the switcher edits its neighbors in place, which is why there's no data to pipe anywhere.

    The inputs and outputs that matter

    The schema is thin on purpose: one optional preset_trigger string input and one current_preset string output. Neither carries real data. current_preset always comes back empty, and the JS never reads preset_trigger - they're leftover plumbing, so don't build a workflow around that socket. The widget row is the actual interface:

    • Save Current Config - snapshots whatever the binders point at.
    • Preset Select - the dropdown; switching here applies the preset.
    • Model / LoRA / Positive Prompt / Negative Prompt - four binders that list matching nodes in your graph (checkpoint loaders; any node whose type or title mentions LoRA; CLIP Text Encode nodes). Set these once per workflow, then save.

    The LoRA binder reads whatever LoRA stack node you bind with a simple/advanced "input mode" layout (per-slot name + weights). If the node you bind doesn't have that widget shape, the LoRA half of the preset just comes back empty - the model and prompts still save.

    Install

    cd ComfyUI/custom_nodes/
    git clone https://github.com/MosnowLab/ComfyUI-Preset-Switcher.git
    

    Restart ComfyUI. Easier: ComfyUI Manager, search Preset Switcher. No extra Python packages - the README says so outright and requirements.txt only notes that core ComfyUI is enough. No model downloads.

    Where people get burned

    Presets are scoped per workflow: filenames embed the workflow name, so "Sunset" in one workflow and "Sunset" in another are two separate files. Don't expect a saved preset to follow you into a fresh graph. Second, bindings are stored by node ID - rebuild part of the graph and the switcher can't find its targets; it warns, but you'll need to re-pick the nodes in the binders. Third, it sanity-checks that the saved checkpoint still exists in the loader's list and warns if a model file was renamed or deleted. One rough edge: the apply summary alert is hardcoded Chinese even on an English UI - the buttons are bilingual, the alert text isn't. And the honest caveat: a tool that rewrites widgets invisibly is exactly the kind of convenience the ecosystem argues about (see the "Anything Anywhere" backlash). It's fast, but a half-applied preset is silent until you look at the loader. Give the little summary alert a glance and you're fine.

    CategoryPreset

    Inputs (1)

    NameTypeDefaultDescription
    preset_triggeroptSTRING

    Outputs (1)

    NameTypeDescription
    current_presetSTRING