Skip to content

Generating Images

The web Create composer shows an advisory peak-VRAM estimate for the selected machine before you submit. Video models expose their supported camera-motion controls under Advanced, and a durable sequence remains attached after a page reload so its server-side progress does not disappear from the workspace. Setting Output to Sequence filters the model picker to compatible installed video checkpoints and selects one when possible, remembering your one-shot model for the way back. If none are installed, Browse video models opens Models → Discover with the Video and Models filters already applied. Every LTX-2 checkpoint renders multi-clip sequences, two-stage dev checkpoints included — a dev checkpoint renders each clip through the two-stage pipeline, so expect roughly twice the wall time per clip as a distilled one.

On phone-sized web views, Create keeps every interactive target at least 44px high and editable fields at a zoom-safe 16px.

While a print renders, the web canvas develops it live: for families that stream latent previews (FLUX.1, Flux.2, Z-Image) the forming image appears under the film-grain wash, its blur tightening step by step while the grain thins away, on a bed matching the print's aspect ratio. The progress ring and stage line cover the bed only until the first preview arrives. Once a run completes, the Seed section offers lock last (seed) to pin that print's seed for the next generate.

Basic Usage

bash
# Default model (flux2-klein:q8 — fast 4-step, Apache 2.0, fully ungated)
mold run "a red apple on a wooden table"

# Explicit model selection
mold run flux-dev:q4 "a photorealistic landscape at golden hour"

# Custom output path
mold run "cyberpunk cityscape" -o cityscape.png

# Reproducible output (same seed = same image)
mold run "a cat" --seed 42

# Custom dimensions (multiples of 16)
# See each model's recommended dimensions to avoid warnings
mold run "a banner" --width 1024 --height 512

# Batch generation (multiple images with incrementing seeds)
mold run "abstract art" --batch 4 --seed 100

# JPEG output
mold run "a sunset" --format jpeg -o sunset.jpg

Here's what that looks like — FLUX Schnell Q8, seed 42:

Snow leopard — FLUX Schnell

Need a quick answer on family capabilities or expected speed? See Feature Support and Performance.

Each model family has a set of recommended dimensions that produce the best results. Using non-recommended dimensions will trigger a warning (generation still proceeds). All dimensions must be multiples of 16.

bash
# Square (works with all families)
mold run "a cat" --width 1024 --height 1024

# Landscape (FLUX, Flux.2 Klein)
mold run flux2-klein "a panorama" --width 1024 --height 576

# Portrait (SDXL, SD 3.5, Qwen-Image)
mold run sdxl-turbo "a portrait" --width 832 --height 1216

See each model family page for the full list of recommended dimensions and aspect ratios.

Image Editing

qwen-image-edit-2511:* is a distinct edit family, not standard img2img. It uses one or more ordered --image inputs, supports negative prompts, and derives default output dimensions from the first input image when you omit --width and --height.

bash
# Single-image edit
mold run qwen-image-edit-2511:q4 \
  --image ./chair.png \
  "turn this fabric chair into dark red leather"

# Multi-image edit
mold run qwen-image-edit-2511:q4 \
  --image ./chair.png \
  --image ./swatch.png \
  "make Picture 1 match the leather color and finish from Picture 2"

Use regular img2img families when you need --strength-based denoising. Use qwen-image-edit when you want instruction-following edits against one or more reference images.

In Mold Studio, Qwen Image Edit uses the same Target image well as other source-driven models on web, desktop, and iPhone. Its ordered picture strip still adds and reorders References, while the Target offers contain, crop, Lanczos resize, and upscale-and-fit controls and automatically follows the model's 1 MP source ceiling. Other source-image families also show a strength slider plus all five fit policies — labelled Denoise strength for SD-lineage img2img (higher = more change) and Source strength for LTX-2 image-to-video (higher keeps more of the source; 1.0 pins the opening frame); SD1.5 also suggests installed ControlNet checkpoints while allowing a custom checkpoint name.

On a phone, Create follows one vertical workflow: prompt and style, model and core controls, Generate, the developing/result canvas, then recent prints. Advanced options remain in the mobile sheet so the primary flow stays compact.

For a multi-prompt video, set Output — the control beside Model in the Create settings column — from One shot to Sequence. Multi-clip video is a setting, not a separate page: the composer becomes a clip rail. Mold starts with two clips, requires a description for each, and joins them with seam pills that name each transition in words — Smooth, Cut, or Fade 8f, with LTX-Video's zero-overlap joins reading Join. Clicking a seam pill opens the seam editor with its three teaching rows and the fade-length stepper. New clips take their frame count from the selected model's own advertised default rather than a fixed constant, and the summary shows the stitched duration before you generate. Switching Output back to One shot keeps clip 1 as the prompt and parks the rest — nothing is erased. Sequence tools contains TOML import/export and other script-oriented controls. On a multi-machine web setup, the durable job and its live progress stay on the machine selected by Run on.

Sequences queue in the same activity strip as ordinary prints, with watch, cancel, and resume. Once one settles it leaves the strip: the video lands in the Create canvas with Edit sequence and Show in library, its print is in the Library, and its job record is in Library ▸ History ▸ Sequences — which is also where the host-scoped Clear inactive and Clean up disk actions live.

A finished sequence can be edited in place. Its clips reload onto the rail and each pill shows whether that clip is cached (✓) or will re-render (↻) as you edit; Update sequence re-renders only from the earliest changed clip. Changing a transition type or a fade length re-renders nothing at all — those are applied when the video is stitched. From a sequence print in the Library, Edit sequence is the primary action and re-enters the original job on the machine that produced it so rendered clips stay cached. Duplicate as new starts a fresh sequence from the recorded clips, telling you how many it restored and naming anything a print does not record.

Shape and Size

Create's Shape row on web, desktop, and iPhone is the canonical family the selected model can express — 1:1, 5:4, 4:3, 3:2, 16:9, 21:9 and their portrait twins — plus Source while an image is attached. Model-specific buckets that are widescreen by another name (LTX-2's 1216×704, 1920×1088 and 3840×2112, Wan's 832×480, MiniMax H3's 1344×768) all live under 16:9 rather than as separate 19:11 / 30:17 / 20:11 chips. Picking a family never guesses pixels: the Size row under it lists that family's authored sizes as exact width×height pills with megapixels and any model-authored mark (Default) as secondary text.

One status sentence under the size row names the canvas and why it holds that size — Matches source, Follows source, Model default, or Manual — and the badge beside the pixels is the same fact, so they can never disagree. Attaching a source image selects the closest model-valid size with the source's shape and keeps following it across model and pipeline changes until you pick a shape, size, or exact dimensions yourself.

On every surface, a ↺ Reset in the Create settings header restores the generation settings to the selected model's defaults — shape, resolution, detail, prompt strength, seed, and the Advanced groups — while keeping your prompt, model choice, and batch. On the web it is undoable from the toast it raises.

Identity Photos (PuLID)

An identity photo conditions the render on a person's face: the print keeps that likeness while the prompt decides everything else. The photo itself is never composited into the output, and it is never cropped or resized to the canvas — it is a reference, not a composition input.

Identity conditioning is deliberately narrow today. It is offered only for identity-qualified checkpoints on a server built with the off-by-default pulid feature, and it cannot be combined with a LoRA or with an img2img source image. Every other model, and every server that was not built with the feature, refuses the request with a named reason rather than rendering a print with no face in it. The live, authoritative list is whatever the server advertises per model as supports_identity — today that means FLUX's flux-dev:q4 / flux-dev:q8 and SDXL's sdxl-base:fp16, juggernaut-xl:fp16, realvis-xl:fp16, and dreamshaper-xl:fp16; see the Identity Photos guide for the full list and why an SDXL fine-tune isn't automatically included.

The identity assets (an adapter, a shared vision tower, and the InsightFace face detector/recognizer) install as one of two hidden bundles — pulid-flux for FLUX, pulid-sdxl for SDXL — that share everything except the adapter itself, so a machine with one already installed pulls only the other's adapter. The InsightFace weights are licensed for non-commercial research only, so Mold will not download them until you accept that licence once per MOLD_HOME:

bash
mold pull pulid-flux --accept-license insightface-antelopev2
mold pull pulid-sdxl --accept-license insightface-antelopev2

See Third-party model licenses for the full rule.

In Mold Studio on web and desktop, Create shows an Identity well directly below the source-image wells whenever the selected model and the machine you are generating on both support it — when they do not, the control is not there at all, rather than present and disabled. Drop or pick a PNG or JPEG (at most 16 MiB, 8192 px per side, 32 MP) and the print takes that likeness.

Switching to a model that cannot use an identity photo does not throw yours away and does not stop you generating: the photo is parked, the request goes out without it, and the well comes back with the photo still in it when you select a qualified model again.

Two knobs live in Advanced and stay absent from the request until you touch them, so the server's own defaults keep applying:

  • Identity strength — how strongly the face is held, 0.03.0 (default 1.0). Higher preserves the likeness; lower lets the prompt reshape it. 0.0 is completely inert: no identity assets are loaded at all.
  • Identity start step — the first denoise step the face is applied at (default 0, and always fewer than the print's step count). Delaying it lets the composition settle before the likeness is pinned.

If the combination cannot be submitted — a photo alongside a LoRA or a source image, a knob set with no photo, an oversized or unsupported file — Create says so inline beside the control and Generate stays blocked.

Saved metadata records the reference's filename, its SHA-256, and the effective strength and start step; it never contains the face bytes. The Library shows those facts in the print's info aside, and Reuse settings restores the two values and re-attaches the photo when this device still has it, telling you plainly when it does not.

Video Generation

mold supports text-to-video generation with the LTX Video, LTX-2 (next section), and Wan 2.1/2.2 model families. LTX Video, LTX-2, and Wan all default to MP4 output (GIF, APNG, and feature-gated WebP are also supported); a build compiled without the mp4 feature falls back to APNG.

bash
# Generate a 25-frame video clip with the fast distilled path
mold run ltx-video-0.9.6-distilled:bf16 "A cat walking across a sunlit windowsill"

# Custom frame count (must be 8n+1: 9, 17, 25, 33, 49, 97, ...)
mold run ltx-video-0.9.8-2b-distilled:bf16 "Ocean waves at sunset" --frames 33

# Custom FPS (current LTX defaults use 30 FPS)
mold run ltx-video-0.9.6:bf16 "A timelapse of clouds" --frames 49 --fps 30

# Pipe to a video player
mold run ltx-video-0.9.6-distilled:bf16 "A robot dancing" | mpv -

# Direct MP4 output
mold run ltx-video-0.9.6-distilled:bf16 "A waterfall" --format mp4 -o waterfall.mp4

ltx-video-0.9.6-distilled:bf16 is the recommended default today. The 0.9.8 family is also supported end to end: mold pulls the required spatial upscaler asset, runs the full multiscale refinement path, and keeps the current compatible VAE on the published LTX-Video-0.9.5 source until the newer VAE layout is ported.

Frame count constraint

LTX Video requires frame counts of the form 8n+1 (9, 17, 25, 33, 49, 97, etc.) due to the VAE's 8x temporal compression. mold will reject invalid counts with a helpful error message.

VRAM usage

LTX Video uses sequential load-use-drop to manage VRAM: T5 encoder loads first, then drops before the transformer loads, then the transformer drops before VAE decode. Peak VRAM depends heavily on the selected LTX checkpoint.

LTX video dimensions must be multiples of 32 (not 16 like images). Current LTX defaults use 1216×704 at 30 FPS.

Wan Video

Wan 2.1/2.2 is a separate wan family: MP4 by default, frames on a 4n+1 grid (49, 53, 81, 121, ...), dimensions in multiples of 16 — except wan22-ti2v-5b, whose 2.2 VAE requires multiples of 32.

bash
# 480p16 text-to-video (defaults: 81 frames @ 16 fps)
mold run wan21-t2v-1.3b "a red fox trotting through fresh snow, golden hour"

# 720p24 — Wan 2.2 5B, text- or image-to-video
mold run wan22-ti2v-5b "waves breaking on a black sand beach" \
  --width 1280 --height 704 --frames 121 --fps 24

# Wan 2.2 A14B, 4-step Lightning tier (defaults: 81 frames @ 16 fps)
mold run wan22-t2v-a14b:q5 "a paper boat drifting down a rain gutter"

# A14B image-to-video from a still
mold run wan22-i2v-a14b:q5 "the balloon lifts off" --image balloon.png

Wan checkpoints were tuned against a specific negative prompt; mold applies it automatically when --negative is not given. A14B is a two-expert mixture with one 14B expert resident at a time. The :q5/:q4 tiers default to the checkpoint's trained 81 frames — automatic partial block offload fits them on a 24 GB card — while :q8 defaults to 73 frames and :fp8 to 45, their measured 24 GB envelopes. See Wan Video for variants, defaults, and limits.

Joint Audio-Video Generation

LTX-2 / LTX-2.3 is exposed as a separate ltx2 family. Unlike ltx-video, its default container is MP4 and it can keep a synchronized audio track when the request stays in MP4.

bash
# Text-to-audio+video
mold run ltx-2-19b-distilled:fp8 \
  "a toy train rolling through a snowy diorama, gentle mechanical hum" \
  --frames 97 \
  --format mp4

# Audio-to-video
mold run ltx-2-19b-distilled:fp8 \
  "abstract paper sculpture reacting to a cello performance" \
  --audio-file ./cello.wav

# Keyframe interpolation
mold run ltx-2-19b-distilled:fp8 \
  "a drone shot over a canyon river" \
  --pipeline keyframe \
  --frames 97 \
  --keyframe 0:./start.png \
  --keyframe 96:./end.png

# Image-to-video with no prompt at all
mold run ltx-2-19b-distilled:fp8 --image ./still.png --frames 97 --format mp4

The prompt is optional for ltx2 and ltx-video — and only for them — when the request already carries visual conditioning (--image, --keyframe, --video, or --extend). It saves no VRAM and usually yields near-static motion; see the LTX-2 page.

LTX-2 also adds:

  • --audio / --no-audio
  • --audio-file
  • --video
  • repeatable --keyframe <frame:path>
  • --pipeline one-stage|two-stage|two-stage-hq|distilled|ic-lora|keyframe|a2-vid|retake|lip-dub|t2a
  • --retake <start:end>
  • repeatable --lora
  • --camera-control <preset-or-path>
  • --spatial-upscale <x1.5|x2>
  • --temporal-upscale x2

Catalog checkpoints may contain the LTX-2 transformer without vae.* weights. mold pull cv:<id> detects that layout and fetches the matching LTX-2 or LTX-2.3 video VAE automatically. Diffusion-only LTX-2.3 exports also fetch the separate Gemma hidden-state projection. The resolved assets are pinned in each chain stage, so multi-prompt chains do not fall back to the transformer file. ConvRot W4A4 exports use automatic full block streaming because their packed on-disk byte size understates the BF16 weights reconstructed by the runtime. If the Gemma prompt encoder exhausts VRAM, Mold retries only Gemma on CPU while keeping the transformer and video VAE on CUDA. Multi-prompt chains support every source-free LTX-2 pipeline, two-stage included; specialized conditioning pipelines remain explicit non-chain modes. Mold checks this before creating a durable job and keeps server, stage, cancel, resume, and retake errors visible on the job card.

Some community checkpoints contain only the video transformer (plus Mold's separate video VAE) and do not include the audio VAE or vocoder. Mold detects this from the installed safetensors and disables Generate audio in web, desktop, and iPhone while leaving text/image-to-video available. CLI users can pass --no-audio; an explicit unsupported audio request is rejected before prompt encoding or denoising.

The native CUDA matrix is validated across 19B/22B text+audio-video, image-to-video, audio-to-video, keyframe, retake, public IC-LoRA, spatial upscale, and temporal upscale workflows.

Backend policy

LTX-2 runs natively in Rust inside mold-inference. CUDA and Apple Metal are both supported backends for real local generation — Metal is performance-qualified on the 19B/22B distilled FP8 tiers, though slower than a comparable CUDA card — and CPU is correctness-only.

Negative Prompts

Guide what the model should avoid. Works with CFG-based models (SD1.5, SDXL, SD3, Wuerstchen, Qwen-Image, Qwen-Image-Edit, Wan); ignored by FLUX, Z-Image, and Flux.2 Klein.

bash
mold run sd15:fp16 "a portrait" -n "blurry, watermark, ugly, bad anatomy"
mold run sdxl:fp16 "a landscape" --negative-prompt "low quality, jpeg artifacts"

# Disable every default negative — config defaults and Wan's tuned model
# default alike — by sending an explicit empty negative
mold run wan22-t2v-a14b:q5 "a cat" --no-negative

Precedence: CLI --negative-prompt > per-model config > global config > the model family's tuned default (Wan) > empty. Wan's tuned default is advertised per model via /api/models (default_negative_prompt) and prefilled into the Negative control on web, desktop, iPhone, and the TUI; clearing that field is the same explicit opt-out as --no-negative.

Scheduler Selection

Choose the noise scheduler for SD1.5/SDXL models:

bash
mold run sd15:fp16 "a cat" --scheduler uni-pc         # Fast convergence
mold run sd15:fp16 "a cat" --scheduler euler-ancestral # Stochastic

LoRA Adapters

Apply fine-tuned style adapters across the supported families — FLUX, Flux.2, LTX-2, SD1.5, SD3, SDXL, Qwen-Image (+ Qwen-Image-Edit), Wan, Z-Image:

bash
# Basic LoRA (FLUX example)
mold run flux-dev:bf16 "a portrait" --lora style.safetensors

# Adjust strength (0.0 = no effect, 1.0 = full, up to 2.0)
mold run flux-dev:bf16 "anime style" --lora style.safetensors --lora-scale 0.7

# Works with quantized models too
mold run flux-dev:q4 "a portrait" --lora style.safetensors --lora-scale 0.8

# Same flag syntax across families
mold run sdxl:fp16    "a sunset" --lora sdxl-style.safetensors
mold run z-image:bf16 "anime"    --lora cv:2904324

LoRA requirements

Requires .safetensors format. Z-Image / FLUX accept diffusers (PEFT canonical), Kohya/sd-scripts, OneTrainer, and PEFT default-adapter naming. BF16 FLUX on 24 GB cards can adaptive-offload, keeping fitting blocks on GPU and streaming only overflow blocks; LTX-2 can use the conservative full-streaming offload path. Wuerstchen and legacy LTX-Video are not yet wired — attaching a LoRA there returns a 400 with the supported-family list.

Inline Preview

Display generated images in the terminal:

bash
mold run "a cat" --preview

Requires the preview feature at build time. Auto-detects Kitty graphics, iTerm2, Sixel, or Unicode half-block fallback.

Set MOLD_PREVIEW=1 to enable permanently.

PNG Metadata

Generated PNGs embed prompt, model, seed, size, steps, and a mold:parameters JSON chunk by default. Disable with:

bash
mold run "a cat" --no-metadata
# or globally
MOLD_EMBED_METADATA=0 mold run "a cat"

Titles and the Library

Give a print a name at creation with --title (up to 120 characters):

bash
mold run flux-dev:q4 "a village of blue houses at dusk" --title "Smurf village"
# → mold-flux-dev-q4-1700000000000~smurf-village.png

The title is embedded in the output metadata, seeded into the gallery row on the serving host, and folded into the default filename as a lossy slug: mold-{model}-{timestamp}[-{index}]~{slug}.{ext}, where the slug is the title lowercased to [a-z0-9-] and capped at 40 characters (untitled prints keep the legacy mold-{model}-{timestamp}.{ext} name). The filename is never rewritten afterwards — renaming a print in the Library edits the row title only, and an explicit --output path is always used verbatim. --title applies to single-clip runs; chain scripts and multi-prompt sequences do not carry a title on the CLI, though the HTTP chain body does title the stitched print.

File under

A print can arrive already organized rather than being filed afterwards:

bash
mold run flux-dev:q4 "a village of blue houses" \
  --title "Smurf village" \
  --tag blue --tag studies \
  --collection "Village studies"
  • --tag <TAG> is repeatable, up to 20 tags of 1–64 characters each. Tags are trimmed, their interior whitespace is collapsed, and they are matched case-insensitively, so Blue and blue are one tag.
  • --collection <NAME> files the print into a collection, creating it if it does not exist. Collections merge across machines by their slug, so "Village studies" means the same collection on every host in a fleet.

Both are seeded onto the gallery row once, when the row is created. Organization is yours after that: renaming, re-tagging, or removing a print from a collection sticks, and a later reconcile or re-publication never resurrects a tag you removed.

When a run is titled, mold also tags the print with its title slug and says so:

console
$ mold run "a village" --title "Smurf village"
filing under tag "smurf-village"

Turn that off for one run with --no-auto-tag, or permanently with mold config set generate.auto_tag_title false. This is a client default: the server never auto-tags, because it cannot tell a title you typed from one a script generated.

Filing never costs you a render. If the serving host has no metadata database (MOLD_DB_DISABLE=1), or a collection was deleted between the moment you listed it and the moment you pressed Generate, the print is still generated and saved — the filing is dropped and reported, never silently discarded.

The Library organizes prints per host with titles, favorites, tags, and manual collections (PATCH /api/gallery/image/:filename, POST /api/gallery/organize, /api/gallery/collections, /api/gallery/tags), and deleting a print moves it to a per-host trash with configurable retention — see mold trash and Library trash.

Piping

mold is pipe-friendly in both directions. When stdout is not a terminal, raw image bytes go to stdout and status goes to stderr.

bash
# Pipe output to an image viewer
mold run "neon cityscape" | viu -

# Pipe prompt from stdin
echo "a cat riding a motorcycle" | mold run flux2-klein

# Full pipeline
echo "cyberpunk samurai" | mold run flux-dev:q4 | viu -

# Force stdout in interactive mode
mold run "a cat" --output -

Inference Modes

  1. Remote (default) — connects to mold serve via HTTP
  2. Local fallback — if server unreachable, auto-falls back to local GPU
  3. Local forced (--local) — skip server, run on local GPU directly

Models auto-pull if not downloaded.

Browser UI

mold serve ships with a Vue 3 SPA baked into the binary. Visit http://<host>:7680/ to open the Create composer. The canonical routes are /create, /library, /models, /machines, and /settings; retired paths such as /generate and /catalog render Page Not Found:

  • The model selector shows human-readable catalog names while preserving cv: / hf: identifiers internally for requests.
  • Enter submits, Shift+Enter inserts a newline, empty Enter is a no-op.
  • Per-GPU running-job cards stream SSE progress (stage, denoise step N/M, VAE decode) and tag the finished image with the GPU ordinal that produced it.
  • Fire multiple prompts in quick succession; the server queues them and the UI surfaces HTTP 503 / Retry-After cleanly when --queue-size is reached.
  • img2img works via upload or the From Gallery picker; video-family models are grouped with a 🎬 badge and frames are clamped to 8n+1 automatically.
  • Library's print viewer keeps media bound to its owning host, restores the saved model family on Reuse settings (a print a sequence produced reloads its clips onto the Create clip rail instead, with Edit sequence offered when its durable job still exists on the machine that made it), and shows the recorded steps, guidance, scheduler, LoRAs, prompts, file details, and copyable prompt/seed. Upscale... returns the print to Create with the installed default upscaler selected.
  • Library organization (on hosts that advertise it — see below): the Library header carries a Prints | Collections | Trash scope control with counts, synced to ?scope= (plus ?c=<collection>, ?tag=a,b, ?fav=1). Prints is the grid plus a filter-chip row — ♥ Favorites, tag chips with counts (the long tail behind More tags…), and the host chips — and its search also matches titles and tags. Collections is a shelf of cover cards merged across hosts by name, with a dashed New collection card and a breadcrumb drill-in whose Edit menu renames, sets the cover from a selection, removes selected prints, or deletes the collection (its prints stay in the Library). Trash shows trashed prints with a retention banner, a per-tile Purges in N d countdown, hover Restore / Delete forever, and a header Empty trash. Every edit happens in the print viewer's aside: the editable title leads (click, Enter commits, Escape reverts; the raw filename drops to a mono detail row), ♥ beside it, a tag chip editor with autocomplete, and an In collections checklist with New…. Select mode's bar gains Add to collection, Tag, ♥ Favorite, and Trash. Titles typed in Create's title field travel with the request and lead the suggested download name ({title-slug}__{model}__s{seed}.{ext}; the file in the gallery is never renamed).
  • File under in Create (on hosts that advertise gallery.organize) files a print as you make it, between the essentials and Advanced — inside the controls sheet on phones. A titled print offers its own title slug as a dashed, removable tag chip; Add tag… suggests the tags your machines already use with counts; and the collection row pre-selects — never creates — the collection whose name matches the title, offering None, every merged collection, and an inline New collection…. A line beneath previews the filename the print will land as. The choice rides one shots, every batch sibling, every prepared variation, and the single print a sequence stitches, and Reuse settings restores what a print was actually filed under. Settings ▸ Library ▸ Tag new prints with their title (stored in this browser) turns the title chip off.
  • Shortcuts: F favorite · T tag · ⌘⇧N new collection · trash (undo for 6 s) · ⌘⌫ delete forever (confirm).
  • Destructive copy stays plain: Empty trash, Delete forever, and Delete collection use the app confirm dialog with a danger button and never a typed phrase; single and selected Trash are optimistic with a 6 s undo toast.
  • Trash retention is a per-host server setting (gallery.trash_retention_days, 0 = forever): Settings ▸ Library edits the serving host's value and Machines ▸ host edits any connected host's, next to its Prints in trash: N · Empty trash row. A host whose /api/capabilities lacks gallery.organize / gallery.trash (an older server, or MOLD_DB_DISABLE=1) shows none of this and keeps the permanent-delete wording.
  • Prompt expansion modal offers live preview + variation picker (requires qwen3-expand installed on the server).
  • Prompt, model, size, steps, guidance, and batch persist in localStorage.
  • Modal and sheet workflows contain keyboard focus, lock background scrolling, close on Escape, and restore focus to the control that opened them. The Templates popover also dismisses on Escape or an outside click.