·
1.0.9 · TestFlight · 1.0.8 on the Mac App Store

Local Mind

Large models run on the Machine in front of you. Once a model is serving, the engine cannot open a network connection — the prompt has nowhere else to go. Hybrid Mind is the second use case: keep that engine and put a cloud API beside it, under one endpoint, with a priority between them — so a model you host and a model you rent answer the same agents, and you can always tell which one did.

New in 1.0.9

MLX checkpoints in the picker, and Hybrid Mind. Version 1.0.9, build 77, is uploaded and on TestFlight internal testing; the App Store version record is prepared and no build is submitted for review yet, so 1.0.8 is still the released version. TestFlight is not the App Store, and this band says so rather than implying otherwise.

Serve MLX checkpoints, not only a single file

Until now every model in the picker was one .gguf. Five catalogue models are also published as MLX checkpoints — a folder with a config.json, safetensors shards and a tokenizer — and the mlx engine reads that format. Where a model exists in both, the row carries a switch: GGUF runs on this app's own engines, MLX runs on mlx-server. The choice is remembered per model.

Each checkpoint is catalogued per file, with the publisher's own byte size and checksum, because a directory has no single artefact to verify. Nothing is fetched that the engine does not read — no model card, no licence text, no helper scripts — and an interrupted download resumes from the file it was missing.

The five checkpoints, and whose records they are

Gemma 4 26B A4B (15.6 GB), Ternary Bonsai 2 27B (8.6 GB), Qwen3.8-27B 4-bit MTP (16.1 GB), Laguna XS 2.1 NVFP4 (21.6 GB) and Qwen3.8-Flash-Next 4-bit MTP (113.2 GB, published by TensorFold).

These are the reference checkpoints the finished MLX.fast optimisation tracks pinned. Two tracks published records — 453.1% over a serial control for Bonsai 2, 111% composite for Qwen3.8-Flash-Next — measured by that competition, on its hardware, against its own control. The winners were the submitted engines, not the models. What this release adds is a verified download and a way to serve the weights those engines were tuned against.

And it does not serve them with a winning engine, which was measured rather than assumed: the Bonsai 2 track's winning tree, at the submission holding that record, decoded 10.0–10.4 tok/s against the stock MLX engine's 30.7–35.3 on the same checkpoint, three repetitions each, greedy, on an M1 Ultra 128 GB. Its advantage is speculative decoding driven by a pinned drafter the serving binary will not load, so what is reachable is the slower target-only path.

Point at a model instead of fetching it

“Browse…” now accepts a model folder as well as a .gguf, Spotlight finds MLX checkpoints already on this Mac and lists them as models, and a folder you choose is granted access once and remembered across launches.

One new model. Gemma 4 26B A4B — 26B parameters, 4B active, QAT 4-bit, 15.6 GB. It is catalogued as an MLX checkpoint only; there is no GGUF for it, and it carries an unevaluated badge because no speed figure has been measured for it here.

Hybrid Mind — one endpoint, a local model and a cloud model

The app fronts the local engine and a cloud API you configure on its own port, speaking all three request shapes, so Claude Code on /v1/messages, Codex on /v1/responses and opencode-style clients on /v1/chat/completions all get it without being reconfigured. A priority says which side to try first.

Off until you turn it on; it states that prompts will leave before the first enable; the engine keeps its own port, so anything already pointed there stays local-only; every reply is tagged with the side that answered, and both sides are counted. When the provider reports no remaining credit it says so once and goes local-only rather than asking again — turning the cloud back on retries, and will ask again if the account is still unfunded.

The engine itself is untouched and still network-locked: it holds no outbound entitlement, and the cloud call is made by the app, which needs network access for model downloads anyway. That asymmetry is why the engine's guarantee survives the feature.

A local turn that an agent's preamble does not swamp

The local service can compact an agent's fixed preamble before the model prefills it (off by default). Measured on a real captured Claude Code request with 23 tools, tool definitions were 64% of the body and the system prompt only 8% — the opposite of the obvious guess. Compacting tools first removed 77% of the tool definitions and 52% of the whole prefilled context, about 24.7K approximate tokens down to 11.9K, while keeping every tool's name and required parameters: a clipped description makes a tool worse to choose, a missing name makes the call impossible to construct, and those are different kinds of damage.

It sits in the protocol parsers rather than one client's path, so all three shapes shrink — 85%, 87% and 85% on one deliberately bulky tool. What is not claimed is an end-to-end run with each agent: the ratios above come from one captured Claude Code request, and another agent's preamble has a different shape.

Where MLX models run, and where they do not

The MLX engine is a separate mlx-server binary installed beside the app's other engine files, and macOS does not let the Mac App Store build launch an app outside itself. MLX models therefore run in the Developer-ID build only, and the App Store build says so plainly rather than failing with an engine error. The GGUF version of every model above except Gemma 4 runs in both builds.

Four of the five checkpoints were loaded and served through the app's engine path on an M1 Ultra 128 GB, answering with correct completions, their catalogued checksums checked against the bytes on disk. The fifth, the 113 GB Qwen3.8-Flash-Next pack, was fetched in full and does not load on the bundled engine: it reaches 75.8 GiB of weights and then trips a runtime precondition inside that architecture's embedding layer. Said plainly because the row is in the catalogue.

Served by a third-party MLX binary this app does not ship, the same pack decodes at 26.4 tok/s on this machine (median of three, 628-token prompt, 128 generated), against 43.7 for the GGUF form of the same model on the reference engine. That is a capacity result, not a verdict on the packaging: its per-layer embedding table was paged from SSD rather than resident, and whether its draft head engaged is unconfirmed — the binary logs no acceptance rate.

512 fewer GPU dispatches a token, and the throughput goal now met

A decode step of Ternary Bonsai 2 issued 1171 separate GPU dispatches; nine kernel pairs are now fused into one each, taking it to 659, bit-identical — all 248320 logits match as bit patterns. On an M1 Ultra 128 GB, twelve interleaved whole-process runs (six fused, six not) measure +12.9% against this session's own control, and the fused rate, 33.46 tok/s at a 256-token prompt, clears the 32.0 goal this work was aimed at. Still not in build 77 or any shipped build.

Earlier releases are kept in full: 1.0.8, 1.0.7, 1.0.6, 1.0.5, 1.0.4, 1.0.3 and 1.0.2.

Every option, in the order you meet them

Four decisions stand between a model file and a running assistant. The app makes each one explicitly, and tells you which choices your Machine can actually honour — a 594 GB model is offered, flagged, and honestly priced rather than hidden.

STAGE 01 Model Downloaded and SHA-256 verified before it will load. A GGUF file, or — new in 1.0.9 — an MLX checkpoint folder, verified file by file.
  • DeepSeek-V4-Flash267B MoE, three expert recipes
  • DeepSeek-V4-Pro-0813new1.6T MoE, 850 GB — out-of-core only
  • Qwen3 · 3.6 · 3.8new4B to 32B dense, a 35B-A3B MoE, and a 27B with 256K context
  • Muse Glimmer 30BnewMeta, 30B dense in 17 GB
  • MiniMax H3newText to video, with synchronised audio
  • Laguna S / XS 2.1Poolside coding models, 110B and 33B
  • GLM-5.3-Flashnew320B MoE, 18B active — the first GLM that fits in memory on a 128 GB Mac
  • Qwen3.8-Flash-Nextnew125B MoE, 6B active — hybrid linear and sparse attention
  • DeepSeek-V4-Flash Vision-ExpnewSees images — model plus its encoder, 81.6 GiB together
  • DeepSeek-V4.1-Flashpurchase763B MoE, 366 GB — only ~152 GiB of it is weights
  • Qwen3.8-Flash-Next MTPpurchaseThe same 125B, drafting several tokens at a time — 147 GB, ~45 GiB resident
  • Gemma 4 26B A4BnewGoogle, 26B/4B active, QAT 4-bit — MLX checkpoint only, 15.6 GB
  • Ternary Bonsai 2 27Bnew1.75 bits per weight — 5.95 GB as GGUF, 8.6 GB as MLX
  • Laguna XS 2.1 NVFP4newThe same 33B as an MLX checkpoint, 21.6 GB
  • Kimi-K3~1500B, out-of-core only
  • Bring your ownAny GGUF on disk — or an MLX folder, browsed or found by Spotlight
STAGE 02 Engine Which implementation executes the weights. Named, so a number is never misattributed.
  • optimizedOur Rust engineHand-written Metal kernels, generated by our own compiler
  • referenceantirez's C engineThe upstream reference, for models it supports
  • llamacppllama.cppThird-party, linked in-process
  • llamacpp-ds4llama.cpp + ds4 kernelsUpstream with our kernels substituted
  • mlxMLX (mlx.fast)newApple MLX — the only engine here that reads an MLX checkpoint folder. A separate local process behind this server, so Developer-ID builds only.
  • mlx-tensorfoldMLX (TensorFold MTP)newSpecialised to one checkpoint, with its pinned draft head. Listed as unavailable until its build is installed, rather than quietly falling back to the stock one.
STAGE 03 Residency Where the weights live. Decided by physics — size against memory and disk.
  • pureGPU residentWhole model in unified memory. Fastest.
  • ssdSSD-streamExperts stream from disk. Runs models larger than RAM.
  • hybridCPU + GPUSplit across both. Last resort for the largest files.
STAGE 04 Surface How you reach the running model.
  • PlaygroundPrompt, streamed answer with thinking split out, and a speed report
  • Generate VideonewA few seconds of video from a description, or from a first and last frame
  • Local APIChat-completions and Anthropic wire formats, loopback by default
  • AI agentsWire a coding agent to the local model in one click
  • Serve othersOpt in per session, API key required — off again at every launch
  • Hybrid MindnewA second port fronting the local engine and a cloud API, with a priority — off until you turn it on, and every reply says which side answered

What your Machine can run

Engine binds 127.0.0.1:8000

ds4-rs-amd AMD ROCm. A controller: it probes the hardware, plans the split and launches the ROCm engine. Measured on the Ryzen AI Max+ 395 row above. The only one of the three whose tarball also carries its licence and notice files. available · x86-64
ds4-rs-ascend Huawei Ascend NPU. The controller only — the tarball holds that one binary, not a standalone server. available · arm64
ds4-rs-cuda NVIDIA. The engine behind the GB10 row above, built for the Grace arm64 host that machine is. available · arm64

One command. It detects the accelerator, fetches only the matching binary, checks it against a published SHA-256, and installs the key:

curl -fsSL https://peria.ai/install | sh -s -- --key DS4-… --email you@example.com

Without a key it installs and runs the unlicensed path, so you can try it before buying one.

Piping a script into a shell asks you to trust what you cannot read, which is the opposite of everything else on this page. The same install, verifiable:

curl -fsSLO https://peria.ai/install shasum -a 256 install # must match the value published at peria.ai/install.sha256 sh install --key DS4-… --email you@example.com

One key, every binary. The licence carries an expiry and the address it was issued to, and nothing else — there is no per-binary entitlement, so a key bought for one accelerator works on the others as they ship. It is checked offline against a public key compiled into the binary: no network is consulted, so it works on an air-gapped machine, and it stops working the day after it expires without needing to phone home. Keys come from peria.ai, emailed on purchase.

The prompt cannot leave, unless a hybrid cloud/local API mode is turned on

Enforced, not promised. Once the engine has loaded weights and bound its port, it asks the kernel to revoke its own networking — irreversibly, for the life of the process.

The one exception, named rather than buried. A hybrid mode can put a cloud API beside the local engine, and a prompt the cloud side answers does leave this Mac. It is off until you turn it on, it says so before the first time, it runs on a different port from the engine — so anything already pointed at the engine stays local-only — and every reply records which side produced it. The engine itself stays locked either way: it is the app, not the engine, that can reach the network, which is why the engine's guarantee survives the exception.

Check it while it serves:

lsof -i -a -p <pid>

1.0.3 adds one door, and it is locked by default. Serving others binds the LAN instead of loopback — so it needs a key you minted, it is refused without one, and it switches itself off again at the next launch. Nothing you do not turn on this session.

Hybrid Mind — the second use case

The first use case is everything above: your model, your Machine, nothing leaving. The second is one endpoint over two models — the local engine and a cloud API you choose — with a priority saying which to try first.

Why it is one feature and not two switches: the conversation survives the move. A priority alone gives you a second model. A priority plus a rolling summary plus a cooldown gives you one assistant that keeps working when the cloud rate-limits, runs out of credit, or cannot be reached — it falls back to the Machine and carries on.

It serves whichever protocol your agent speaks, so Claude Code, Codex, opencode and the rest all get it from the same port without being reconfigured.

Off until you turn it on, on a different port from the engine, and every reply records which side produced it. When the cloud runs out of credit it tells you once and goes local-only rather than asking again.

Agents on your Machine

The app writes each agent's config and points it at the local engine.

  • Claude Code
  • OpenCode
  • Open Cowork
  • DeepSeek Harness (dsh)new
  • Grok Buildnew
  • Or your own — name the binary and the wire format

Numbers you can check

Every run reports time to first token, prefill and decode rate — beside the engine that produced them and the model actually served.

Two prompts: a short chat, and a ~3000-token passage that measures real prefill.

Rankings are links, not verdicts — 1.0.3 lets you add the leaderboard you trust beside the ones we shipped.

Weights are verified

Every download carries its expected SHA-256. A mismatch is refused rather than loaded, and a partial file is reported as incomplete instead of failing later as corruption.

Built on other people's work — and our own, in the open

Local Mind is a small amount of new code on top of a great deal of open source. Named because a benchmark is meaningless without saying whose code produced it, and because these projects are the reason any of this runs at all.

Ours, open

  • jev-rs — our open-source Rust engine for typed local judgments: yes/no, choices and ordered scores. MIT OR Apache-2.0.
  • tile-rs — the compiler framework the app's own kernels come from. Kernels are written once in a Rust tile DSL and lowered through MLIR to 15 backends; the Metal kernels running your model on this machine are generated by it.
  • pu-rs.org — a ranking system for accelerator kernels, measuring execution time on real hardware rather than quoting peak FLOPS. Source and submissions are open, so a claim there can be re-run.

Also ours

  • precc — predictive error correction for coding agents. Different problem, same habit: measure it, publish the number, let someone check.

The inference engine itself is not open. The kernels it runs are generated by tooling that is, which is the part worth reading.

Engines

  • llama.cpp and ggml — Georgi Gerganov and contributors. Linked in-process as one of the selectable engines, and the origin of the GGUF format every model here is distributed in. MIT.
  • ds4 — Salvatore Sanfilippo (antirez). The upstream reference engine, shipped as the reference option and used as the correctness oracle our own kernels are checked against.

Compiler and runtime

  • Rust — the engine, the server and the compiler backend are Rust. Apache-2.0 / MIT.
  • LLVM and MLIR — our kernels are generated through an MLIR dialect before they become Metal, CUDA or AscendC. Apache-2.0 with LLVM exceptions.
  • Rust crates doing load-bearing work, notably ed25519-dalek, sha2, serde and serde_json.

Models

  • DeepSeek-V4-Flash — DeepSeek
  • DeepSeek-V4.1-Flash — DeepSeek, MIT
  • GLM-5.3-Flash — Z.ai (Zhipu), MIT
  • Qwen3 and Qwen3.6 — Alibaba, Apache-2.0
  • Qwen3.8-Flash-Next — Alibaba, Qwen community licence
  • Laguna S / XS 2.1 — Poolside
  • Kimi-K3 — Moonshot AI
  • Muse Glimmer 30B — Meta, Apache-2.0
  • MiniMax H3 — MiniMax

Each carries its own licence, shown in the app before download.

Distribution

  • Hugging Face — where the weights come from, and the quantisers who publish them.
  • The community that produces the GGUF conversions and imatrix quantisations these models are usable at all on a desktop because of.