Front-end clients for AI image models
ComfyUI, InvokeAI, Draw Things, ChaiNNer and friends
2022-09-16 — 2026-06-13
In Which Several Front-End Image-Generation Clients Are Compared on Apple Silicon, and the Choice Between PyTorch, MLX, and CoreML Runtimes Is Found to Hinge on Available RAM and Whether LoRA Adapters Are Required.
Front-end software for running AI image models on my own hardware — incorporating generation, editing, inpainting, upscaling, and chaining the lot together.
Twin to Running LLMs locally on a Mac.
This is relatively easy now, since we have access to
- generative image models for text-to-image generation (Stable Diffusion, Flux, SDXL and friends);
- image editing models that specialise on tweaking existing images (FLUX.1 Kontext, Qwen-Image-Edit, Nano Banana, single-task tools);
- all enabled by the AI democratization community.
Don’t forget, folks, we don’t need to use AI for this. Programmatic and even photoshop-style editing images using a GUI — that all still works.
Anyway, back to my plans to generate cool images of cats in spaceships.
I am principally interested in clients that
- work on macOS
- on my local machine (i.e. use my local GPU)
Most of the options here do something like that. Some of them only work on Very Serious Infrastructure Which I Cannot Afford To Own But Might Rent In The Cloud, which is a secondary concern for me personally, but there are some notes on that too.
1 Terminology
A base model (or backbone) is the full generative model we load — text encoder, denoiser, and VAE, anywhere from a few to dozens of GB. A LoRA is a small add-on (often under 300 MB) trained against one backbone to alter its style or subject; it does nothing on its own and only loads against a compatible base. A ControlNet is another base-locked add-on, but instead of style it imposes “structure” — we give it an OpenPose skeleton, a Canny or soft-edge map, or a rough scribble, and the model fleshes that out under the prompt. The model lineages cover which backbones exist; the niche-LoRA menu covers my idiosyncratic notions of which ones look interesting.
1.1 Niceties of Apple Silicon
My choice of client is constrained by how I wish to execute the model — itself a trade-off between performance and compatibility. The runtimes (PyTorch + MPS versus MLX) and the weight formats (GGUF versus MLX builds) are the same as for local text models; the twin lays them out as compute backends and storage backends. Among image clients, ComfyUI, InvokeAI and the A1111-family forks take the PyTorch + MPS path, while MLX shows up as add-on node packs (ComfyUI-MLX, mflux-ComfyUI, mflux standalone).
Two backends matter here that barely figure for text generation:
- Apple Core ML — lowest RAM footprint, runs on the Neural Engine, but every model needs offline conversion via
coremltools. Mochi Diffusion is the only mainstream consumer AFAIK. - Custom Swift + Metal kernels — Draw Things sidesteps all of this with its own implementation. Faster than MPS, broader coverage than CoreML, but locked in to a vendor and their assumptions.
2 Choosing a runtime
Three questions settle it, and the table below answers all three: does a build for this model exist on a given path (check Hugging Face or Civitai), does it fit in RAM, and are we adding LoRAs? (Draw Things sidesteps the lot — it chooses precision and manages memory itself — so skip ahead if that’s the client.)
Rough sizing, to know which RAM column we’re in: parameters × 2 bytes for fp16, plus the text encoder and VAE and a few GB of working overhead. FLUX.1 dev ≈ 24 GB + ~9 GB for the T5; SDXL ≈ 6.5 GB; FLUX.2 dev ≈ 64 GB.
| Runtime | Cuts memory to fit? | Speed vs MPS | CivitAI LoRA stacking | Weights it requires |
|---|---|---|---|---|
| PyTorch + MPS, full precision | No | Baseline | Clean | any .safetensors |
| PyTorch + MPS + GGUF | Yes — its whole job | ≈ baseline (bandwidth, not compute) | Clean | a published .gguf quant |
| MLX (mflux / ComfyUI-MLX) | Optional — can quantize, but not the point | Fastest — wins on compute (~30–70% off) | Friction — own format, and LoRA-loading and quantization are mutually exclusive | an mlx-community build |
| CoreML (Mochi Diffusion) | Yes — lowest footprint of all | ANE; not top speed on large models | None | a converted bundle |
| Draw Things | Automatic | Fast (own Metal stack) | Clean (auto-converts) | its own (handled for us) |
Availability takes time. PyTorch + MPS works on release day because it consumes raw .safetensors. GGUF quants of popular DiT models often land within days thanks to an enthusiastic hoobyist community. MLX or CoreML ports lag by months when they appear at all.
When we do have a choice: prefer MLX if a build exists, because fast, at full-quality full bf16 for top quality if it fits. Failing that, fall back to GGUF, taking the largest quant that fits (Q5_K_M over Q4_K_S).
3 Choosing a client
Client apps, as well as model lineage, condition what we can do. There is a trade-off between flexibility and usability.
| Tool | Mac install | indications |
|---|---|---|
| Draw Things | App Store, signed | Mac-native sweet spot |
| ComfyUI (+MLX) | Python+MPS or +MLX add-ons | Bleeding-edge, max compatibility, node-graph |
| InvokeAI | Official installer (MPS) | Canvas studio with inpaint brushes |
| Mochi Diffusion | Drag-drop, CoreML conversion required | Low-RAM CoreML |
| Forge Neo / SDNext | Python+MPS | A1111-style WebUI, current models |
| ChaiNNer | Electron + Python+MPS | Upscale/restore pipelines (no diffusion) |
Backbone support as of May 2026; bold marks recommendations for each backbone.
| Tool | SD/SDXL | Flux dev/schnell | FLUX.1 Kontext | Qwen-Image-Edit | Video (Wan/Hunyuan/LTX) |
|---|---|---|---|---|---|
| Draw Things | ✓ | ✓ | ✓ | ✓ (2509/2511/Layered) | Wan |
| ComfyUI | ✓ | ✓ (incl. Flux 2) | ✓ | ✓ | Wan / Hunyuan / LTX / + |
| InvokeAI | ✓ (incl. SD3.5) | ✓ (+Krea / Redux / Fill, Flux 2 Klein) | ✓ | ✓ | – |
| Mochi Diffusion | ✓ | Flux 2 Klein only | – | – | – |
| Forge Neo | ✓ | ✓ | – | ✓ | Wan 2.2 |
| ChaiNNer | – | – | – | – | – |
Draw Things is a strong default for most backbones, ast the last ones available for it. It is basically turnkey— no App Store install, no runtime fuss, and its own Metal stack is already fast. We might switch to ComfyUI on Flux or Kontext for more sophisticated control. It tends to lead on node-level control, the newest architectures, or end-to-end pipelines that post-process what they generate — say generate an emoji, matte out the background, and export to a target format in one graph — and for any serious local video. InvokeAI is useful when the job is canvas-and-mask editing rather than pure generation.
If you don’t want to run interactively, fall back to purely headless tools like ChaiNNer / Spandrel and Runway..
3.1 Client-level content filters
Base models and fine-tunes have safety/censorship baked in.
Some clients add a content filter on top of the model’s own behaviour. You may or may not wish this; I never do, but maybe you want to put your laptop in the hands of a pre-schooler and don’t want them generating NSFW images?
| Client | Filter added? | Mechanism | How to remove |
|---|---|---|---|
| ComfyUI | No | The graph executes what is wired; nothing added by the application | N/A |
| InvokeAI | Yes | NSFW blur on generated output | --no-nsfw_checker at launch |
| A1111 / Forge Neo / SDNext | Yes | safety_checker CLIP classifier; blacks out on detection |
--disable-nsfw-filter flag |
| Draw Things | No | Defers to loaded model’s behaviour | Load an unfiltered base |
| Mochi Diffusion | No | Defers to the CoreML bundle | Converted model must be permissive |
The safety_checker used by the diffusers-based clients is a separate model — a small CLIP classifier not baked into the generation model’s weights. Removing it removes the post-generation output filter.
4 Draw Things
Commercial. The most actively-maintained Mac-native client in the field; the closest thing to “ComfyUI’s model coverage with DiffusionBee’s install ease”. If we don’t already have a reason to prefer something else, this is the sensible default.
Hugging Face provides a Use this model → Draw Things button (part of HF’s local-apps integration) that deep-links the weights straight into the app, skipping the manual import step. CivitAI has no such hook, so its models and LoRAs go through Import Model by hand.
Backbones: SD 1.5, SDXL, SD3, Flux dev/schnell, FLUX.1 Kontext for instruction edits, Qwen-Image 2512 and Qwen-Image-Edit 2509/2511 and Qwen-Image-Layered, Wan video (multiple variants), HiDream, Z-Image Turbo.
Affordances: LoRA loading and local LoRA training, ControlNet, inpainting, outpainting, infinite canvas.
Remarkably, its PEFT tab is a full on-device LoRA trainer: point it at 5–20 images and a trigger word, and it fine-tunes a LoRA against SDXL, Flux.1 [dev], Kwai Kolors, SD3.5 or SD1.5 — auto-captioning with Blip2/Moondream2, leaning on memory-saver machinery (just-in-time weights, Metal FlashAttention) to keep even a Flux-class run inside laptop RAM. Most clients here only load adapters; Draw Things also trains them.
Memory pressure is managed automatically — Draw Things falls back to a smaller working set rather than OOM, at some cost to throughput.
Failure mode: lags ComfyUI by some weeks. Polished, but with closed source.
4.1 Walkthrough — adding a CivitAI LoRA on top of Flux
Suppose we want to try YFG Patents, the patent-figure Flux LoRA from the niche-LoRA menu. The full path from a clean install:
- Install the app — one click from the Mac App Store.
- Pull a base model — in the Settings tab, click Manage to open the Models panel and select
FLUX.1 [dev]from the built-in list; it downloads on selection. The weights arrive pre-converted to the app’s own internal format (a few GB). - Pull the LoRA — in that same Models panel, click Import Model → Enter URL… and paste the CivitAI link, setting the type to LoRA. The URL route sometimes fails; if it does, download the
.safetensorsfrom CivitAI and use Select from Files instead. Either way the app converts it to its internal format and tags it as a LoRA against the matching backbone (Flux dev in this case). LoRAs from other backbones don’t appear when a Flux model is loaded — fewer ways to wire it up wrong. - Generate — the LoRA appears in the LoRA panel with a strength slider. Set it around 0.7–1.0 to start, write a prompt (
an exploded view of a kettle, technical diagram, numbered callouts), hit generate.
The same pattern works for Z-Image Turbo LoRAs like Perfect Ink Drawing, with the added payoff that Z-Image Turbo sounds like it might be faster.
5 ComfyUI
Power user tool A visual node-graph workflow system, first to support every new architecture (usually within days of release). If we want to save, parameterize, re-run, or debug a workflow at the node level, ComfyUI is the tool to use. It has the steepest learning curve in this list.
5.1 Installation paths
There are two ways onto the platform: a desktop app and a Python source install. They run the same engine and we can share models between them; the difference is in how much of the Python plumbing we touch.
The ComfyUI Desktop DMG is an Electron wrapper around the upstream project. On first launch it asks where to put the install directory, then sets up a self-contained Python environment inside it, downloads PyTorch with MPS support, and brings up the node editor. It is not a sealed bundle — there is an in-app terminal, and we can drop into that environment later to add packages if we ever need to. Models sit wherever we pointed the installer; the install wizard explicitly offers to import an existing source install’s models/, workflows/, and settings/ so a desktop install and a source install can sit side by side without duplicating multi-GB checkpoints. An extra_models_config.yaml lets us point either install at additional model directories anywhere on disk, so several ComfyUI instances can share one model tree and never duplicate a multi-GB checkpoint. That sharing stops at the ComfyUI boundary, though: Draw Things and Mochi Diffusion convert models to their own internal formats on import and keep the converted copies inside their app containers, so anything used in both Draw Things and ComfyUI is stored on disk twice — there is no shared directory bridging a safetensors-native client and a converting one.
The Python source install suits when we want hands-on control of the Python environment — to install experimental custom nodes from git, pin a particular torch build, or untangle a dependency clash by hand. The desktop app keeps that environment hidden; the source install hands over the keys, at the price of having to manage it ourselves. uv makes this latter option relatively easy:
Both paths support ComfyUI Manager for installing custom node packs from the UI. Install it once, restart, and the Manager button appears in the node editor.
The first two examples contrast between speed and flexibility: MLX gives us speed on Apple Silicon but limits which weights we can load and how LoRAs compose; GGUF gives memory headroom for bigger models on smaller machines at the cost of performance.
5.2 Example one — Flux schnell via MLX, with a CivitAI LoRA
Say we want YFG Patents running on top of Flux schnell, accelerated through Apple MLX rather than PyTorch+MPS.
- Add the MLX node pack. Open Manager → search “ComfyUI-MLX” (thoddnn/ComfyUI-MLX) → install → restart. This pack uses Apple’s DiffusionKit underneath and tends to give ~30–70% wall-clock speedups on Flux compared to PyTorch+MPS. Mflux-ComfyUI is the older alternative; it still works, and is friendlier for people who’d rather not touch the terminal, but ComfyUI-MLX has more momentum as of 2026.
- Fetch the base model. MLX-flavoured Flux weights are hosted under
mlx-communityon HuggingFace, separately quantized for the framework — these are not the same files as the regularsafetensorsFlux releases. Drop them inComfyUI/models/diffusion_models/(the MLX loader nodes know where to look). - Fetch the LoRA. Download the YFG Patents
.safetensorsfrom CivitAI intoComfyUI/models/loras/. A LoRA file is small (often <300 MB) because it only stores low-rank deltas against the backbone’s weights. - Wire the workflow. In the editor:
MLX Model Loader→MLX LoRA Loader(point at the YFG file, strength ≈ 0.8) →MLX Sampler→VAE Decode→Save Image. Prompt the patent-figure idiom (exploded view, numbered callouts, dashed hidden lines, technical patent figure) and queue.
One quirk: with mflux, LoRA loading and on-the-fly weight quantization are mutually exclusive — if we want a quantized MLX model and a LoRA, we have to bake the LoRA into the weights ahead of time (see the Mflux-ComfyUI readme for a recipe). ComfyUI-MLX handles this more gracefully but is younger.
5.3 Example two — Flux dev via GGUF, on a 16 GB Mac
Flux dev at full precision is 23.8 GB in fp16, which does not fit a 16 GB machine. DiT-backbone models (the diffusion-transformer architecture: Flux, SD3, Qwen-Image) compress well under GGUF, and some fit.
Add the GGUF node pack via Manager (search “ComfyUI-GGUF”, city96/ComfyUI-GGUF). The manual route works too:
Download a quantized checkpoint from city96’s HuggingFace repo. The trade-off is roughly:
Q4_K_S(6.8 GB, noticeably softer outputs),Q5_K_M(8.3 GB, the usual sweet spot),Q6_K(9.8 GB, near-fp16 quality). Drop the file inComfyUI/models/unet/. The T5 text encoder is a separate ~9 GB component and can be quantized independently with the matching CLIP loader nodes — we’ll often want a Q5 T5 alongside a Q5 DiT.Wire the workflow.
Unet Loader (GGUF)(categorybootleg) →DualCLIPLoader (GGUF)→ standardKSamplerandVAE Decode. A regular CivitAI LoRA (e.g., YFG Patents again) loads on top through the normalLoraLoadernode — no bake-in dance needed here, because we’re back in PyTorch+MPS land.On a 32 GB+ machine GGUF is optional — full fp16 fits, and GGUF buys nothing there (its win is memory, not speed). Older PyTorch builds had an MPS buffer bug that broke GGUF on Apple Silicon; current stable resolves it, so no version pin is needed.
5.4 Example three — emoji assets: generate, matte, and export
The niche-LoRA menu notes that no current model emits a clean cut-out icon with transparency: we generate on a flat background and remove it as a separate step. ComfyUI does the whole chain in one pipeline, so we can create an ad hoc emoji factory.
- Add a background-removal node pack via Manager — 1038lab/ComfyUI-RMBG bundles RMBG-2.0, BiRefNet and SAM, and its GroundingDINO option can cut out a subject named by text.
- Generate on a flat field.
Load Checkpoint(SDXL) →LoraLoader(fofr/sdxl-emoji, strength ≈ 0.8) →KSampler→VAE Decode. Prompt the subject, not a person:an emoji of a teapot, centered, plain white background. - Matte. Feed the decoded image into the RMBG node; it returns the subject on transparency. Emoji cut out cleanly because the edges are crisp and the background is flat — the hard cases that defeat background removal do not arise here.
- Resize and export.
Image Resizeto the target (128 px for Slack or Discord custom emoji) →Save Image, which preserves the alpha channel as an RGBA PNG. Queue the prompt over a list of subjects to mint a whole pack at once.
For exotic targets — multi-size icon sets, WebP, SVG, .icns — postprocess the matted PNGs using vips or ImageMagick.
5.5 Example four — pose and scribble control (ControlNet)
You want to get the model to do something like “turn my sketch of a castle into a fantasy world”? That is ControlNet. ControlNet conditions the generation of images on various special inputs: given a stick-figure skeleton, or a rough scribble, or a Canny edge map — and it fleshes out a finished image that holds that structure. ComfyUI is the most complete client for it, achieving early support for hip ControlNets first and even supporting multiple controls.
- Add the preprocessor pack via Manager — ComfyUI-controlnet-aux bundles the hint extractors (DWPose/OpenPose, Canny, HED/soft-edge, lineart, scribble). Skip it if we are drawing the control image by hand.
- Fetch a ControlNet that matches the base into
ComfyUI/models/controlnet/— for Flux, InstantX Union-Pro (canny / soft-edge / depth / pose in one file); for Qwen-Image, InstantX Qwen Union; for SDXL, the xinsir Union. - Make the control image — author it (a stick figure from a pose editor, a scribble) or run a reference photo through the preprocessor node (
DWPose Estimator→ skeleton,Canny→ edges). - Wire it.
Load Checkpoint→Load ControlNet Model→Apply ControlNet(fed the conditioning, the ControlNet, and the control image; strength ≈ 0.6–0.9, with an end-percent if we want the control to relax late in the denoise) →KSampler→VAE Decode. Prompt the content and style; the skeleton determines the pose.
This strength parameter controls how strong an influence a ControlNet has — low lets the model reinterpret, high forces rigid literalism. On a Mac, Draw Things and ComfyUI both support these controls.
Backbones: SD 1.5, SDXL, SD3/3.5, Flux dev/schnell/2, FLUX.1 Kontext, Qwen-Image 2512, Qwen-Image-Edit 2511, Wan 2.1/2.2, HiDream E1.1, LTX-Video, Hunyuan Video/3D, Omnigen 2, ACE Step audio. LoRA, ControlNet, inpainting, img2img, regional prompting all native.
6 InvokeAI
A polished web UI with a canvas-and-layers studio feel — closer to a Photoshop workflow than to a programming environment. The “canvas-first” option. Useful when we want layers and inpainting brushes rather than node spaghetti. PyTorch+MPS underneath; no MLX path here, so lsow on apple silicon..
Backbones: SD 1.5/2.0, SDXL, SD 3.5 Medium/Large, Flux dev/schnell/Kontext/Krea/Redux/Fill, Flux 2 Klein 4B/9B, Qwen Image, Qwen Image Edit, CogView 4, Z-Image. GGUF, ckpt, and diffusers formats all loadable.
Affordances: LoRA + embeddings, ControlNet (as canvas Control Layers), SAM/SAM2 segmentation, unified canvas inpainting/outpainting. No video, no training.
Failure mode: the model picker rejects an unknown architecture cleanly rather than crashing — we know immediately whether a CivitAI download will work, which is more than ComfyUI offers when a custom node pack is missing.
6.1 Walkthrough — emoji-style edits on a portrait
A workflow that exercises what InvokeAI is for: pull a portrait onto the canvas, mask a region, and apply fofr/sdxl-emoji (from the niche-LoRA menu) to that region only. This is the kind of selective re-style that is awkward in Draw Things and tedious to wire by hand in ComfyUI.
- Install via the official launcher. The launcher is a small Electron app that manages the underlying Python install for us — it provisions a venv, pulls the right PyTorch wheel for Apple Silicon (MPS), and tracks updates separately from the app itself. Source install works too (
git clonethenuv pip install -e .), but the launcher is what the team supports and where the model importer is. - Pull a base model through the launcher’s built-in Model Manager. SDXL base is the sensible match for the fofr LoRA, since the LoRA was trained on SDXL. An SDXL LoRA cannot be stacked on a Flux base; the rank-decomposed weights only make sense against the backbone they were trained on. The Model Manager downloads HuggingFace
diffusers-format weights directly; CivitAIsafetensorsimport works through URL paste. - Pull the LoRA. Either drop fofr’s
pytorch_lora_weights.safetensorsinto~/invokeai/models/sdxl/lora/, or paste the HuggingFace URL into the Model Manager. InvokeAI identifies the architecture from the file’s metadata and rejects it cleanly if it doesn’t match the loaded base. - Use the canvas. Open the Unified Canvas tab, drag a portrait onto it, draw a mask around the face, and add the LoRA to the prompt stack (strength ~0.8 to start). The inpaint sampler respects the mask boundary while letting the LoRA drive style inside it — the canvas affordance Draw Things lacks.
The same pattern handles outpainting (extend canvas, mask the new area, generate), Kontext-based instruction edits (make this a watercolour), and SAM/SAM2-driven auto-segmentation (Segment Anything, Meta’s click-to-select segmentation model) when we can’t be bothered to draw the mask ourselves.
7 Mochi Diffusion
A native SwiftUI app on Apple’s CoreML framework, running on the Neural Engine with the lowest RAM footprint on this list (~150 MB working set). Useful when RAM is at a premium and we are willing to live with a small set of pre-converted models.
Install the unsigned .dmg (right-click → Open past Gatekeeper), drop a pre-converted bundle from coreml-community into ~/Documents/MochiDiffusion/models/, and select it from the dropdown. Take the ORIGINAL (CPU+GPU) build rather than SPLIT_EINSUM (Neural-Engine, for iPhone/iPad). CoreML bundles are not safetensors, so a CivitAI checkpoint won’t load directly, and converting one by hand is limited to SDXL era models.
We pay for the extreme efficiency with a lack of flexibility: no LoRA loading, no native inpainting, no Flux dev/schnell, no Kontext, no Qwen, no SD3, no video, no direct CivitAI import.
But that also means I won’t be using it here.
Backbones: SD 1.5, SD 2.x, SDXL, plus Flux 2 Klein (4B/9B distilled, pre-built bundles available).
Affordances: ControlNet, RealESRGAN upscaling, EXIF metadata preservation in generated PNGs.
Mochi needs CoreML weights. If you cannot find the ones you want, the procedure for converting to CoreML is written up step-by-step in the Mochi wiki.
8 The AUTOMATIC1111 family
The original AUTOMATIC1111 WebUI — feature-rich Gradio interface — was the canonical Stable Diffusion UI for years. Its main branch is effectively abandoned: last release v1.10.1 from Feb 2025, no support for Flux, SD3, Kontext, Qwen, or anything more recent than SDXL. Active development moved to a thicket of forks:
- Forge (lllyasviel) — the original fork. Sporadic.
- reForge (Panchovix) — stability-focused fork of Forge.
- Forge Neo / Forge Classic (Haoming02) — current best A1111-style option: supports Flux, Qwen, Wan 2.2.
- SDNext (vladmandic) — actively maintained heavy refactor.
If we want the WebUI feel with current models, maybe try Forge Neo or SDNext? Let me know how it goes if you do. Vanilla A1111 is now of historical interest only. PyTorch+MPS for any of these; the well-trodden install path; the official MPS notes only cover the abandoned main branch.
If we use the Hugging Face tooling, building a local UI is easy; it integrates easily with gradio. See also nitrosocke/diffusers-webui.
DiffusionBee belongs in the same graveyard — the original drag-and-drop Mac client, native Apple Silicon, zero terminal. Last GitHub release was v2.5.3 in August 2024; superseded on almost every axis by Draw Things (same install ease, broader model coverage, actively maintained). As such I have not used it.
9 Pipeline-chaining clients
9.1 ChaiNNer
A node-based GUI specifically for non-diffusion image-processing pipelines: Real-ESRGAN → GFPGAN → format conversion → batch over a folder. Electron app + Python sidecar with PyTorch+MPS; works on Apple Silicon. Maintained.
Pareto dominates when: we want repeatable upscale/restore pipelines without writing a script. Complementary to ComfyUI rather than competitive — if the task is diffusion, this is the wrong tool.
Affordances: Spandrel-supported PyTorch arches (super-resolution, face restore, denoise, JPEG-deartefact, dehaze, low-light, colourisation), plus NCNN/ONNX/TensorRT model files. Loads .pth, .pt, .safetensors, some .ckpt.
Source: chaiNNer-org/chaiNNer.
9.2 Spandrel
ChaiNNer’s Python core, also usable on its own. Spandrel on PyPI. Useful if we want ChaiNNer’s arch coverage from a script rather than a node graph.
Catalogue: ESRGAN family, SwinIR, HAT, Real-ESRGAN, AuraSR plus ~20 other super-resolution arches; GFPGAN/CodeFormer/RestoreFormer face restorers; LaMa/MAT inpainting; NAFNet/SCUNet/Restormer denoisers; DDColor; DeJPEG. No diffusion, no Flux, no Qwen.
10 Hosted-only services
When we don’t want to run anything locally — trade convenience for privacy and control.
10.1 Runway
Runway pivoted to video around 2024 and the image-generation product line is no longer a marketed offering. Current focus: Gen-4.5 video, GWM-1 world models, real-time video agents (Runway Characters). The Photoshop and Blender plugins still exist.
Pareto dominates when: we are doing video and world-model work; for image-only workflows there are cheaper and more focused options elsewhere.
10.2 Midjourney
Midjourney — currently spanning V7 and the V8 generation (V8 shipped 2026: claimed ~5× faster than V7, native 2K output, image and video). Browser/Discord interface; AFAICT still no public API. $10–$120/month subscription.
Pareto dominates when: we want the prompt-craft aesthetic frontier. It is addictive in that we can get better at it, which feels like mastering a real skill. Unsuitable for programmatic pipelines because there’s no API.
11 Keeping the disk tidy
Model weights are the bulk of what these clients write to disk — tens to hundreds of GB — and all of it is re-downloadable. These directories matter for two chores: reclaiming space, and excluding them from Time Machine, since there is no point backing up a checkpoint that can be pulled again from Hugging Face.
Default locations on macOS:
| Client | Default model directory |
|---|---|
| Draw Things | ~/Library/Containers/com.liuliu.draw-things/Data/Documents/Models (overridable via DRAWTHINGS_MODELS_DIR) |
| InvokeAI | ~/invokeai/models |
| Mochi Diffusion | ~/Documents/MochiDiffusion/models |
| ComfyUI (source) | <clone>/models — wherever it was cloned |
| ComfyUI Desktop | a basePath chosen at install — read it from ~/Library/Application Support/ComfyUI/config.json |
| Forge Neo / SDNext / reForge | <clone>/models |
| ChaiNNer / Spandrel | no central directory; they reference model files in place |
The directory that hides the most is not a client at all: the shared Hugging Face cache at ~/.cache/huggingface, where diffusers and huggingface-cli downloads accumulate across every tool that uses them. PyTorch’s own cache (~/.cache/torch) holds auxiliary models such as upscalers.
To exclude a directory from Time Machine:
sudo tmutil addexclusion -p ~/.cache/huggingface
sudo tmutil addexclusion -p ~/invokeai/models
sudo tmutil addexclusion -p ~/Documents/MochiDiffusion/models
# Draw Things default container (skip if you set a custom dir and excluded that instead):
sudo tmutil addexclusion -p ~/Library/Containers/com.liuliu.draw-things/Data/Documents/Models
# confirm an exclusion took:
tmutil isexcluded ~/.cache/huggingfaceThe path must exist before addexclusion will accept it, and -p records a sticky exclusion keyed to the path string (right for fixed locations); the form without -p instead tags the folder so the exclusion rides along if it’s later moved.
