Splash 1.5.0
Splash now has a desktop app: download and run models, chat with them, and connect coding agents from one window. This release also adds local model loading, custom tools in the Responses API, faster decode on M5 and M6, and a fix for image requests that could crash the engine.
Splash for Mac
The desktop app includes its own runtime, shares models with the CLI, and supports:
- Model downloads, switching, and launch settings.
- Streaming chat, saved conversations, images, and reasoning controls.
- Claude Code, Codex, OpenCode, Hermes, and Pi in your chosen project folder.
- Menu bar controls and automatic update checks.
Requires Apple M3 or newer and macOS 26.4 or later. Download Splash, open the DMG, and drag Splash into Applications. Or install with Homebrew:
brew install --cask incoai/tap/splash-appThe app uses the default Hugging Face cache and does not inherit HF_HOME, HF_HUB_CACHE, or HF_TOKEN from your shell. Quitting it stops the model. GGUF files added locally run text only; use the CLI for a separate vision projector or local draft. MLX folders retain their vision support. (#610)
Speed and memory
- Faster decode on M5 and M6. On a 32-core M5 Max, Qwen3.8-27B MLX 4-bit takes 11.7% less time per decode cycle with one request and 7.5–8.3% less with two to four. The 27B UD-Q4_K_M takes 2.2–4.4% less. On a 12-core M6, the 35B UD-Q2_K_XL takes 0.4–1.8% less. These are decode-cycle measurements; per-token gains for the batched 27B MLX are 1–2 percentage points smaller at three and four requests. Other GPU core counts were not measured end to end. (#235)
- Lower MoE router memory. The 35B MLX 4-bit keeps its router quantized, saving 62 MB and reducing router reads from 84 MB to 22 MB per decode cycle. Quantized GGUF MoE routers also load; F16 routers remain unsupported. (#599)
- Faster quantized kernels on M3, M4, and M5, including MLX 4-bit and several GGUF formats. These are kernel-level improvements; whole-model gains vary. (#600, #602)
Models and APIs
-
Local model files: serve a GGUF file or MLX directory with
--model-dir, without contacting the Hub. Use--draft-modelfor a local DFlash2 draft and--mmprojfor a GGUF vision projector. Otherwise, the matching draft must already be cached. (#338)splash serve --model local/qwen \ --model-dir /models/Qwen3.8-27B-GGUF/Qwen3.8-27B-UD-Q4_K_M.gguf \ --draft-model /models/Qwen3.8-27B-DFlash2
-
Custom tools: Responses accepts freeform tools such as Codex's
apply_patchand returnscustom_tool_callitems. Tool grammars are described to the model, not enforced; streamed tool input arrives when the call closes. (#426) -
Request timings: Responses and Messages report prompt/decode counts, latency, rates, cached tokens, and draft counts. Messages also reports thinking-token usage. (#427)
-
Reasoning discovery:
/v1/modelsreports supported reasoning efforts and defaults. (#610) -
Pi prefix caching:
splash pienables later system messages when the model's template supports them, preserving reusable prefixes. (#609) -
Shell completion: expands to 11 suggested models and completes local model, draft, and projector paths. (#338, #610)
Fixes
- Image requests no longer trigger GPU timeouts on models whose experts stream from SSD. Image encoding runs before prefill in a separate GPU command, and image requests use Neural Engine prefill again. (#601, fixes #596)
- Ctrl+C stops model downloads promptly. The next download from that repository cleans up interrupted partial files. (#610)
- Browser chat asks for an API key only after a 401 response. (#610)
- Update filelock to 4.2.4. (#603)
Upgrade
brew upgrade splashKeep the CLI and desktop app on the same release.
- Use full CLI option names: abbreviations such as
--max-memare no longer accepted. - Cached models: GGUF metadata is rebuilt from existing weights without downloading them again. Persistent caches for GGUF and MLX MoE models start fresh once; dense MLX caches remain usable. Switching between different App and CLI releases can repeat this.
- Offline startup: if an older Splash downloaded your model and draft, run
splash serve1.5.0 for that family once with the Hub reachable before using it offline in the app or through--model-dir. - API clients: Responses and Messages add
timings; Messages addsoutput_tokens_details.thinking_tokens. Responses'input_tokens_details.cache_write_tokensis always 0; compute uncached input asinput_tokens - cached_tokens. - Numerical changes: kernel summation changes can slightly alter greedy output. On M5 and M6, output can also depend on concurrent requests.
Thanks to @zaiyang-zhang, @yannip1234, @ghisguth, and @lucaslie for contributions, and @shimbara for the detailed report. The zero-point kernel work builds on @ghisguth's #569.
Full changelog: 1.4.1...1.5.0