chore: release v0.18.0#409
Merged
Merged
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #409 +/- ##
==========================================
- Coverage 68.94% 68.93% -0.01%
==========================================
Files 278 278
Lines 154414 154414
==========================================
- Hits 106462 106450 -12
- Misses 47952 47964 +12 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
release-plz-mold
Bot
force-pushed
the
release-plz-2026-07-15T20-18-40Z
branch
2 times, most recently
from
July 15, 2026 21:21
224e6d7 to
c06ff5b
Compare
release-plz-mold
Bot
force-pushed
the
release-plz-2026-07-15T20-18-40Z
branch
26 times, most recently
from
July 19, 2026 01:49
76cc150 to
6d31942
Compare
release-plz-mold
Bot
force-pushed
the
release-plz-2026-07-15T20-18-40Z
branch
2 times, most recently
from
July 19, 2026 02:40
92f1469 to
b5d1495
Compare
release-plz-mold
Bot
force-pushed
the
release-plz-2026-07-15T20-18-40Z
branch
from
July 19, 2026 04:15
eadd03e to
5a95c81
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🤖 New release
mold-ai-core: 0.17.1 -> 0.18.0mold-ai-db: 0.17.1 -> 0.18.0mold-ai-catalog: 0.17.1 -> 0.18.0mold-ai-inference: 0.17.1 -> 0.18.0mold-ai-server: 0.17.1 -> 0.18.0mold-ai-discord: 0.17.1 -> 0.18.0mold-ai-tui: 0.17.1 -> 0.18.0mold-ai: 0.17.1 -> 0.18.0Changelog
Added
Desktop chains can now start from an image. The Chains builder gains a chain-level Start image well in the header and an attach / replace / clear source-image well on every stage card, both fed by the shared image picker (upload a PNG/JPEG or choose from any connected host's gallery) — making image→video chains possible on desktop. The start image conditions stage 1 (it rides on
stages[0].source_image; a stage's own image takes precedence), TOML Export now inlines images assource_image_b64per stage, and Open reads them back, so image chains round-trip between the desktop composer andmold run --script.Desktop: catalog cards open an in-app detail drawer. Clicking a catalog card (title or body — the external Hugging Face / Civitai link remains as a secondary icon) now opens a detail panel with the model's description, license, tags, modality and file format, rating, and an itemized list of everything a pull will download: the primary weights files plus each shared companion (VAE / text-encoder / CLIP) with per-file sizes and a computed total. The detail is fetched from the same host the catalog view is browsing, every descriptive field is optional so older servers simply show less, and installed entries swap the Pull action for Repair, which re-fetches only missing or incomplete files.
Desktop: repair a model with missing components without re-pulling it. The Installed list's Info expansion already showed per-component present/missing dots; each missing component now carries a Repair button that enqueues a targeted catalog download on the host that owns the model — the server skips files already on disk, so only what's missing is fetched. Previously the only recovery was deleting the model and pulling it again.
Desktop downloads tray shows real progress detail and failed downloads can be retried. Every download row now carries a status chip, and active rows add the file currently transferring, files done/total, and a live ETA derived from a sliding transfer-rate window (stalled downloads honestly show no ETA instead of a bogus one). Finished, cancelled, and failed downloads no longer vanish: they collect in a collapsed History section under the tray, failed entries keep their error message, and a Retry button re-starts the download on the same host it originally targeted.
Desktop: Qwen-Image-Edit multi-image inputs and a ControlNet model picker. Picking a qwen-image-edit model now swaps the single source well for a reorderable picture strip — the first picture is the edit Target, the rest are References, added through the multi-select upload/gallery picker, reordered by drag or ‹ › buttons, and shipped in order as
edit_imageswith the batch locked to 1. Previously the desktop detected qwen-edit and then stripped the image from the request, so even single-image edits never reached the server; a source image attached in single mode now seeds the strip as the Target when switching to an edit model. The SD1.5 ControlNet "Control model" free-text field is replaced by a picker listing installedcontrolnet-family models (not-yet-downloaded entries greyed out with a hint) merged with catalog-installed control-net entries fetched from the generation target host via the newGET /api/catalog/installedclient, plus a Custom… escape hatch that restores the free-text input.Desktop img2img gains source-fit policies. A Source fit selector in the Generate source well controls how a source image whose dimensions differ from the requested canvas is applied — Pad repaint (default: letterbox, then repaint the added bands via an auto-generated mask), Crop fill, Pad fit, Lanczos resize, or Upscale then fit (the source is first run through an upscaler such as Real-ESRGAN, then fit). Fitting happens client-side before submit, an existing inpaint mask is refit alongside the source, and with several hosts connected the pre-fit upscale runs on the same host the generation routes to, matching the web SPA's behavior.
Desktop Models is now a single Catalog view. The All / Installed / Available toggle is gone — installed models render stacked above the live Hugging Face + Civitai catalog in one searchable screen with compact responsive cards and a Grid / Table density toggle, filtered by All / Images / Video media chips (
?type=deep links; the Chains and video Generate empty states jump straight to/models?type=video). Active downloads pin to the top of the view, each row carrying a source glyph (HF / Civitai) and its target host. When more than one host is connected, Pull still opens a target picker naming each ready host and its queue depth, and every pull keeps live progress, completion refresh, and cancellation routed to the server that owns it.Servers carry a stable installation identity and models-disk stats.
GET /api/statusgains an additiveinstance_id— a per-installation UUID generated on first boot and persisted in the metadata DB (ephemeral when the DB is disabled) — andmodels_disk { total_bytes, free_bytes }for the filesystem holding the models directory; the mDNS advertisement adds a matchingidTXT record. Older servers and clients are unaffected: both fields are simply absent or ignored.Desktop: click a host for a live detail view. Selecting a host in the sidebar opens a per-host page with live GPU / CPU / RAM telemetry, models-disk usage, queue state, and the models installed on that host.
Desktop LTX-2 video panel: chained-clip routing cue and camera-motion presets. When the frame count exceeds one clip, the Frames input now explains the auto-chain plan ("Will render as N chained clips of C frames (motion-tail M) — expect this to take substantially longer") for chain-capable models, and blocks over-budget requests on models without chain support before they reach the server. A new Camera motion select (LTX-2 only) surfaces the curated camera-control LoRA presets — Dolly in/left/out/right, Jib down/up, Static — plus a custom
.safetensorspath, shipping exactly what the CLI's--camera-controlsends (acamera-control:<preset>loras[]entry at scale 1.0); presets are disabled for LTX-2.3 models, which have no published camera LoRAs yet.Desktop gallery gains search, an Images/Video filter, and bulk delete. The Gallery header adds a debounced text search over prompt, model, and filename and All / Images / Video chips with live per-kind counts — both narrow the merged multi-host grid alongside the existing host chips (History → Runs keeps its own search and is not affected). A new Select mode supports click-to-toggle, shift-click ranges, and Cmd/Ctrl-click, with a floating action bar carrying the selected count, Select all (in the current filter), Clear, and a confirm-guarded Delete selected that routes every print to its origin exactly like the single-tile delete (This-Mac prints over IPC, remote prints over that host's authenticated API) and reports partial failures as "Deleted X of N. Y failed." before resyncing the affected hosts.
Desktop prompt expansion gains variations, a candidate chooser, and a family override. The Expand control keeps its one-shot ⌘E in-place rewrite (with restore-to-original undo) and adds a popover: pick 1/3/5 variations, preview the LLM-expanded candidates without touching the prompt, click one to apply — the same undo restores the original — and optionally override the model-family style per request.
Desktop: queued jobs can move between a host's GPUs. On multi-GPU hosts the Jobs view splits each server's queue into per-GPU lanes; drag a queued row onto another lane — or right-click it for Move to GPU N — to retarget it via
PATCH /api/queue/:id. The view never reorders optimistically: after every move (including a lost race against a job that already started, surfaced as a toast) the queue re-syncs from the server. Jobs stay on their owning host — cross-host drops are rejected — and single-GPU hosts keep the flat list unchanged.Remote catalog requests can use the desktop's Hugging Face and Civitai credentials. The desktop forwards its locally stored tokens only on authenticated catalog requests to remote Mold hosts. A remote server keeps precedence for its own configured token and falls back independently per upstream to the request-scoped desktop token when the server token is missing or rejected; forwarded values never enter download listings, events, or persistent server config, and queued cancellation removes them from memory immediately.
Changed
NSFWtag while the include-NSFW checkbox stays, and the downloads tray remains pinned at the top of the view.ModelTableRowcomponent (built on the Installed shelf's row: residency dot, source glyph, name, host and quant chips, family code, page link, relative-usage bar, two-line size block, actions) now renders model rows on the Installed shelf, host detail pages, and the catalog's table layout — so models look identical wherever they appear as a table. Catalog table rows lose the preview image and family placeholder tile in favor of clean info with the Hugging Face / Civitai source mark, showing SIZE and FETCH as aligned lines; grid cards keep their previews.RUNNING · GPU 0/QUEUED #2state code, model, anOTHER CLIENTtag for jobs that aren't this app's, and elapsed time on running jobs — polled every 5 seconds while the page is open, with aPAUSEDmarker and aJobs →link in the header for queue management.Added
source_image_name(the gallery filename or upload name the img2img source was picked from; the request carries it via the newGenerateRequest.source_image_name, which the desktop and TUI populate) andsource_image_sha256(the server-computed hash of the exact source bytes; names and hashes only, never image payloads). On the desktop, submitting with a source also stashes those exact bytes locally by hash (bounded, content-addressed), and Reuse settings restores the input image best-effort: the local stash first (covers uploads and canvas-fitted sources that exist nowhere else), then a cross-host gallery filename match fetched from the print's own origin host. Old prints without provenance keys are skipped silently; a keyed print whose source can't be found explains itself with a toast.GET /api/queueentries gain an additive metadata field carrying those request parameters (never image payloads); the drawer degrades gracefully against older servers.source_imagethe CLI's-i/--imagesends), complete with the gallery picker and Source fit control. Video can't repaint pad bands, so the mask surface and the Pad repaint fit option are absent for LTX-2 — a mask-dependent policy switches to centered Crop fill on entry (and Upscale-then-fit preprocesses with a fill instead of pads). Switching from qwen-edit promotes the edit Target into the img2video source, and an image attached for an image family survives the switch to LTX-2. Plain LTX-Video keeps no source well: its engine has no image-to-video path, so offering one would silently ignore the image.· gallery); selecting one jumps to the Gallery with that print revealed in the lightbox via a one-shot/gallery?print=<filename>deep link. In the Gallery view, ⌘F focuses the existing search input, matching the screen-filter shortcut everywhere else.Fixed
to_q/to_k/to_v), but the Z-Image loader unconditionally translated split requests into a fusedattention.qkvslice and failed with "cannot find tensor noise_refiner.0.attention.qkv.weight". Directly-stored names now win before the fused-QKV adaptation, so both split (official) and fused (single-file/community) checkpoints load.<input>, so non-text controls — range sliders, checkboxes, file wells — still leaked the webview's Back / Reload / Inspect Element menu. Only genuine text-editing fields (text-like inputs, textareas, contenteditable) now keep the native menu for spellcheck and paste; everything else opens the app's own context menu or nothing.TransformerShardfiles (e.g.qwen-image:bf16) had no singleTransformerentry, so/api/modelsreported an emptyhf_repo— stripping their source mark and model-page link in the desktop pickers. The repo now falls back to the shard files.filename/original_filename/metadatafields (absent on older servers): the server now reports the gallery names it saved the output under and the exact metadata it recorded. The desktop's auto-save of remote results keeps those names and records that metadata locally — video files embed nomold:parameters, so locally-mirrored LTX prints previously synthesized their rows from the filename and rendered with wrong aspect ratios and no prompt. The merged All view additionally collapses legacy stray copies by seed + byte-size identity, and re-saving an already-present print is idempotent instead of minting a-2duplicate.moldbrand form.Mold - dev, while the native macOS application menu and Dock process name use mold-dev. Release builds remainMold, so system surfaces distinguish the hot-reload app even though Mold's overlay title bar hides native title text.No space left on devicewhile generating LCOV output.RENAME_SWAPthen makes the final exchange indivisible. A one-time migration bridge retires the previous release's supervisor when it launches this fixed build, so the updater bug cannot revert its own fix. Startup checks now surface available updates in persistent app chrome and send a native notification while Mold is backgrounded; installation remains an explicit Update and restart action.icon.icnsas the notification identity image instead of relying on Tauri's bundle-ID lookup, which could leave completion notifications with a blank placeholder icon.-original/-upscaledgallery entries on single- and multi-GPU hosts, and remote desktop auto-save mirrors both to This Mac. Gallery metadata still reports each file's real raster size, while Reuse settings restores the pre-upscale generation canvas instead of attempting to generate directly at 2x/4x dimensions. If the upscaler fails after generation, Mold now completes with the original image instead of discarding the successful output.This PR was generated with release-plz.