Compose animate flakes onto flake_anim_data: LoRAs model-only (high/low on Wan 2.2), joined prompts, stems and an optional start image. The Flake Stack/Combo widgets, load picker and queue combos take an anim kind.
Server: GET /flakes/families serves the flake_families registry, plus
/flakes/diffusion_models and /flakes/clip_types for the preset editor.
Web: utils.js fetches the registry and exposes familySpec/familyFromFolder.
The hardcoded literals stay as a bootstrap fallback and are only replaced
once a real payload arrives, so a failed fetch degrades to the previous
behaviour rather than breaking the editor. flake-modal and preset-modal
now derive families from the shared helpers instead of keeping three more
private copies of the list.
Preset editor gains a diffusion-model picker and a text-encoder type
dropdown, hides Clip Skip for families whose encoder is not CLIP, and
seeds a new preset from its family defaults. The registry is warmed at
extension setup because the sliders are write-once and modals build
synchronously.
Verified against a running server: all three endpoints respond and
Krea2/Turbo appears in the FlakeModelPreset model_family dropdown.
Closes#223. The previous #216 fix (commit 2db236a) detached the
familyWidget from node.widgets to hide it. That introduced three
regressions:
1. Generation failed with "Required input is missing: model_family".
The widget was the only carrier for the required model_family value
in the serialized prompt; once detached, prompt validation rejected
every job.
2. Node sizes were reset on reload. _updateFamilyVisibility called
node.setSize(node.computeSize()) on every state transition, and on
workflow load the 200ms poll fired a transition after onConfigure
restored the saved size — overriding it.
3. Flake Stack items vanished on reload. Detaching the widget shifted
the widget value order in the saved JSON: only [flakes_json_value]
was serialized, but the reload code (correctly) still has the
widget present, so the saved JSON string landed in model_family
and flakes_json kept its empty default.
Fix:
- Keep familyWidget permanently in node.widgets so serialization is
stable and the required input is always sent.
- Hide it visually by stacking computeSize=[0,-4], type="hidden",
hidden=true, AND a no-op draw override (covers ComfyUI frontends
that don't honor type/hidden for canvas-drawn COMBO widgets).
- Drop node.setSize from the visibility transition (rely on
setDirtyCanvas to repaint).
- Defer the initial sync to setTimeout(0) so onConfigure has hydrated
link state before we read it.
- Add _recoverShiftedWidgets in flake_stack.js onConfigure for
FlakeStack and FlakeCombo: if model_family looks like JSON and
flakes_json is at its empty default, swap them so workflows saved
by the broken version recover their stack contents on next open.
FlakeDataSplitSelect (#164):
- Remove 'selected_pins' STRING from Python INPUT_TYPES (was causing node load failure)
- Store pin selection purely in node.properties._split_pins
- Rewrite JS widget with attached-button dropdown style
IntoFlakeDataSelect (#165):
- Remove all optional fields from Python INPUT_TYPES; use None-sentinel pattern
so only connected inputs override the original flake_data
- JS now uses node.addInput/removeInput for dynamic pins — no default pins,
no hidden widget fields interfering with click events
- Dropdown styled as select + attached button (matching Load Image node)
- Chips show active pins with x to remove
FlakeDataSplitSelect could not be added to workflow because removeInitialPins
called node.removeOutput/addOutput which could fail during node creation.
Switch to applyPinVisibility (hide/show existing pin slots) instead of
dynamically removing/adding pins, which is safer and avoids the crash.
IntoFlakeDataSelect: hide widget-type fields (filename_prefex, width, height,
steps, cfg, sampler_name, scheduler) by default; show them as label + widget
rows only when added via dropdown. Redesign [+] button with neutral Load Image
style styling and add hover effect. Remove dedicated [-] button since chips
have individual delete (x) buttons. For widget-type pins, display inline
label + input widget instead of a square input pin.
Fixes#152, Fixes#153
Creates FlakeGenerate node that takes flake_data input, runs KSampler, VAE Decode, and SaveImage internally. Displays seed widget with randomize/increment/decrement controls, 2x2 preview grid (reusing flake-preview.js), and generated image preview in a single DOM widget.
- Replace hide/show visibility approach with dynamic addOutput/removeOutput
and addInput/removeInput for proper pin management
- On node creation, remove all default pins and add only selected ones
- On workflow load (onConfigure), clear all dynamic pins and rebuild from
saved properties
- Remove OUTPUT_NODE from FlakeDataSplitSelect (not an output node)
- Add pin selector UI with +/- buttons that dynamically adds/removes pins
- Export DEFAULT_SPLIT_PINS and DEFAULT_INTO_PINS for use in onConfigure
Closes#139
- Python backend: new PreviewFlakeData class that takes FLAKE_DATA input
and passes it through unchanged, marked as OUTPUT_NODE for execution
- JavaScript frontend: custom widget showing a 2x2 grid with Models,
Prompts, Parameters, and Metadata categories
- Clicking a category card opens an overlay with consolidated information
- Handles combo node scenarios by displaying all available data fields
- Registers the new node in __init__.py NODE_CLASS_MAPPINGS
Closes#122
Replace yes/no group toggles on FlakeDataSplitSelect with a dropdown + +/- button
UI for individually adding/removing output pins. Similarly, redesign
IntoFlakeDataSelect to use dynamic input pins instead of FLAKES_MODEL/COND/SAMPLER
bundle types, allowing override of individual fields from an incoming FLAKE_DATA.
- Python: Add selected_pins/active_pins hidden STRING widgets for state tracking
- Python: IntoFlakeDataSelect now takes individual optional inputs (MODEL, CLIP,
VAE, etc.) and overrides only activated pins from the incoming FLAKE_DATA
- JS: Add flake-data-select.js with pin selector dropdown + button widgets
- JS: Register handlers for FlakeDataSplitSelect and IntoFlakeDataSelect nodes
- JS: Show/hide outputs and inputs based on selected pin state
Closes#119
- Add openPresetPicker() that shows presets in a searchable grid with
cover images, matching ComfyUI Load Image dropdown styling.
- Rewrite FlakeModelPreset widget: remove dropdown, add 'Select Preset'
and 'Create Preset' buttons. When selected, show cover image with
preset name and hover buttons for Remove/Modify.
- Update FlakeModelCombo widget: remove dropdown, use the visual picker
when clicking 'Add Preset'.
Fixes#54, Fixes#55, Fixes#57
Adds cache-busting to the preset list fetch and makes widget DOM
updates more robust by trying multiple element selectors. Also
forces a canvas redraw so existing nodes reflect the new preset
without requiring a ComfyUI reload.
Fixes#56
Adds String() coercion and null-safety to the file browser search
filter to prevent 'No matches' when entries have unexpected types.
Removes redundant keyup listener since input already covers text changes.
Fixes#58
- Add /flakes/checkpoint_sibling_image endpoint to find an image next to
the selected checkpoint with the same basename.
- In the preset editor, auto-load that image as cover when a checkpoint is
selected, but only if no cover already exists.
- Poll preset widget value in FlakeModelPreset so cover updates immediately
when the user swaps presets via the dropdown.
Closes#52
- Add dblclick handler on file rows to immediately select and close.
- Add keyup fallback for search filtering.
- Add Enter key support to select the first matching file.
- Focus search input when dialog opens.
Closes#50
- Increase select and option font-size from 10px to 13px
- Increase height from 22px to 26px to fit larger text
- Fix asymmetric padding (0 18px 0 4px → 0 18px) so selected text is
truly centered across the full width, not offset by the chevron
- Add text-align:center to each <option> so open dropdown items are centered
Closes#47
- Stop filtering out already-added flakes from the picker list
- Add double-click handler on flake thumbnails to select+close immediately
- Add double-click on folder items to navigate into them
- Update both FlakesStack and FlakesCombo handleLoad call sites
Closes#46
- Model Preset: move URL input above checkpoint path selector
- Model Preset: make toggle button bigger (14px) with flex centering
- Model Preset: make link icon blue (#4a9eff)
- Flake LoRA editor: same bigger toggle button and blue link icon
Closes#45
- openFileLoadPicker now accepts {flakes, directories} and builds a folder tree
- Folders rendered as large 📁 icons with labels; clicking navigates into them
- Breadcrumb path bar shows current location; click to return to root
- Up-folder item (..) shown when inside a subfolder
- Search bar filters all flakes globally regardless of folder
- Exclude model_presets/ from both directory tree and search results
- Update both FlakesStack and FlakesCombo handleLoad call sites
Closes#43
- Replace defaultPath: 'img' with '' for both checkpoints and loras pickers
so they open at the model root instead of a non-existent img/ subfolder
- Add real-time search bar to openFileBrowser overlay filtering files/folders
in the current directory by name
- Show 'No matches' when search yields no results
Closes#42
- Save: build ordered dict by iterating activeFields so YAML keys follow
the user-dragged order
- Load: derive activeFields from Object.keys(data) order (Python preserves
insertion order via yaml.safe_dump sort_keys=False)
- Fallback appends any fields not present in the key order
Closes#41
- Add makePanelDropdown helper with dark background (#1a1a1a), #333 border,
4px radius, 10px font, 22px height — matching makeSmallValueSlider
- Hide native arrow with appearance:none and add custom SVG chevron
- Center text edge-to-edge using text-align-last:center
- Options now share the same 10px font size as the selected value
- Replace inline select creation in rebuildPanel with makePanelDropdown
Closes#40
- Extract loadOptions() to fetch flake metadata in the background on init
- Call loadOptions() immediately so triangle button shows for flakes with options/loras
- Remove right-click handler that was used as a workaround
Closes#39
- Replaces file-browser-based load picker with a dedicated overlay
- Shows thumbnail grid with cover images (background-size:cover)
- Search bar filters flakes by name in real time
- Click to select, Cancel / Select buttons in footer
Closes#32
- Add proper dragstart/dragover/drop/dragend handlers to field drag handles
- Visual drop indicator shows between fields during drag
- Reorders activeFields array and re-renders on drop
Closes#36
- Model Preset: checkpoint URL hidden by default, toggle with triangle button
next to Checkpoint label. Blue link icon appears when URL is populated.
- Flake LoRA: replace [...] button with triangle toggle. Header shows LoRA name
and blue link icon when URL is populated. Full URL no longer shown in header.
Closes#33, closes#34
Backend:
- Add LoraEntry dataclass with name, url, path, strength
- Flake dataclass now has loras[] list; legacy lora_path/strength kept for compat
- _flake_from_raw parses both new multi-LoRA and legacy single-LoRA formats
- resolve() applies multi-LoRA strength overrides from grid entries
- full_flake_node.py applies all LoRAs in order
Frontend:
- Flake edit modal: each LoRA gets its own section with name, URL, path picker,
strength slider. +Add LoRA button to add more. [...] button edits name/URL.
- Grid dropdown: shows one strength slider per LoRA, labeled with LoRA name
- Grid entries store loras[] array of strengths for overrides
- Backward compatibility: old entries with single strength auto-converted
Closes#30
- Replace inset box-shadow with absolutely positioned indicator at left:-3px
so the blue line appears in the gap between items rather than on the item
- Add dragover/drop handlers to the Add block for dropping after the last item
- Clear all indicators on drag end
Closes#28
- Update has_lora flag after editing/saving a flake (both defaultUpdated and saved cases)
- Update has_lora after overriding pending changes to disk
- Fix incorrect lora_path field name: raw YAML uses 'path', not 'lora_path'
Closes#27
- Added checkpoint_url to ModelPreset dataclass and load/save
- Added optional URL input field in the preset edit overlay
- Defaults to empty string
Closes#25
- Model Preset initializes filename prefix with <PresetName>/
- New optional 'Output Filename Stem' field in flakes editor
- FlakeStack collects stems from all flakes and builds prefix:
- Folder stems (containing '/') are appended to path
- Date folder <YYYY-MM-DD> inserted after last folder stem
- Filename starts with <HH-MM-SS> followed by _ separated file stems
- FlakesGenerationData converter outputs filename_prefix as 6th pin
Closes#24
- Checkpoint field in preset editor now opens a file picker filtered to .safetensors
- LoRA field in flake editor now opens a file picker filtered to .safetensors
- Load Existing now opens a file picker filtered to .yaml/.yml
- Each picker attempts to map the selected file name back to the backend's full path
- Manual text entry is still available via a small '...' button next to each picker
Note: Browsers do not allow setting the default directory of a file picker for security reasons.
Closes#18, closes#20, closes#22