<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>rapid-mlx blog</title>
  <subtitle>Benchmarks, MLX internals, and practical guides for running LLMs locally on Apple Silicon.</subtitle>
  <link href="https://rapidmlx.com/blog/"/>
  <link rel="self" href="https://rapidmlx.com/blog/feed.xml"/>
  <id>https://rapidmlx.com/blog/</id>
  <updated>2026-07-24T12:00:00Z</updated>
  <author><name>rapid-mlx</name></author>
  <entry>
    <title>Rapid-MLX 0.11.0 — 25.6× faster to first token, meet your Mac&#x27;s new agent</title>
    <link href="https://rapidmlx.com/blog/rapid-mlx-0-11-0"/>
    <id>https://rapidmlx.com/blog/rapid-mlx-0-11-0</id>
    <published>2026-07-24T12:00:00Z</published>
    <updated>2026-07-24T12:00:00Z</updated>
    <author><name>rapid-mlx</name></author>
    <summary>Fifteen releases in three weeks. Prefix-cache reuse takes TTFT from 13.1s to 0.51s, rapid-mlx chat becomes a real MCP agent, five new model families land day one, and tool calls are now schema-valid by construction — all measured on real hardware.</summary>
    <content type="html">&lt;p&gt;Rapid-MLX 0.11.0 is out today. The headline numbers are about speed; the headline &lt;em&gt;story&lt;/em&gt; is about what that speed unlocks: a built-in chat agent that chains real tools, five new model families supported on day one, and a reliability pass that makes the whole thing boring in the best way.&lt;/p&gt;
&lt;p&gt;Install it in one line:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;brew install rapid-mlx        # now in homebrew-core
# or: pip install -U rapid-mlx / uv tool install rapid-mlx&lt;/pre&gt;
&lt;h2 id=&quot;performance-stop-paying-prefill-twice&quot;&gt;⚡️ Performance: stop paying prefill twice&lt;/h2&gt;
&lt;p&gt;All numbers below are single-request wall-clock measurements on an M3 Ultra from this week&#x27;s dogfooding — not synthetic peak-decode figures.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prefix-cache reuse: 13.1s → 0.51s TTFT (25.6×).&lt;/strong&gt; Repeat a 6k-token prefix — a shared system prompt, a long agent context — and the second turn reuses the KV instead of recomputing it. One test session saved 38,032 tokens of prefill. For multi-turn chat and agent loops, this is the single biggest latency win we&#x27;ve shipped.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Response cache: 656ms → 2ms (284×).&lt;/strong&gt; An identical greedy request comes back byte-identical in 2 milliseconds with zero GPU decode. Opt-in, and ideal for eval loops and CI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Throughput:&lt;/strong&gt; 152 tok/s on Qwen3.5-4B-4bit, 104 tok/s on gpt-oss-20b, ~100 tok/s on Gemma-4-26B-4bit — wall-clock, TTFT included.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cold starts in seconds:&lt;/strong&gt; ~2s for a 4B model, ~3s for gpt-oss-20b.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bounded memory on long prompts:&lt;/strong&gt; chunked text-lane prefill keeps a 19k-token prompt at a 17.1 GB peak.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KV cache quantization:&lt;/strong&gt; int4 KV cache is the M-series default; int8 override verified.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;rapid-mlx-chat-grew-into-a-real-agent&quot;&gt;🤖 rapid-mlx chat grew into a real agent&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;chat&lt;/code&gt; started as a REPL. This cycle it became an agent we&#x27;re genuinely happy with — simple, but neat:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A real MCP agent loop.&lt;/strong&gt; Point it at any MCP server and it chains tools on its own. In testing against the standard filesystem server — 14 tools exposed — it autonomously ran &lt;code&gt;list_directory&lt;/code&gt; → &lt;code&gt;read_text_file&lt;/code&gt; and answered from the file contents, with a live tool-activity UI and per-call timing. 2.8 seconds, clean exit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thinking budgets.&lt;/strong&gt; &lt;code&gt;reasoning_max_tokens&lt;/code&gt; force-closes the &lt;code&gt;&amp;lt;think&amp;gt;&lt;/code&gt; block at decode time: set a 24-token budget and a model that would reason for 3,396 characters wraps up in ~90 — and still answers. Verified across all four reasoning families we tested.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero ceremony.&lt;/strong&gt; It spawns the server for you, gives you &lt;code&gt;/model /save /reset /help&lt;/code&gt;, and gets out of the way. &lt;code&gt;--base-url&lt;/code&gt; mode attaches to an already-running server as a pure MCP client.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;five-new-model-families-day-one&quot;&gt;🧠 Five new model families, day one&lt;/h2&gt;
&lt;p&gt;165 aliases, 16 tool-call wires, ~18 model families — dense, MoE, hybrid-linear, ternary, vision, and audio:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HY3 (Tencent Hunyuan 3)&lt;/strong&gt; 295B MoE — our fifth Tier-1 family, with native MTP self-speculative decoding (~1.5–1.7× decode)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qwen3-Coder-Next 80B&lt;/strong&gt; — day-one 4bit alias&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MiniCPM5&lt;/strong&gt; — including a brand-new tool-call wire&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LiquidAI LFM2.x&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ternary Bonsai 1.7B-2bit&lt;/strong&gt; — yes, 2-bit, and it runs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audio round-trip:&lt;/strong&gt; Kokoro TTS → Parakeet STT, verified word-perfect, both services up in under 4 seconds&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vision:&lt;/strong&gt; Qwen3-VL reads controlled test images accurately — all 5 ground-truth features in 2.1s&lt;/li&gt;
&lt;li&gt;Also new: &lt;strong&gt;KV cache export/import API&lt;/strong&gt;, and structured output migrated to llguidance (−200 MB install, native Metal token bitmask)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;tool-calls-schema-valid-by-construction&quot;&gt;🛠️ Tool calls, schema-valid by construction&lt;/h2&gt;
&lt;p&gt;One paragraph, because it just works now: agent loops used to die on almost-JSON tool arguments, so we constrain decoding at the grammar level — the model &lt;em&gt;cannot&lt;/em&gt; emit a malformed tool call. It&#x27;s verified across all four major wire formats (harmony/gpt-oss, qwen3_coder_xml, gemma4, deepseek_v3) plus hermes, for auto, forced, and required modes, on by default with zero flags. The 0.11.0 keystone: the guarantee now holds for &lt;strong&gt;reasoning models&lt;/strong&gt; too — models that &lt;code&gt;&amp;lt;think&amp;gt;&lt;/code&gt; first used to break forced calls because the grammar engaged at the wrong offset. Not anymore. (Engineering-minded readers: this was the hard part. Everyone else: you&#x27;ll never notice it, which is the point.)&lt;/p&gt;
&lt;h2 id=&quot;reliability-and-honest-gaps&quot;&gt;🛡️ Reliability and honest gaps&lt;/h2&gt;
&lt;p&gt;Every release goes through an automated dogfood battery — 5 models × 11 checks covering streaming, reasoning, forced tool calls, error paths, and performance — on real hardware. The 0.10.16 round caught three P1 regressions (a Gemma-4 &lt;code&gt;required&lt;/code&gt; loop, a flagship-serve crash, a silent schema fallback); all fixed and re-verified within 48 hours. Error paths are now honest across the board: invalid schemas → 400, unknown models → 404 with the list of what &lt;em&gt;is&lt;/em&gt; available. No silent fallbacks, ever.&lt;/p&gt;
&lt;p&gt;Honest gaps, because you&#x27;d find them anyway: Qwen3.6 native MTP is parked (its SSM-hybrid architecture clamps speculative K to 1 — the engine refuses loudly rather than silently degrading), the MCP config key is &lt;code&gt;servers&lt;/code&gt; rather than the ecosystem-standard &lt;code&gt;mcpServers&lt;/code&gt; (fix queued), and we haven&#x27;t run a same-machine head-to-head against llama.cpp/Ollama this cycle. That&#x27;s next.&lt;/p&gt;
&lt;h2 id=&quot;get-it&quot;&gt;Get it&lt;/h2&gt;
&lt;pre class=&quot;code&quot;&gt;brew install rapid-mlx
rapid-mlx chat qwen3.5-4b-4bit&lt;/pre&gt;
&lt;p&gt;Rapid-MLX is open source (Apache-2.0), MLX-native, and built for people who want their agents fast, local, and correct. 3,400+ of you have starred it — thank you. The best thing you can do for the project is break it and tell us: issues and PRs are answered fast.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;All performance figures are single-request wall-clock measurements on an Apple M3 Ultra (256 GB), macOS 26.5.2, from 2026-07 evaluation runs. tok/s includes TTFT and is not comparable across quantization levels or architectures.&lt;/em&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Moving from Ollama to rapid-mlx on Apple Silicon</title>
    <link href="https://rapidmlx.com/blog/moving-from-ollama-to-rapid-mlx"/>
    <id>https://rapidmlx.com/blog/moving-from-ollama-to-rapid-mlx</id>
    <published>2026-07-21T12:00:00Z</published>
    <updated>2026-07-21T12:00:00Z</updated>
    <author><name>rapid-mlx</name></author>
    <summary>A practical migration guide. The CLI commands map almost 1:1 (run, pull, rm, ps), you point your OpenAI-compatible tools at a new port, and you can run both servers side by side while you switch. Includes a model-name cheat sheet.</summary>
    <content type="html">&lt;p&gt;If you run local models on a Mac with Ollama and you&#x27;re curious about more speed on Apple Silicon, a drop-in &lt;strong&gt;Anthropic&lt;/strong&gt; API (not just OpenAI), or an Apache-2.0 engine — moving to rapid-mlx is mostly muscle memory. The commands you already type map almost one-to-one, and because the two servers listen on different ports, &lt;strong&gt;you can run both side by side and migrate at your own pace.&lt;/strong&gt; Nothing to rip out.&lt;/p&gt;
&lt;h2 id=&quot;should-you-switch&quot;&gt;Should you switch?&lt;/h2&gt;
&lt;p&gt;Straight, no spin:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What rapid-mlx gives you here:&lt;/strong&gt; faster inference on Apple Silicon, a drop-in **OpenAI &lt;em&gt;and&lt;/em&gt; Anthropic** API (so Claude Code, Cursor, Codex, and OpenAI clients all work), Apache-2.0, and newer model generations out of the box (Qwen 3.6, Gemma 4).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Where Ollama still wins:&lt;/strong&gt; it&#x27;s cross-platform (Windows/Linux too), and its model library is larger. If you need a non-Mac box, or a specific model rapid-mlx doesn&#x27;t carry, stay on Ollama — or run both.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last point is the theme: this isn&#x27;t a burn-the-boats migration.&lt;/p&gt;
&lt;h2 id=&quot;the-commands-are-almost-the-same&quot;&gt;The commands are almost the same&lt;/h2&gt;
&lt;p&gt;rapid-mlx deliberately mirrors Ollama&#x27;s verbs, so most of your muscle memory just works:&lt;/p&gt;
&lt;div class=&quot;tbl-wrap&quot;&gt;
&lt;table class=&quot;tbl&quot;&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th&gt;You typed (Ollama)&lt;/th&gt;
&lt;th&gt;Now type (rapid-mlx)&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;ollama run &amp;lt;model&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;rapid-mlx run &amp;lt;model&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;interactive chat REPL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;ollama pull &amp;lt;model&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;rapid-mlx pull &amp;lt;model&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;download a model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;ollama rm &amp;lt;model&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;rapid-mlx rm &amp;lt;model&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;delete a cached model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;ollama ps&lt;/code&gt;&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;rapid-mlx ps&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;show running models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;ollama list&lt;/code&gt;&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;rapid-mlx models&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;list available models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;ollama serve&lt;/code&gt;&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;rapid-mlx serve &amp;lt;model&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;start the local server&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class=&quot;note&quot;&gt;&lt;div&gt;&lt;p&gt;One real difference: &lt;code&gt;ollama serve&lt;/code&gt; starts a model-agnostic daemon, while &lt;code&gt;rapid-mlx serve &amp;lt;model&amp;gt;&lt;/code&gt; boots a server for a specific model at &lt;code&gt;http://localhost:8000&lt;/code&gt;. (&lt;code&gt;run&lt;/code&gt; still auto-loads on demand, Ollama-style.)&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;model-name-cheat-sheet&quot;&gt;Model-name cheat sheet&lt;/h2&gt;
&lt;p&gt;Model names don&#x27;t carry over verbatim — and that&#x27;s mostly good news, because rapid-mlx ships &lt;strong&gt;newer generations&lt;/strong&gt; than what a lot of Ollama setups are pinned to. Reach for the equivalent:&lt;/p&gt;
&lt;div class=&quot;tbl-wrap&quot;&gt;
&lt;table class=&quot;tbl&quot;&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th&gt;On Ollama&lt;/th&gt;
&lt;th&gt;On rapid-mlx (recommended)&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;qwen2.5:3b&lt;/code&gt;&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;qwen3.5-4b-4bit&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;qwen2.5:7b&lt;/code&gt;&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;qwen3-8b-4bit&lt;/code&gt; / &lt;code&gt;qwen3.6-35b-4bit&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;gemma2:9b&lt;/code&gt;&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;gemma-4-12b-4bit&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;gemma2:27b&lt;/code&gt;&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;gemma-4-26b-4bit&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;llama3.1:8b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;qwen3.6-35b-4bit&lt;/code&gt; or &lt;code&gt;gemma-4-12b-4bit&lt;/code&gt; (Llama 3 ships as &lt;code&gt;llama3-3b-4bit&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;deepseek-r1:8b&lt;/code&gt;&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;deepseek-r1-8b-4bit&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;deepseek-r1:32b&lt;/code&gt;&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;deepseek-r1-32b-4bit&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;mistral&lt;/code&gt;&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;mistral-24b-4bit&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;phi3&lt;/code&gt;&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;phi-3.5-mini-4bit&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;gpt-oss:20b&lt;/code&gt;&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;gpt-oss-20b&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;_tiny, punches up_&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bonsai-27b-2bit&lt;/code&gt; — a 27B in 7.9 GB, runs on a 16 GB Mac&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Run &lt;code&gt;rapid-mlx models&lt;/code&gt; for the full list, or browse the &lt;a href=&quot;https://models.rapidmlx.com/&quot;&gt;model mirror&lt;/a&gt; with a RAM filter.&lt;/p&gt;
&lt;h2 id=&quot;point-your-tools-at-the-new-port&quot;&gt;Point your tools at the new port&lt;/h2&gt;
&lt;p&gt;Anything you have wired to Ollama&#x27;s &lt;strong&gt;OpenAI-compatible&lt;/strong&gt; endpoint just needs a new base URL:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;Ollama:     http://localhost:11434/v1
rapid-mlx:  http://localhost:8000/v1&lt;/pre&gt;
&lt;p&gt;That covers most modern setups — Cursor, Continue, LangChain, and any OpenAI client. (Claude Code is even easier — it speaks the Anthropic wire; see the &lt;a href=&quot;/blog/run-claude-code-on-a-local-model&quot;&gt;Claude Code recipe&lt;/a&gt;.)&lt;/p&gt;
&lt;div class=&quot;note warn&quot;&gt;&lt;div&gt;&lt;p&gt;The one real gotcha: rapid-mlx serves the &lt;strong&gt;OpenAI&lt;/strong&gt; (&lt;code&gt;/v1/chat/completions&lt;/code&gt;) and &lt;strong&gt;Anthropic&lt;/strong&gt; (&lt;code&gt;/v1/messages&lt;/code&gt;) APIs — &lt;strong&gt;not&lt;/strong&gt; Ollama&#x27;s native &lt;code&gt;/api/generate&lt;/code&gt; · &lt;code&gt;/api/chat&lt;/code&gt; · &lt;code&gt;/api/tags&lt;/code&gt;. If a tool is hardcoded to Ollama&#x27;s own API, point it at the OpenAI path instead. Most tools already default to OpenAI-compatible, so this is usually a non-issue.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;run-both-side-by-side-while-you-migrate&quot;&gt;Run both side by side while you migrate&lt;/h2&gt;
&lt;p&gt;Because the ports don&#x27;t collide, keep Ollama on &lt;code&gt;11434&lt;/code&gt; and bring rapid-mlx up on &lt;code&gt;8000&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;# terminal 1 — your existing Ollama, untouched
ollama serve            # :11434

# terminal 2 — rapid-mlx alongside it
rapid-mlx serve qwen3.6-35b-4bit    # :8000&lt;/pre&gt;
&lt;p&gt;Move one tool over, use it for a day, and if anything&#x27;s missing you haven&#x27;t lost your old setup. When you&#x27;re confident, stop Ollama — or don&#x27;t. Nothing forces the choice.&lt;/p&gt;
&lt;h2 id=&quot;honest-expectations&quot;&gt;Honest expectations&lt;/h2&gt;
&lt;p&gt;A local model is a local model on either engine — neither is a frontier cloud model. What you&#x27;re actually buying by switching on Apple Silicon is speed, the Anthropic API surface (which unlocks Claude Code locally), Apache-2.0, and current-gen weights. What you&#x27;d give up is cross-platform support and the breadth of Ollama&#x27;s library. For most Mac-based, OpenAI/Anthropic-tool workflows, the move is a few minutes and reversible — which is the whole point of doing it side by side.&lt;/p&gt;
&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/blog/run-claude-code-on-a-local-model&quot;&gt;Run Claude Code on a local model&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href=&quot;/blog/run-cursor-on-a-local-model&quot;&gt;Cursor&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href=&quot;/blog/run-codex-cli-on-a-local-model&quot;&gt;Codex&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href=&quot;/blog/run-aider-on-a-local-model&quot;&gt;Aider&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://models.rapidmlx.com/&quot;&gt;Browse the model mirror&lt;/a&gt;&lt;/strong&gt; — RAM filter to pick the right replacement model.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/download&quot;&gt;Install rapid-mlx&lt;/a&gt;&lt;/strong&gt; — Homebrew or one curl. Apache 2.0.&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Run Aider on a Local Model — Pair-Program Offline on Your Mac</title>
    <link href="https://rapidmlx.com/blog/run-aider-on-a-local-model"/>
    <id>https://rapidmlx.com/blog/run-aider-on-a-local-model</id>
    <published>2026-07-21T12:00:00Z</published>
    <updated>2026-07-21T12:00:00Z</updated>
    <author><name>rapid-mlx</name></author>
    <summary>Point Aider at a model running locally with rapid-mlx. Two env vars, and the terminal pair-programmer edits your files entirely on your Mac — private, offline, $0 per token. Works even with reasoning-only models.</summary>
    <content type="html">&lt;p&gt;Aider is a terminal-first pair-programmer: it reads your file, sends it to the model with a plain-English instruction, and applies the returned edit blocks locally. It drives models through LiteLLM, so any OpenAI-compatible endpoint works — including a rapid-mlx server on your own Mac.&lt;/p&gt;
&lt;p&gt;Fourth in the series on running your favorite agent locally (after &lt;a href=&quot;/blog/run-claude-code-on-a-local-model&quot;&gt;Claude Code&lt;/a&gt;, &lt;a href=&quot;/blog/run-cursor-on-a-local-model&quot;&gt;Cursor&lt;/a&gt;, and &lt;a href=&quot;/blog/run-codex-cli-on-a-local-model&quot;&gt;Codex&lt;/a&gt;). About five minutes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Your code stays local.&lt;/strong&gt; Aider stops sending your files to the cloud.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No meter.&lt;/strong&gt; Edit all day for the cost of electricity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Forgiving with small models.&lt;/strong&gt; Aider uses &lt;code&gt;SEARCH/REPLACE&lt;/code&gt; edit blocks, not function calling — so even reasoning-only models pass. The signal is &quot;did it rewrite the file correctly,&quot; and that works broadly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-whole-thing&quot;&gt;The whole thing&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;pip install aider-chat&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;brew install rapid-mlx&lt;/code&gt; → &lt;code&gt;rapid-mlx serve qwen3.6-35b-4bit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;export OPENAI_API_BASE=http://localhost:8000/v1&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;1-install-aider-rapid-mlx&quot;&gt;1 · Install Aider + rapid-mlx&lt;/h2&gt;
&lt;pre class=&quot;code&quot;&gt;pip install aider-chat
brew install rapid-mlx    # in Homebrew core — no tap, no trust&lt;/pre&gt;
&lt;h2 id=&quot;2-serve-a-model-that-fits-your-mac&quot;&gt;2 · Serve a model that fits your Mac&lt;/h2&gt;
&lt;pre class=&quot;code&quot;&gt;rapid-mlx serve qwen3.6-35b-4bit&lt;/pre&gt;
&lt;div class=&quot;tbl-wrap&quot;&gt;
&lt;table class=&quot;tbl&quot;&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th&gt;Your Mac&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Good for&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;qwen3.5-4b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Quick single-file edits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32 GB&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;gpt-oss-20b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All-round&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48 GB+&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;qwen3.6-35b-4bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The coding sweet spot&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;h2 id=&quot;3-point-aider-at-it&quot;&gt;3 · Point Aider at it&lt;/h2&gt;
&lt;p&gt;Set two env vars, then run Aider on a file:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;export OPENAI_API_BASE=http://localhost:8000/v1
export OPENAI_API_KEY=not-needed

aider --model openai/qwen3.6-35b-4bit main.py&lt;/pre&gt;
&lt;p&gt;Prefer per-invocation flags instead of env vars? That works too:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;aider \
  --model openai/qwen3.6-35b-4bit \
  --openai-api-base http://localhost:8000/v1 \
  --openai-api-key not-needed \
  main.py&lt;/pre&gt;
&lt;div class=&quot;note warn&quot;&gt;&lt;div&gt;&lt;p&gt;Keep the &lt;strong&gt;&lt;code&gt;openai/&lt;/code&gt;&lt;/strong&gt; prefix on the model name — Aider drives LiteLLM, which uses it to route to the OpenAI-shape provider. And the base URL ends in &lt;strong&gt;&lt;code&gt;/v1&lt;/code&gt;&lt;/strong&gt;. Both are easy to drop and both cause confusing errors.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;4-pair-on-it&quot;&gt;4 · Pair on it&lt;/h2&gt;
&lt;pre class=&quot;code&quot;&gt;&amp;gt; add input validation to parse_config() and a test for the bad-path&lt;/pre&gt;
&lt;p&gt;Aider reads &lt;code&gt;main.py&lt;/code&gt;, proposes the edit as a diff, and applies it in place — locally.&lt;/p&gt;
&lt;h2 id=&quot;honest-expectations&quot;&gt;Honest expectations&lt;/h2&gt;
&lt;p&gt;A model on your Mac isn&#x27;t a frontier cloud model, but Aider&#x27;s plain-text edit format is unusually tolerant — it leans on the model rewriting code, not on brittle tool-call JSON. Great for private/offline edits and the everyday 80%; point &lt;code&gt;--model&lt;/code&gt; back at a cloud provider for the hard 20%.&lt;/p&gt;
&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/docs/agents/aider.html&quot;&gt;Full Aider guide&lt;/a&gt;&lt;/strong&gt; — the LiteLLM &lt;code&gt;openai/&lt;/code&gt; prefix, recommended aliases, and edit-format notes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/blog/run-claude-code-on-a-local-model&quot;&gt;Claude Code → local&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href=&quot;/blog/run-cursor-on-a-local-model&quot;&gt;Cursor → local&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href=&quot;/blog/run-codex-cli-on-a-local-model&quot;&gt;Codex → local&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/download&quot;&gt;Install rapid-mlx&lt;/a&gt;&lt;/strong&gt; — Homebrew or one curl. Apache 2.0.&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Run Claude Code on a Fully Local Model — in 5 Minutes</title>
    <link href="https://rapidmlx.com/blog/run-claude-code-on-a-local-model"/>
    <id>https://rapidmlx.com/blog/run-claude-code-on-a-local-model</id>
    <published>2026-07-21T12:00:00Z</published>
    <updated>2026-07-21T12:00:00Z</updated>
    <author><name>rapid-mlx</name></author>
    <summary>Point Anthropic&#x27;s Claude Code at a model running on your own Mac with rapid-mlx. Two environment variables, 100% local, $0 per token, and tool calls that actually work — verified on rapid-mlx 0.10.15. Here&#x27;s the whole setup.</summary>
    <content type="html">&lt;p&gt;Claude Code is a great agent. But every keystroke, every file it reads, every tool call goes to the cloud — and gets billed per token. For a lot of work — refactors, codebase Q&amp;amp;A, editing files you&#x27;d rather not upload — you don&#x27;t need a frontier model in a datacenter. You need a capable model &lt;em&gt;on your desk&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Here&#x27;s why the swap is worth it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Your code stays on the Mac.&lt;/strong&gt; Nothing is uploaded — works on a plane, behind an air-gap, or on a repo you&#x27;re not allowed to send anywhere.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No meter running.&lt;/strong&gt; Once the model is on disk, an all-day agent session costs exactly nothing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It actually works — not a hack.&lt;/strong&gt; rapid-mlx speaks Claude Code&#x27;s native wire (&lt;code&gt;/v1/messages&lt;/code&gt;) and ships &lt;em&gt;guaranteed-parseable&lt;/em&gt; tool calling, so the agent&#x27;s edits and tool calls land instead of flailing. More on that below.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The whole setup is about five minutes, most of which is a model download. You&#x27;ll need an Apple Silicon Mac (M1 or newer).&lt;/p&gt;
&lt;h2 id=&quot;before-you-start&quot;&gt;Before you start&lt;/h2&gt;
&lt;p&gt;You need Claude Code itself. If you don&#x27;t have the CLI yet:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;npm install -g @anthropic-ai/claude-code&lt;/pre&gt;
&lt;h2 id=&quot;1-install-rapid-mlx&quot;&gt;1 · Install rapid-mlx&lt;/h2&gt;
&lt;p&gt;rapid-mlx is a local, OpenAI- &lt;em&gt;and&lt;/em&gt; Anthropic-compatible inference server for Apple Silicon. It&#x27;s in Homebrew core:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;brew install rapid-mlx&lt;/pre&gt;
&lt;p&gt;Prefer not to use Homebrew? &lt;code&gt;curl -fsSL https://rapidmlx.com/install.sh | bash&lt;/code&gt; does the same — no &lt;code&gt;sudo&lt;/code&gt;, self-contained.&lt;/p&gt;
&lt;h2 id=&quot;2-serve-a-model-that-fits-your-mac&quot;&gt;2 · Serve a model that fits your Mac&lt;/h2&gt;
&lt;p&gt;Pick a model sized to your RAM and start the server. A solid default for coding is Qwen 3.6:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;rapid-mlx serve qwen3.6-35b-4bit&lt;/pre&gt;
&lt;p&gt;First run downloads the weights (cached after that). The server comes up at &lt;code&gt;http://localhost:8000&lt;/code&gt; with both OpenAI and Anthropic routes.&lt;/p&gt;
&lt;div class=&quot;tbl-wrap&quot;&gt;
&lt;table class=&quot;tbl&quot;&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th&gt;Your Mac&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Good for&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;qwen3.5-4b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fast edits, Q&amp;amp;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32 GB&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;gpt-oss-20b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All-round + strong tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48 GB+&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;qwen3.6-35b-4bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The coding sweet spot&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class=&quot;note&quot;&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;No tool flags needed.&lt;/strong&gt; Since 0.10.14, &lt;code&gt;serve&lt;/code&gt; auto-configures the tool-call parser from the model&#x27;s profile and turns on grammar-constrained tool calling by default — so tool calls come back guaranteed-parseable, with nothing to configure. (On builds older than 0.10.14, add &lt;code&gt;--tool-call-parser qwen3_coder_xml --enable-auto-tool-choice&lt;/code&gt;.)&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;3-point-claude-code-at-it&quot;&gt;3 · Point Claude Code at it&lt;/h2&gt;
&lt;p&gt;Claude Code honors the &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; environment variable. Set it to your local server and launch — that&#x27;s the whole integration:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;export ANTHROPIC_BASE_URL=http://localhost:8000
export ANTHROPIC_API_KEY=not-needed
claude&lt;/pre&gt;
&lt;div class=&quot;note warn&quot;&gt;&lt;div&gt;&lt;p&gt;The base URL is the &lt;strong&gt;root&lt;/strong&gt;, not &lt;code&gt;…/v1&lt;/code&gt; — the Anthropic SDK appends &lt;code&gt;/v1/messages&lt;/code&gt; itself. &lt;code&gt;http://localhost:8000/v1&lt;/code&gt; would POST to &lt;code&gt;/v1/v1/messages&lt;/code&gt; and 404.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;4-do-something-real&quot;&gt;4 · Do something real&lt;/h2&gt;
&lt;p&gt;You&#x27;re now running a fully local agent. Point it at a repo and give it a task:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;# inside any project
claude
&amp;gt; add a --dry-run flag to scripts/deploy.py and update the README&lt;/pre&gt;
&lt;p&gt;It reads your files, plans, and edits — all on your machine. Pull the network cable; it keeps working.&lt;/p&gt;
&lt;h2 id=&quot;why-it-just-works-and-where-it-doesnt&quot;&gt;Why it just works (and where it doesn&#x27;t)&lt;/h2&gt;
&lt;p&gt;Two things make this a real integration rather than a duct-tape proxy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Native Anthropic wire.&lt;/strong&gt; Claude Code speaks &lt;code&gt;/v1/messages&lt;/code&gt;, not OpenAI&#x27;s format. rapid-mlx serves that as a first-class route, so it&#x27;s an env-var flip — no shim, no translation layer to break.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Guaranteed-parseable tool calls.&lt;/strong&gt; Tool-call output is constrained by a grammar at generation time, so the model &lt;em&gt;can&#x27;t&lt;/em&gt; emit a malformed call. That&#x27;s the difference between an agent that edits your files and one that stalls on a broken tool block. (Verified on rapid-mlx 0.10.15: a bare &lt;code&gt;serve&lt;/code&gt; plus an Anthropic &lt;code&gt;/v1/messages&lt;/code&gt; request with a tool returns a proper &lt;code&gt;tool_use&lt;/code&gt; block.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Honest expectations.&lt;/strong&gt; A 35B model on your Mac is &lt;em&gt;not&lt;/em&gt; Claude Opus, and pretending otherwise helps no one. Where local shines: private and offline work, codebase Q&amp;amp;A, straightforward edits and refactors, and never watching a bill. Where the cloud still wins: the hardest multi-step reasoning and the largest context.&lt;/p&gt;
&lt;p&gt;The good news — you don&#x27;t have to choose. Flip the two environment variables off and Claude Code is back on the cloud model. Local for the 80%, cloud for the hard 20%.&lt;/p&gt;
&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/docs/agents/claude-code&quot;&gt;Full Claude Code guide&lt;/a&gt;&lt;/strong&gt; — SDK snippet, tool schemas, and every gotcha.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/docs/matrix.html&quot;&gt;Integration matrix&lt;/a&gt;&lt;/strong&gt; — 11 agents across the four Tier-1 families, tested.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/download&quot;&gt;Install rapid-mlx&lt;/a&gt;&lt;/strong&gt; — Homebrew or one curl. Apache 2.0.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://models.rapidmlx.com/&quot;&gt;Browse models&lt;/a&gt;&lt;/strong&gt; — pick one that fits your RAM.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Using Cursor, Codex CLI, or Aider instead? Same idea — each has a one-page guide in the &lt;a href=&quot;/docs/matrix.html&quot;&gt;docs&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Run Codex CLI on a Local Model — OpenAI&#x27;s Agent, on Your Mac</title>
    <link href="https://rapidmlx.com/blog/run-codex-cli-on-a-local-model"/>
    <id>https://rapidmlx.com/blog/run-codex-cli-on-a-local-model</id>
    <published>2026-07-21T12:00:00Z</published>
    <updated>2026-07-21T12:00:00Z</updated>
    <author><name>rapid-mlx</name></author>
    <summary>Point OpenAI&#x27;s Codex CLI at a model running locally with rapid-mlx. One config block (or a one-shot --setup), and Codex talks to your Mac the same way it talks to api.openai.com — private, offline, $0 per token.</summary>
    <content type="html">&lt;p&gt;Codex CLI is OpenAI&#x27;s official terminal agent — a fast, Rust-based coding loop. It talks to &lt;code&gt;api.openai.com&lt;/code&gt; over the Responses API. The nice part: rapid-mlx exposes that exact wire (&lt;code&gt;/v1/responses&lt;/code&gt;) as a first-class route, so you can point Codex at a model on your own Mac and it behaves the same — just local.&lt;/p&gt;
&lt;p&gt;Third in the series on running your favorite agent locally (after &lt;a href=&quot;/blog/run-claude-code-on-a-local-model&quot;&gt;Claude Code&lt;/a&gt; and &lt;a href=&quot;/blog/run-cursor-on-a-local-model&quot;&gt;Cursor&lt;/a&gt;). About five minutes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Your code stays local.&lt;/strong&gt; Nothing leaves the Mac.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No meter.&lt;/strong&gt; Once the model&#x27;s on disk, an all-day session is free.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Same wire, not a shim.&lt;/strong&gt; rapid-mlx speaks &lt;code&gt;/v1/responses&lt;/code&gt; natively — you&#x27;re changing one &lt;code&gt;base_url&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-whole-thing&quot;&gt;The whole thing&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;brew install codex&lt;/code&gt; (if you don&#x27;t have it)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;brew install rapid-mlx&lt;/code&gt; → &lt;code&gt;rapid-mlx serve qwen3.6-35b-4bit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rapid-mlx agents codex --setup&lt;/code&gt; — writes the Codex config for you&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;1-install-codex-rapid-mlx&quot;&gt;1 · Install Codex + rapid-mlx&lt;/h2&gt;
&lt;pre class=&quot;code&quot;&gt;brew install codex        # or: npm install -g @openai/codex
brew install rapid-mlx    # in Homebrew core — no tap, no trust&lt;/pre&gt;
&lt;h2 id=&quot;2-serve-a-model-that-fits-your-mac&quot;&gt;2 · Serve a model that fits your Mac&lt;/h2&gt;
&lt;pre class=&quot;code&quot;&gt;rapid-mlx serve qwen3.6-35b-4bit&lt;/pre&gt;
&lt;div class=&quot;tbl-wrap&quot;&gt;
&lt;table class=&quot;tbl&quot;&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th&gt;Your Mac&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Good for&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;qwen3.5-4b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fast edits, Q&amp;amp;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32 GB&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;gpt-oss-20b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All-round + strong tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48 GB+&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;qwen3.6-35b-4bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The coding sweet spot&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;h2 id=&quot;3-point-codex-at-it&quot;&gt;3 · Point Codex at it&lt;/h2&gt;
&lt;p&gt;The one-shot writes &lt;code&gt;~/.codex/config.toml&lt;/code&gt; for you:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;rapid-mlx agents codex --setup&lt;/pre&gt;
&lt;p&gt;Or drop it in by hand:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;# ~/.codex/config.toml
model = &quot;default&quot;
model_provider = &quot;rapid-mlx&quot;

[model_providers.rapid-mlx]
name = &quot;Rapid-MLX (local)&quot;
base_url = &quot;http://localhost:8000/v1&quot;&lt;/pre&gt;
&lt;div class=&quot;note warn&quot;&gt;&lt;div&gt;&lt;p&gt;&lt;code&gt;base_url&lt;/code&gt; must include the trailing &lt;strong&gt;&lt;code&gt;/v1&lt;/code&gt;&lt;/strong&gt; — Codex speaks the Responses API and appends &lt;code&gt;/responses&lt;/code&gt; itself. rapid-mlx is unauthed by default, so there&#x27;s no &lt;code&gt;api_key&lt;/code&gt; line (Codex&#x27;s &lt;code&gt;--strict-config&lt;/code&gt; rejects an inline literal). If you started the server with &lt;code&gt;--api-key&lt;/code&gt;, add &lt;code&gt;env_key = &quot;RAPID_MLX_API_KEY&quot;&lt;/code&gt; and export it.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;4-run&quot;&gt;4 · Run&lt;/h2&gt;
&lt;pre class=&quot;code&quot;&gt;codex
&amp;gt; refactor the auth middleware in server.py and add a test&lt;/pre&gt;
&lt;p&gt;Codex plans, edits, and runs — all against the model on your Mac.&lt;/p&gt;
&lt;h2 id=&quot;honest-expectations&quot;&gt;Honest expectations&lt;/h2&gt;
&lt;p&gt;A local model isn&#x27;t a frontier cloud model. Great for private/offline work and the everyday 80% — refactors, tests, codebase Q&amp;amp;A — with no bill. For the hardest reasoning, switch &lt;code&gt;model_provider&lt;/code&gt; back to OpenAI. Two configs, your choice per task.&lt;/p&gt;
&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/docs/agents/codex-cli.html&quot;&gt;Full Codex CLI guide&lt;/a&gt;&lt;/strong&gt; — the config block, auth, and the &lt;code&gt;/v1/responses&lt;/code&gt; route in detail.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/blog/run-claude-code-on-a-local-model&quot;&gt;Claude Code → local&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href=&quot;/blog/run-cursor-on-a-local-model&quot;&gt;Cursor → local&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/docs/matrix.html&quot;&gt;Integration matrix&lt;/a&gt;&lt;/strong&gt; — every agent × the four Tier-1 families.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/download&quot;&gt;Install rapid-mlx&lt;/a&gt;&lt;/strong&gt; — Homebrew or one curl. Apache 2.0.&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Run Cursor on a Local Model — Point the IDE at Your Own Mac</title>
    <link href="https://rapidmlx.com/blog/run-cursor-on-a-local-model"/>
    <id>https://rapidmlx.com/blog/run-cursor-on-a-local-model</id>
    <published>2026-07-21T12:00:00Z</published>
    <updated>2026-07-21T12:00:00Z</updated>
    <author><name>rapid-mlx</name></author>
    <summary>Point Cursor&#x27;s chat, Ctrl-K, and composer at a model running locally with rapid-mlx. One custom base URL in Settings → Models, and your editor&#x27;s AI runs on your Mac — private, offline, $0 per token.</summary>
    <content type="html">&lt;p&gt;Cursor is where a lot of us live now, and its AI is genuinely good. But every completion, every Ctrl-K, every composer run goes to the cloud and gets billed. For a lot of day-to-day editing — refactors, explain-this, small features — you don&#x27;t need a frontier model in a datacenter. You need a capable one &lt;em&gt;on your Mac&lt;/em&gt;, wired into the editor you already use.&lt;/p&gt;
&lt;p&gt;This is the second in a short series on pointing your favorite agent at a local model. (First up was &lt;a href=&quot;/blog/run-claude-code-on-a-local-model&quot;&gt;Claude Code&lt;/a&gt;.) Cursor takes about five minutes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Your code stays local.&lt;/strong&gt; Cursor&#x27;s chat and composer stop shipping your files to the cloud.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No meter.&lt;/strong&gt; Once the model&#x27;s on disk, editing all day costs nothing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It just works.&lt;/strong&gt; rapid-mlx serves the OpenAI wire Cursor expects — you&#x27;re changing one URL, not installing a bridge.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-whole-thing&quot;&gt;The whole thing&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;brew install rapid-mlx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rapid-mlx serve qwen3.6-35b-4bit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Cursor → Settings → Models → set the OpenAI base URL to &lt;code&gt;http://localhost:8000/v1&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;1-install-rapid-mlx&quot;&gt;1 · Install rapid-mlx&lt;/h2&gt;
&lt;p&gt;Local, OpenAI-compatible inference for Apple Silicon. It&#x27;s in Homebrew core:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;brew install rapid-mlx&lt;/pre&gt;
&lt;h2 id=&quot;2-serve-a-model-that-fits-your-mac&quot;&gt;2 · Serve a model that fits your Mac&lt;/h2&gt;
&lt;pre class=&quot;code&quot;&gt;rapid-mlx serve qwen3.6-35b-4bit&lt;/pre&gt;
&lt;p&gt;The server comes up at &lt;code&gt;http://localhost:8000&lt;/code&gt;. First run downloads the weights; after that it&#x27;s seconds.&lt;/p&gt;
&lt;div class=&quot;tbl-wrap&quot;&gt;
&lt;table class=&quot;tbl&quot;&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th&gt;Your Mac&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Good for&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;qwen3.5-4b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fast edits, Q&amp;amp;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32 GB&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;gpt-oss-20b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All-round + strong tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48 GB+&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;qwen3.6-35b-4bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The coding sweet spot&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class=&quot;note&quot;&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;No tool flags needed.&lt;/strong&gt; Since 0.10.14, &lt;code&gt;serve&lt;/code&gt; auto-configures the tool-call parser and turns on grammar-constrained tool calling — Cursor&#x27;s composer, which leans on tool calls, gets clean results with nothing to set.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;3-point-cursor-at-it&quot;&gt;3 · Point Cursor at it&lt;/h2&gt;
&lt;p&gt;Open &lt;strong&gt;Settings → Models → Add Model&lt;/strong&gt;, then set:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;OpenAI API Base:  http://localhost:8000/v1
API Key:          not-needed
Model name:       default        # or any served alias, e.g. qwen3.6-35b-4bit&lt;/pre&gt;
&lt;div class=&quot;note warn&quot;&gt;&lt;div&gt;&lt;p&gt;The base URL ends in &lt;strong&gt;&lt;code&gt;/v1&lt;/code&gt;&lt;/strong&gt; here — that&#x27;s the OpenAI shape Cursor speaks. (Claude Code is the opposite: it wants the bare root. Different wires.) And if Cursor&#x27;s dropdown hides an alias it doesn&#x27;t recognize, pick &lt;strong&gt;&lt;code&gt;default&lt;/code&gt;&lt;/strong&gt; — it always resolves to whatever the server booted.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;4-use-it&quot;&gt;4 · Use it&lt;/h2&gt;
&lt;p&gt;Pick &lt;code&gt;default&lt;/code&gt; from the model dropdown. Now &lt;strong&gt;chat, Ctrl-K, and composer&lt;/strong&gt; route to &lt;code&gt;http://localhost:8000/v1&lt;/code&gt; — running on your Mac. Ask it to explain a function, refactor a file, or scaffold a component; it reads and edits in the editor as usual.&lt;/p&gt;
&lt;h2 id=&quot;what-this-covers-and-what-it-doesnt&quot;&gt;What this covers — and what it doesn&#x27;t&lt;/h2&gt;
&lt;div class=&quot;note&quot;&gt;&lt;div&gt;&lt;p&gt;Cursor&#x27;s &lt;strong&gt;interactive surfaces — chat, Ctrl-K, and composer — honor the custom endpoint.&lt;/strong&gt; Cursor&#x27;s fully-managed background agent routes through Cursor&#x27;s own backend and can&#x27;t be pointed at a local server. So this covers the editing you do by hand all day; the autonomous cloud agent stays cloud. For a &lt;em&gt;fully&lt;/em&gt; local agent loop, &lt;a href=&quot;/blog/run-claude-code-on-a-local-model&quot;&gt;Claude Code&lt;/a&gt; or Codex is the better fit.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Honest expectations.&lt;/strong&gt; A model on your Mac isn&#x27;t a frontier cloud model. Where local shines: private and offline work, quick edits, explain-and-refactor, and never watching a bill. Where the cloud still wins: the hardest reasoning and the largest context. You don&#x27;t have to pick one — switch Cursor&#x27;s model back anytime.&lt;/p&gt;
&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/docs/agents/cursor.html&quot;&gt;Full Cursor guide&lt;/a&gt;&lt;/strong&gt; — settings, model dropdown notes, and the agent-path caveat in detail.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/blog/run-claude-code-on-a-local-model&quot;&gt;Claude Code → local&lt;/a&gt;&lt;/strong&gt; — the fully-local CLI agent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/docs/matrix.html&quot;&gt;Integration matrix&lt;/a&gt;&lt;/strong&gt; — every agent × the four Tier-1 families.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/download&quot;&gt;Install rapid-mlx&lt;/a&gt;&lt;/strong&gt; — Homebrew or one curl. Apache 2.0.&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>The 5 Best AI Models You Can Actually Run on a MacBook Pro (2026)</title>
    <link href="https://rapidmlx.com/blog/best-local-ai-models-macbook-pro"/>
    <id>https://rapidmlx.com/blog/best-local-ai-models-macbook-pro</id>
    <published>2026-07-15T12:00:00Z</published>
    <updated>2026-07-17T12:00:00Z</updated>
    <author><name>rapid-mlx</name></author>
    <summary>I benchmarked five local LLMs that fit a MacBook Pro — Gemma 4, Qwen3.6, GPT-OSS-20B, Nemotron-Nano-30B, and a ternary Bonsai-27B — on coding, reasoning, tool-calling, and memory. One of them is a 27B model squeezed into 8GB, and it nearly won.</summary>
    <content type="html">&lt;p&gt;There&#x27;s a model in this lineup that has no business working.&lt;/p&gt;
&lt;p&gt;It&#x27;s 27 billion parameters — the size of a model you&#x27;d expect to need a serious desktop for — but someone crushed every weight down to &lt;em&gt;two bits&lt;/em&gt;, essentially three possible values each. On paper that should lobotomize it. It fits in 8 GB. It runs on the cheapest MacBook Pro Apple sells. And when I put it through the same gauntlet as four &quot;normal&quot; models, it landed &lt;strong&gt;second place overall.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&#x27;ll get to which one it is. First, the setup: your MacBook Pro is a genuinely capable private AI workstation. No account, no monthly bill, no network round-trip, nothing you type ever leaving the machine. The only real question is &lt;em&gt;which&lt;/em&gt; model to run — and most of the advice out there is either pure vibes or benchmarked on a $6,000 Mac Studio that looks nothing like your laptop.&lt;/p&gt;
&lt;p&gt;So I took five local models that actually fit a MacBook Pro and ran every one through identical coding, reasoning, general-knowledge, and tool-calling tests, tracking exactly how much memory each one really eats. Here&#x27;s the leaderboard, then the story of each model — counted down from the one the internet oversold me to the one that changed what I think a laptop can do.&lt;/p&gt;
&lt;h2 id=&quot;the-leaderboard&quot;&gt;The leaderboard&lt;/h2&gt;
&lt;p&gt;Sorted by memory footprint — the one that fits the most Macs is at the top:&lt;/p&gt;
&lt;div class=&quot;tbl-wrap&quot;&gt;
&lt;table class=&quot;tbl&quot;&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;RAM (peak)&lt;/th&gt;
&lt;th&gt;Decode*&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Reason&lt;/th&gt;
&lt;th&gt;General&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Avg&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bonsai-27B&lt;/strong&gt; &lt;code&gt;ternary&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.0 GB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;48 t/s&lt;/td&gt;
&lt;td&gt;93%&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;81%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-OSS-20B &lt;code&gt;mxfp4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;12.2 GB&lt;/td&gt;
&lt;td&gt;125 t/s&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;65%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gemma-4-26B&lt;/strong&gt; &lt;code&gt;4-bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;14.7 GB&lt;/td&gt;
&lt;td&gt;110 t/s&lt;/td&gt;
&lt;td&gt;87%&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;84%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.6-27B &lt;code&gt;4-bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;15.5 GB&lt;/td&gt;
&lt;td&gt;37 t/s&lt;/td&gt;
&lt;td&gt;93%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;78%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nemotron-Nano-30B &lt;code&gt;4-bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;18.0 GB&lt;/td&gt;
&lt;td&gt;124 t/s&lt;/td&gt;
&lt;td&gt;83%&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;61%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;One honest warning before you read too much into this&lt;/strong&gt;, because this community checks: each capability score is a &lt;strong&gt;10-question probe&lt;/strong&gt; (30 for tools), not the full 500-question academic gauntlet. That&#x27;s plenty to sort these five into tiers and catch a model that face-plants — it is &lt;em&gt;not&lt;/em&gt; enough to litigate a three-point gap. Treat ±10% as noise, treat the tiers as real. Every model ran with &lt;code&gt;enable_thinking: false&lt;/code&gt; and &lt;code&gt;temperature: 0&lt;/code&gt;; the whole harness and all five raw result files are in the repo if you want to check my work or run it on your own Mac.&lt;/p&gt;
&lt;p&gt;Now the cast, worst to first.&lt;/p&gt;
&lt;h2 id=&quot;5-nemotron-nano-30b-the-one-the-internet-oversold&quot;&gt;5. Nemotron-Nano-30B — the one the internet oversold&lt;/h2&gt;
&lt;p&gt;I went in expecting NVIDIA&#x27;s Nemotron to win. On the public leaderboards it &lt;em&gt;beats&lt;/em&gt; Qwen3 and GPT-OSS on LiveCodeBench; it&#x27;s the shiny new Mamba-Transformer hybrid everyone&#x27;s posting about. On my bench it came &lt;strong&gt;dead last at 61%&lt;/strong&gt;, with a brutal 40% on general knowledge.&lt;/p&gt;
&lt;p&gt;Before you @ me: yes, I know it&#x27;s a reasoning model, and yes, I ran it with thinking disabled like everyone else — which hurts a think-first model more than the others. It could also be an answer-extraction quirk on my end. Both are on the retest list with thinking turned on. But here&#x27;s the honest takeaway for &lt;em&gt;today&lt;/em&gt;, on a laptop, out of the box: the model the benchmarks told me to love got quietly outclassed by models half its hype. It&#x27;s fast (124 t/s) and architecturally the most interesting thing here — it&#x27;s just not the one I&#x27;d actually run yet.&lt;/p&gt;
&lt;h2 id=&quot;4-gpt-oss-20b-the-reliable-commuter-car&quot;&gt;4. GPT-OSS-20B — the reliable commuter car&lt;/h2&gt;
&lt;p&gt;OpenAI&#x27;s little open model is the Toyota Corolla of this list, and I mean that as a compliment. It&#x27;s the fastest genuinely-useful model here (125 t/s), sips just 12 GB, and never embarrasses itself — 80% on tool calling, 80% on reasoning. It&#x27;s not going to win a drag race on any single skill (50% on coding and general knowledge), but it starts every morning and gets you there. This is why it became the default &quot;just give me something that works&quot; model on 16 GB Macs, and nothing here dethrones it from that job.&lt;/p&gt;
&lt;h2 id=&quot;3-qwen36-27b-the-savant&quot;&gt;3. Qwen3.6-27B — the savant&lt;/h2&gt;
&lt;p&gt;Every list has one genius with a blind spot. Qwen3.6 posted a &lt;strong&gt;perfect 100% on coding&lt;/strong&gt; and 93% on tool calling — the sharpest pure-code model in the room, tailor-made for driving Aider or Claude Code. Then it turned around and scored &lt;strong&gt;50% on math reasoning&lt;/strong&gt;, the kind of split that makes you double-check the logs. It&#x27;s also the slowest thing here by a mile (37 t/s), because it&#x27;s the only old-school &lt;em&gt;dense&lt;/em&gt; model in the group and pays full price for all 27 billion parameters on every single token. A specialist worth hiring — for exactly one job, on a 32 GB Mac.&lt;/p&gt;
&lt;h2 id=&quot;2-gemma-4-26b-the-quiet-valedictorian&quot;&gt;2. Gemma-4-26B — the quiet valedictorian&lt;/h2&gt;
&lt;p&gt;While everyone else has a spiky profile, Google&#x27;s Gemma just quietly does everything well. &lt;strong&gt;Highest average on the board at 84%.&lt;/strong&gt; A perfect 100% on reasoning, 90% on coding, 87% tool calling — the only model here without a real weakness (general knowledge at 60% is its softest, and it&#x27;s still fine). At 14.7 GB and 110 t/s it&#x27;s fast and fits a 24 GB Mac. If you want the top raw score and one model that never lets you down, technically this is your winner.&lt;/p&gt;
&lt;p&gt;Technically. Because there&#x27;s one model I&#x27;d hand a lot of people &lt;em&gt;instead&lt;/em&gt; — even though it scored three points lower.&lt;/p&gt;
&lt;h2 id=&quot;1-bonsai-27b-the-one-that-shouldnt-exist&quot;&gt;1. Bonsai-27B — the one that shouldn&#x27;t exist&lt;/h2&gt;
&lt;p&gt;This is the 2-bit model from the intro. A 27B brain, ternary-quantized into &lt;strong&gt;8.0 GB&lt;/strong&gt; — less memory than models with a &lt;em&gt;third&lt;/em&gt; of its parameters — and it posted an &lt;strong&gt;81% average, second only to Gemma&lt;/strong&gt;, while tying for the best tool-calling score in the entire lineup (93%).&lt;/p&gt;
&lt;p&gt;I didn&#x27;t believe it either. A 2-bit 27B keeping pace with 4-bit models nearly twice its size sounds like a broken test, and if you&#x27;re skeptical, good — go run it yourself, the harness is right there. But the number held up across all four suites, and it reframes the whole question. Every other model on this list makes you choose between &quot;smart&quot; and &quot;fits a normal MacBook.&quot; Bonsai is the first one that just... doesn&#x27;t. It&#x27;s the &lt;strong&gt;only model here a base 16 GB MacBook Pro can run with room to spare&lt;/strong&gt; — and it&#x27;s nearly the smartest one too.&lt;/p&gt;
&lt;p&gt;It&#x27;s not perfect: at 48 t/s it&#x27;s middling on speed (ternary weights don&#x27;t get the acceleration that MoE models do). But &quot;a genuinely smart 27B that runs on the cheapest MacBook Pro made&quot; is a category that basically didn&#x27;t exist a year ago. For most people, on the most common Macs, &lt;strong&gt;this is the one to run.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;so-which-one-fits-your-macbook-pro&quot;&gt;So which one fits &lt;em&gt;your&lt;/em&gt; MacBook Pro?&lt;/h2&gt;
&lt;p&gt;The scores are hardware-independent, but the memory is the part that decides whether a model runs on &lt;em&gt;your&lt;/em&gt; machine at all. Match the peak-RAM column to your Mac and leave ~20% headroom for macOS and your context window:&lt;/p&gt;
&lt;div class=&quot;tbl-wrap&quot;&gt;
&lt;table class=&quot;tbl&quot;&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th&gt;Your MacBook Pro&lt;/th&gt;
&lt;th&gt;The move&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;16 GB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Bonsai-27B&lt;/strong&gt; (8 GB). It&#x27;s the whole reason 16 GB is enough now.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;18–24 GB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Gemma-4-26B&lt;/strong&gt; (15 GB) for the top score, or Bonsai for headroom.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;32 GB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Anything here. &lt;strong&gt;Gemma&lt;/strong&gt; to do everything, &lt;strong&gt;Qwen3.6&lt;/strong&gt; to write code.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;36 GB+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All five, with room for a long context window on top.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Reality check from the machine I wrote this on — a MacBook Pro with an M3 Pro and &lt;strong&gt;18 GB&lt;/strong&gt;, one of the most common configs Apple ships: it comfortably holds only the two smallest models here, Bonsai and GPT-OSS. Everything from Gemma up is too tight once macOS and a working context are in memory. Which is exactly why that weird little ternary model matters more than its spec sheet suggests.&lt;/p&gt;
&lt;h2 id=&quot;about-that-speed-column&quot;&gt;About that speed column&lt;/h2&gt;
&lt;p&gt;Two caveats, because they&#x27;re the honest ones. First, the decode speeds (\*) were measured on a Mac Studio that was busy serving other models at the time — GPT-OSS clocked 125 t/s here versus 124 on a clean run, so they&#x27;re trustworthy as a floor, but a lab-clean laptop pass is still coming. Second, a Mac Studio (M3 Ultra, ~819 GB/s of memory bandwidth) decodes a lot faster than any laptop. Bandwidth is the lever, so to estimate your MacBook Pro, derate roughly:&lt;/p&gt;
&lt;div class=&quot;tbl-wrap&quot;&gt;
&lt;table class=&quot;tbl&quot;&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th&gt;Your Mac&lt;/th&gt;
&lt;th&gt;Bandwidth&lt;/th&gt;
&lt;th&gt;Rough decode vs Studio&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;M4 Max&lt;/td&gt;
&lt;td&gt;~546 GB/s&lt;/td&gt;
&lt;td&gt;~0.6–0.7×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M4 Pro&lt;/td&gt;
&lt;td&gt;~273 GB/s&lt;/td&gt;
&lt;td&gt;~0.4–0.5×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M4 (base)&lt;/td&gt;
&lt;td&gt;~120 GB/s&lt;/td&gt;
&lt;td&gt;~0.3–0.4×&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div class=&quot;note&quot;&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;First community data point (thanks, Lucid).&lt;/strong&gt; A reader ran the exact harness on an &lt;strong&gt;M5 MacBook Air, 16 GB&lt;/strong&gt; — &lt;code&gt;qwen3.5-4b-4bit&lt;/code&gt; decoded at &lt;strong&gt;~47 tok/s&lt;/strong&gt;, against 158 t/s for the same model on the M3 Ultra. That&#x27;s the laptop derate above, made real. They also kept every round, and the spread is the actual lesson: short-prompt decode bounced between &lt;strong&gt;38.5 and 48.0 tok/s&lt;/strong&gt; across five runs, while long-prompt decode held steady at 45.4–46.2. A single timing isn&#x27;t a machine constant — which is exactly why the scorecard stores raw rounds. Run it on your own Mac and your numbers land here too.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The capability, memory, and tool-calling numbers don&#x27;t move — only speed does.&lt;/p&gt;
&lt;h2 id=&quot;run-any-of-these-in-two-minutes&quot;&gt;Run any of these in two minutes&lt;/h2&gt;
&lt;p&gt;Everything above ran on &lt;a href=&quot;/docs/getting-started&quot;&gt;rapid-mlx&lt;/a&gt;, an OpenAI-compatible local server, which means your existing tools (Claude Code, Cursor, Aider, anything that speaks the OpenAI API) point at it with a one-line change — same API as the cloud, just &lt;code&gt;localhost&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;pip install rapid-mlx
rapid-mlx serve bonsai-27b-2bit
# → OpenAI-compatible server on http://localhost:8000/v1&lt;/pre&gt;
&lt;p&gt;If a model won&#x27;t fit your Mac, it tells you before loading instead of thrashing your machine — drop to a smaller alias and go again. For the full memory-to-model map across &lt;em&gt;every&lt;/em&gt; model size, not just these five, see &lt;a href=&quot;/blog/which-local-llm-fits-your-mac-ram&quot;&gt;Which Local LLM Fits Your Mac&#x27;s RAM?&lt;/a&gt; or the live &lt;a href=&quot;https://models.rapidmlx.com/&quot;&gt;picker at models.rapidmlx.com&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;the-fine-print&quot;&gt;The fine print&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Suites:&lt;/strong&gt; 30 tool-calling scenarios (9 categories) plus 10-question probes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;each of HumanEval+ (coding), MATH-500 (reasoning), and MMLU-Pro (general) — the same harness as our &lt;a href=&quot;/blog/mlx-model-benchmark-m3-ultra&quot;&gt;17-model M3 Ultra benchmark&lt;/a&gt;, so the two posts are directly comparable. Small suites: good for tiers, not for splitting hairs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Settings:&lt;/strong&gt; &lt;code&gt;enable_thinking: false&lt;/code&gt; and &lt;code&gt;temperature: 0&lt;/code&gt; for every model, so&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;each gets its full token budget for the answer and the run reproduces. This under-reads think-first models like Nemotron — noted above.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hardware:&lt;/strong&gt; Mac Studio, M3 Ultra, 256 GB. Capability and memory are&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;hardware-independent; decode speed is Studio-measured and derated for laptops as noted.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reproduce it:&lt;/strong&gt; the eval harness and all five raw result files ship in the&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;repo. Run &lt;code&gt;rapid-mlx serve &amp;lt;model&amp;gt;&lt;/code&gt;, point the harness at &lt;code&gt;localhost&lt;/code&gt;, and you&#x27;ll get your own numbers — on your own Mac. Corrections welcome; that&#x27;s how the last one got better.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Which MLX Models Are Actually Smart and Fast? 17 Benchmarked on M3 Ultra</title>
    <link href="https://rapidmlx.com/blog/mlx-model-benchmark-m3-ultra"/>
    <id>https://rapidmlx.com/blog/mlx-model-benchmark-m3-ultra</id>
    <published>2026-03-05T12:00:00Z</published>
    <updated>2026-03-05T12:00:00Z</updated>
    <author><name>rapid-mlx</name></author>
    <summary>Standardized HumanEval+, MATH-500, MMLU-Pro and tool-calling evals across 17 MLX models on a 256 GB M3 Ultra — decode speed, RAM, and accuracy for every model, plus what the community found, so you can pick the best local LLM for agent and coding work on Apple Silicon.</summary>
    <content type="html">&lt;p&gt;Everyone has an opinion about which local model is &quot;best&quot; on a Mac. Almost nobody backs it with numbers. So we ran standardized evals — not vibes — on 17 MLX models on a single 256 GB M3 Ultra, scoring each on coding, reasoning, general knowledge, and tool calling, and measuring decode speed and peak RAM alongside. The goal was a practical question: &lt;strong&gt;for agent and coding work on Apple Silicon, which models are worth actually running?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This started as an 11-model run; after a lot of sharp feedback from the local LLM community we expanded it to 17, fixed a parser bug that was unfairly sinking one model, and added the RAM and average columns people asked for. The community&#x27;s own findings are folded in throughout — that back-and-forth is where a lot of the real signal is.&lt;/p&gt;
&lt;p&gt;Here&#x27;s the short version before the full table:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Best overall:&lt;/strong&gt; &lt;code&gt;Qwen3.5-122B-A10B&lt;/code&gt; 8-bit — 89% average, smart across every&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;suite. Needs a big Mac.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Best value:&lt;/strong&gt; the same model at MXFP4 — near-identical scores at 65 GB, so&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;it fits a 96 GB Mac.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Best &quot;fits anywhere&quot;:&lt;/strong&gt; &lt;code&gt;Qwen3.5-27B&lt;/code&gt; 4-bit — 76% at just 15 GB RAM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fastest smart model:&lt;/strong&gt; &lt;code&gt;GPT-OSS-20B&lt;/code&gt; — 124 t/s at 12 GB, once we fixed a&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;parser bug (more on that below).&lt;/p&gt;
&lt;h2 id=&quot;the-scoreboard&quot;&gt;The scoreboard&lt;/h2&gt;
&lt;p&gt;Every score is the same suite run identically per model. &lt;strong&gt;Decode&lt;/strong&gt; is pure generation speed (tok/s); &lt;strong&gt;RAM&lt;/strong&gt; is peak resident memory; the four percentage columns are HumanEval+ (Code), MATH-500 (Reason), MMLU-Pro (General), and 30 tool-calling scenarios (Tools). All runs used &lt;code&gt;enable_thinking: false&lt;/code&gt; for a fair cross-model comparison — see the methodology note on why.&lt;/p&gt;
&lt;div class=&quot;tbl-wrap&quot;&gt;
&lt;table class=&quot;tbl&quot;&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Quant&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;Decode&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Reason&lt;/th&gt;
&lt;th&gt;General&lt;/th&gt;
&lt;th&gt;Avg&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.5-122B-A10B&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;8bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;129.8 GB&lt;/td&gt;
&lt;td&gt;43 t/s&lt;/td&gt;
&lt;td&gt;87%&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;89%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.5-122B-A10B&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;mxfp4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;65.0 GB&lt;/td&gt;
&lt;td&gt;57 t/s&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;88%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.5-35B-A3B&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;8bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;36.9 GB&lt;/td&gt;
&lt;td&gt;80 t/s&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;85%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3-Coder-Next&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;6bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;64.8 GB&lt;/td&gt;
&lt;td&gt;66 t/s&lt;/td&gt;
&lt;td&gt;87%&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;82%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3-Coder-Next&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;4bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;44.9 GB&lt;/td&gt;
&lt;td&gt;74 t/s&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;80%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM-4.5-Air&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;4bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;60.3 GB&lt;/td&gt;
&lt;td&gt;54 t/s&lt;/td&gt;
&lt;td&gt;73%&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;78%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM-4.7-Flash&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;8bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;31.9 GB&lt;/td&gt;
&lt;td&gt;57 t/s&lt;/td&gt;
&lt;td&gt;73%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;78%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.5-27B&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;4bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;15.3 GB&lt;/td&gt;
&lt;td&gt;38 t/s&lt;/td&gt;
&lt;td&gt;83%&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;76%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.5-35B-A3B&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;4bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;19.6 GB&lt;/td&gt;
&lt;td&gt;95 t/s&lt;/td&gt;
&lt;td&gt;87%&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;74%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.5-9B&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;4bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5.1 GB&lt;/td&gt;
&lt;td&gt;106 t/s&lt;/td&gt;
&lt;td&gt;83%&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;71%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MiniMax-M2.5&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;4bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;128.9 GB&lt;/td&gt;
&lt;td&gt;50 t/s&lt;/td&gt;
&lt;td&gt;87%&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;67%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-OSS-20B&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;mxfp4-q8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;12.1 GB&lt;/td&gt;
&lt;td&gt;124 t/s&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;62%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Devstral-Small-2&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;4bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;13.4 GB&lt;/td&gt;
&lt;td&gt;47 t/s&lt;/td&gt;
&lt;td&gt;17%&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;62%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.5-4B&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;4bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2.4 GB&lt;/td&gt;
&lt;td&gt;158 t/s&lt;/td&gt;
&lt;td&gt;73%&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;56%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mistral-Small-3.2&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;4bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;13.4 GB&lt;/td&gt;
&lt;td&gt;47 t/s&lt;/td&gt;
&lt;td&gt;17%&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;54%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hermes-3-Llama-8B&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;4bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4.6 GB&lt;/td&gt;
&lt;td&gt;123 t/s&lt;/td&gt;
&lt;td&gt;17%&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;27%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3-0.6B&lt;/td&gt;
&lt;td class=&quot;mono&quot;&gt;&lt;code&gt;4bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0.4 GB&lt;/td&gt;
&lt;td&gt;365 t/s&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;25%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The full scorecard — with TTFT (time-to-first-token, from 94 ms on Qwen3-0.6B to ~1.3 s on the 122B and MiniMax) and per-question breakdowns — lives in the repo: &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/blob/main/evals/SCORECARD.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;evals/SCORECARD.md&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-the-numbers-say&quot;&gt;What the numbers say&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Qwen owns the top of the board.&lt;/strong&gt; Alibaba&#x27;s &lt;a href=&quot;/docs/models/families/qwen&quot;&gt;Qwen family&lt;/a&gt; takes the top five slots. &lt;code&gt;Qwen3.5-122B-A10B&lt;/code&gt; at 8-bit is the only model that clears 90% on all four suites — and because it&#x27;s a Mixture-of-Experts model with just 10B active parameters, it still decodes at 43 t/s despite the &quot;122B&quot; label. If you have a 256 GB Mac, this is the one to run.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The best value is the same model, quantized.&lt;/strong&gt; &lt;code&gt;Qwen3.5-122B-A10B&lt;/code&gt; at MXFP4 scores 88% — statistically the same — while dropping to 65 GB RAM, which fits a 96 GB Mac and decodes &lt;em&gt;faster&lt;/em&gt; (57 t/s) than the 8-bit version. Quantization paid for itself here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Qwen3.5-27B&lt;/code&gt; is the &quot;fits anywhere&quot; pick.&lt;/strong&gt; 76% average at only 15 GB of RAM means it runs comfortably on a 32 GB Mac with room for a long context window. For most people this is the sweet spot — see &lt;a href=&quot;/blog/which-local-llm-fits-your-mac-ram&quot;&gt;why RAM, not model size, is the real ceiling&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For coding specifically, &lt;code&gt;Qwen3-Coder-Next&lt;/code&gt; is the speed king&lt;/strong&gt; — 90% coding at 74 t/s in 4-bit. If you&#x27;re driving Aider, Cursor, or Claude Code and want fast responses, it&#x27;s the pick. &lt;a href=&quot;/docs/models/families/glm&quot;&gt;GLM-4.7-Flash&lt;/a&gt; is the sleeper: a perfect 100% on coding and 90% reasoning, but only 50% on MMLU-Pro — brilliant at code tasks, weak on general knowledge.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Two models are coding-only traps for agents.&lt;/strong&gt; &lt;code&gt;Devstral-Small-2&lt;/code&gt; scores 90% on code but &lt;strong&gt;17%&lt;/strong&gt; on tool calling — its chat template has no tool support, so it&#x27;s a great code model and a terrible agent. &lt;a href=&quot;/docs/models/families/mistral&quot;&gt;Mistral-Small-3.2&lt;/a&gt; has the same problem. If you&#x27;re building agents, tool-calling accuracy matters more than raw coding score.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;MiniMax-M2.5&lt;/code&gt; can&#x27;t code — but reasons well.&lt;/strong&gt; 10% on HumanEval+ despite 87% tool calling and 80% reasoning. Something is off with its code-generation format (possibly a quant artifact at 4-bit — the community had thoughts on this, below); it&#x27;s a strong &lt;a href=&quot;/docs/models/families/minimax&quot;&gt;reasoning model&lt;/a&gt;, not a coder.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Small models are fast and useless for agents.&lt;/strong&gt; &lt;code&gt;Hermes-3-Llama-8B&lt;/code&gt; and &lt;code&gt;Qwen3-0.6B&lt;/code&gt; scream along at 120–365 t/s but score under 30% on tool calling and under 20% on coding. Fine for autocomplete or simple chat; not viable for agent work.&lt;/p&gt;
&lt;h2 id=&quot;the-gpt-oss-bug-that-a-benchmark-caught&quot;&gt;The GPT-OSS bug that a benchmark caught&lt;/h2&gt;
&lt;p&gt;The most useful thing about running real evals is that they surface &lt;em&gt;engine&lt;/em&gt; bugs, not just model quality. In the first run, &lt;a href=&quot;/docs/models/families/gpt-oss&quot;&gt;GPT-OSS-20B&lt;/a&gt; scored a dismal &lt;strong&gt;17%&lt;/strong&gt; on tool calling — wildly out of line with its reputation. It turned out not to be the model at all: our harmony parser was serializing multi-turn tool history as plain text instead of native harmony tokens. One flag — &lt;code&gt;SUPPORTS_NATIVE_TOOL_FORMAT=True&lt;/code&gt; — and tool calling jumped to &lt;strong&gt;80%&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That&#x27;s the difference between a leaderboard and a benchmark you can act on: GPT-OSS-20B is now, at 12 GB RAM and 124 t/s, the &lt;strong&gt;fastest genuinely smart model in the set&lt;/strong&gt; — the default lightweight agent model we&#x27;d put on a 16 GB MacBook.&lt;/p&gt;
&lt;h2 id=&quot;what-the-community-found&quot;&gt;What the community found&lt;/h2&gt;
&lt;p&gt;The best corrections to this table came from other people running the same hardware. A few threads worth surfacing:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The benchmark ceiling isn&#x27;t the real-world ceiling.&lt;/strong&gt; Several people on 512 GB M3 Ultras reported that &lt;code&gt;Qwen3.5-397B&lt;/code&gt; beats the 122B in day-to-day use — specifically manipulating large amounts of text without drifting into errors — even though 122B matches it on these benchmark questions. The lesson: at the top of the board, a 10-question suite stops discriminating, and real-world robustness pulls ahead. 397B is on the retest list.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Watch your KV cache, not just your weights.&lt;/strong&gt; Running the 122B at 4-bit lands around 200 GB, which leaves very little on a 256 GB Mac — and a full 128K-token context can add tens of gigabytes of KV cache on top. Multiple readers pointed out that &quot;fits in RAM&quot; and &quot;fits in RAM &lt;em&gt;with&lt;/em&gt; your working context&quot; are different questions. If you run long contexts, size down a tier. (This is the whole premise of the companion &lt;a href=&quot;/blog/which-local-llm-fits-your-mac-ram&quot;&gt;memory-to-model guide&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quantization is not free, especially for coding.&lt;/strong&gt; The sharpest note was that heavily quantized weights aren&#x27;t the same model — coding is usually the first capability to fall off, and newer models seem &lt;em&gt;more&lt;/em&gt; quant-sensitive than older ones. Dynamic Q4 tends to track normal Q6/Q8 far better than a plain Q4. That makes &lt;code&gt;MiniMax-M2.5&lt;/code&gt;&#x27;s 10% coding score suspect: it may be a 4-bit artifact rather than the real model, which is exactly why 6-bit+ is on the retest list.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Turning off thinking is a real trade-off.&lt;/strong&gt; The fairest objection to the methodology: disabling &lt;code&gt;enable_thinking&lt;/code&gt; penalizes models &lt;em&gt;designed&lt;/em&gt; to reason step-by-step, so this table under-reads their true ceiling. That&#x27;s correct — see the methodology note for why we still made it the default, and why a thinking-enabled eval is warranted as a separate board.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Decode vs prompt-processing.&lt;/strong&gt; A few readers rightly wanted prompt-processing speed broken out rather than folded in. To be clear: the &lt;strong&gt;Decode&lt;/strong&gt; column here is pure generation speed; TTFT (which captures prompt processing) is a separate column in the full scorecard, ranging from 94 ms to ~1.3 s.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vision works, quietly.&lt;/strong&gt; For the multimodal question: the engine auto-detects vision models (Gemma 3, Qwen2.5-VL, etc.) and routes them through the MLLM pipeline, or you can force it with &lt;code&gt;--force-mllm&lt;/code&gt;. &lt;code&gt;Qwen3.5&lt;/code&gt; itself is a text-only MoE, so don&#x27;t expect image input from it.&lt;/p&gt;
&lt;h2 id=&quot;methodology&quot;&gt;Methodology&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Suites:&lt;/strong&gt; HumanEval+ (coding), MATH-500 (competition math / reasoning),&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MMLU-Pro (general knowledge), plus 30 tool-calling scenarios across 9 categories.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Server:&lt;/strong&gt; rapid-mlx — an OpenAI-compatible MLX inference server on&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;localhost, with the eval framework included in the repo so anyone can reproduce or submit their own numbers. Cache cleared between suites.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;enable_thinking: false&lt;/code&gt; for everyone.&lt;/strong&gt; This is the one deliberate choice&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;worth defending. Reasoning models like Qwen3.5 emit thousands of thinking tokens; under a fixed &lt;code&gt;max_tokens&lt;/code&gt; budget the actual answer gets truncated mid-thought and scores collapse to 30–40% instead of 90%. Disabling thinking across the board gives every model its full token budget for the answer. It is not a perfect apples-to-apples for models &lt;em&gt;designed&lt;/em&gt; to think — a thinking-enabled eval is on the roadmap — but it&#x27;s the fairest single knob for a cross-model table.&lt;/p&gt;
&lt;div class=&quot;note&quot;&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;Quantization caveat.&lt;/strong&gt; Heavily quantized weights are not identical to the full model, and coding is usually the first capability to degrade. A model that underperforms at 4-bit (MiniMax-M2.5, here) may look very different at 6-bit or higher. Read the table as &quot;this model at this quant,&quot; not &quot;this model, period.&quot;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;the-hardware&quot;&gt;The hardware&lt;/h2&gt;
&lt;p&gt;Every number above is from one machine: a Mac Studio &lt;strong&gt;M3 Ultra&lt;/strong&gt; — 28-core CPU, 60-core GPU, 32-core Neural Engine, &lt;strong&gt;256 GB&lt;/strong&gt; unified memory. The M3 Ultra&#x27;s memory bandwidth is the main reason decode speeds hold up on the large models; a 64–128 GB M4 Max will run most of these but decode the big MoEs slower — bandwidth, not core count, is the lever.&lt;/p&gt;
&lt;h2 id=&quot;whats-next&quot;&gt;What&#x27;s next&lt;/h2&gt;
&lt;p&gt;Still on the bench, much of it straight from the community&#x27;s request list: &lt;code&gt;Qwen3.5-397B&lt;/code&gt;, &lt;code&gt;GPT-OSS-120B&lt;/code&gt;, Step 3.5 Flash, Nemotron-Nano-30B, LFM-2-24B, 3-bit variants for 32 GB machines, and &lt;code&gt;MiniMax-M2.5&lt;/code&gt; at 6-bit+ to test the quantization theory above.&lt;/p&gt;
&lt;p&gt;The scorecard is a living document — it&#x27;s built to take community submissions, so if you run the eval on your own Mac you can add your numbers. Run &lt;code&gt;rapid-mlx serve &amp;lt;alias&amp;gt;&lt;/code&gt;, point the eval harness at &lt;code&gt;localhost:8000/v1&lt;/code&gt;, and submit. Not sure which model fits your machine first? Start with the &lt;a href=&quot;/blog/which-local-llm-fits-your-mac-ram&quot;&gt;memory-to-model guide&lt;/a&gt; or the live &lt;a href=&quot;https://models.rapidmlx.com/&quot;&gt;picker at models.rapidmlx.com&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
</feed>
