Quail, Ollama, oMLX, Rapid-MLX and Nativ

Five ways to run AI models on a Mac and give your tools an API. Here's what each does, with a source for every claim, and how they compare when measured on the same Mac with the same weights.

What each one does

FeatureQuail1.0Ollama0.34.4oMLX0.6.4Rapid-MLX0.15.2Nativ0.3.11
How you install itSigned, notarized Mac app (DMG or Homebrew cask); no Python sourceSigned, notarized Mac app or install script; no Python sourceSigned, notarized Mac app with Python inside, or pip sourceHomebrew or pip (Python); a separate signed desktop app sourceSigned, notarized Mac app (DMG or Homebrew cask) with Python inside source
Model formatsGGUF and MLX, from one server sourceGGUF and MLX (imported into its own store) sourceMLX only sourceMLX only sourceMLX only source
OpenAI Chat Completions and ResponsesBoth sourceBoth (Responses without stored state) sourceBoth sourceBoth sourceBoth source
Anthropic Messages (Claude Code)Yes, with count_tokens sourceYes, without count_tokens sourceYes, with count_tokens sourceYes, with count_tokens sourceYes, with count_tokens source
API keyOn from the start sourceNone for the local server sourceAsked for by the app's setup; off for the plain server sourceOff unless set (the desktop app makes one) sourceOff unless set source
Requests from web pagesRefused unless you allow an origin sourceOnly from this Mac's own pages and apps sourceAny site (CORS *), changed only in settings.json sourceAny site (CORS *) unless --cors-origins sourceAny site (CORS *) source
Several requests at onceYes: llama.cpp slots on GGUF, batched decoding on MLX sourceOne at a time by default (OLLAMA_NUM_PARALLEL); always one for some model families sourceYes, continuous batching (8 by default) sourceYes, continuous batching sourceYes, continuous batching (no limit by default) source
Prompt cachePer conversation; MLX's also kept on disk sourceIn memory (MLX runner) sourceIn memory plus an SSD tier that survives restarts sourceIn memory, saved at shutdown sourceOff by default; in memory plus an SSD tier when on source
Speculative decodingPrompt lookup (fast when a reply repeats its prompt) sourceMTP and DFlash on MLX sourceDFlash and MTP, per model, off by default sourceMTP, DFlash and more; on by default for some models sourceDFlash, EAGLE-3 or MTP draft model; off by default source
EmbeddingsYes, and reranking, on GGUF and MLX sourceYes sourceYes, and reranking sourceWith an optional extra sourceYes source
Image generationNo (planned) sourceNo (experimental support removed in 0.32.6) sourceNo sourceYes, generation and edits (an optional extra) sourceYes, generation and edits source
Speech (transcription, speech)No (planned) sourceTranscription only (not in its docs) sourceBoth (the app includes the audio runtime) sourceBoth (an optional extra) sourceBoth, and translation source
MCPNo (planned: as a server, and its tools through the API) sourceNo sourceMCP servers' tools through the API and its chat sourceMCP servers' tools through its API and rapid-mlx chat sourceMCP servers' tools in its chat, not through the API source
Starting coding toolsquail launch, and set-up snippets with a Test button sourceollama launch (about 25 tools) sourceomlx launch, and one-click setup in its admin page sourcerapid-mlx launch and agent setup sourceSets up and launches 10 terminal agents, and sets up 6 editors source
Usage data sentNone (the update check says which version is asking) sourceNone found (update checks send OS and version) sourceIts benchmark uploads results with a hashed device ID sourceOn by default since 0.15.0 (can be turned off) sourceNone found (update checks go to GitHub) source
PlatformsmacOS 14+, Apple silicon sourcemacOS, Windows, Linux sourcemacOS 15+ sourcemacOS sourcemacOS 26+, Apple silicon source
LicenceMIT sourceMIT sourceApache-2.0 sourceApache-2.0 sourceMIT source

Checked 2026-10-03 against each project's own docs, source or release notes at the version shown. Something wrong or out of date? Tell us.

Measured

Quail runs both formats, so it's compared in two lanes, each on identical weights: the same .gguf file against llama.cpp's own server and Ollama, and the same MLX folder against oMLX and Rapid-MLX. Nativ isn't measured yet (#188). Every engine gets the same prompts, the same settings and the same number of requests, one server at a time, on a Mac that's cooled down first.

How the comparison works, and what Quail changed after the first one: How it works.

Measured 2026-09-30 on Apple M1 Max, 64 GB, macOS 27.0.1. The full report has every level, the intervals and the caveats.

Qwen3 8B

Output tokens per second by requests at once, GGUF lane
GGUF lane1 request, tok/s8 at once, tok/sFirst token (1 request)GSM8KMMLU-ProBFCL
Quail38.955.71,108 ms91%62%88%
llama-server34.557.81,355 ms91%62%88%
Ollama37.460.01,140 ms91%63%89%
Output tokens per second by requests at once, MLX lane
MLX lane1 request, tok/s8 at once, tok/sFirst token (1 request)GSM8KMMLU-ProBFCL
Quail44.949.81,439 ms91%61%91%
oMLX42.542.31,953 ms89%64%91%
Rapid-MLX45.954.71,434 ms91%62%90%

Qwen3.6 35B-A3B

Output tokens per second by requests at once, GGUF lane
GGUF lane1 request, tok/s8 at once, tok/sFirst token (1 request)GSM8KMMLU-ProBFCL
Quail53.884.3690 ms96%82%92%
llama-server54.085.6667 ms95%80%91%
Ollama54.754.5634 ms95%82%90%
Output tokens per second by requests at once, MLX lane
MLX lane1 request, tok/s8 at once, tok/sFirst token (1 request)GSM8KMMLU-ProBFCL
Quail59.888.0884 ms96%85%92%
oMLX56.772.21,248 ms94%82%91%
Rapid-MLX63.7101.3870 ms95%79%32%

Gemma 4 26B-A4B

Output tokens per second by requests at once, GGUF lane
GGUF lane1 request, tok/s8 at once, tok/sFirst token (1 request)GSM8KMMLU-ProBFCL
Quail52.382.9692 ms96%86%90%
llama-server50.278.8777 ms95%90%90%
Ollama50.381.3726 ms95%91%90%
Output tokens per second by requests at once, MLX lane
MLX lane1 request, tok/s8 at once, tok/sFirst token (1 request)GSM8KMMLU-ProBFCL
Quail47.368.11,022 ms91%86%90%
oMLX45.261.01,395 ms89%85%89%
Rapid-MLX51.881.6939 ms90%85%20%

How it's measured

The harness, its settings and every raw result are in the repository: bench/, with the reasoning in ADR-0063. You can run it yourself.