<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>rapid-mlx changelog</title>
  <subtitle>Every rapid-mlx release — CLI, engine, and macOS desktop.</subtitle>
  <link href="https://rapidmlx.com/changelog/"/>
  <link rel="self" href="https://rapidmlx.com/changelog/feed.xml"/>
  <id>https://rapidmlx.com/changelog/</id>
  <updated>2026-08-21T12:00:00Z</updated>
  <author><name>raullenchai</name></author>
  <entry>
    <title>0.12.18 — 2026-08-21 · Branch your chat, run more models</title>
    <link href="https://rapidmlx.com/changelog/0.12.18"/>
    <id>https://rapidmlx.com/changelog/0.12.18</id>
    <published>2026-08-21T12:00:00Z</published>
    <updated>2026-08-21T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Regenerating an answer no longer throws the old one away — every alternative stays a switchable branch. This release also widens the catalog (LTX-2.5 video, Qwen Image, Ternary Bonsai 8B, North-Mini-Code, GPT-OSS Puzzle), makes dictation start hot…</summary>
    <content type="html">&lt;p&gt;Regenerating an answer no longer throws the old one away &amp;mdash; every alternative stays a switchable branch. This release also widens the catalog (LTX-2.5 video, Qwen Image, Ternary Bonsai 8B, North-Mini-Code, GPT-OSS Puzzle), makes dictation start hot, speeds up MoE decode, and hardens multimodal serving.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Regenerating an answer keeps the old one.&lt;/b&gt; Regenerate, Retry, and prompt edits now preserve every alternative as a switchable branch &amp;mdash; step between them with the &lt;code&gt;&amp;lsaquo; 2/3 &amp;rsaquo;&lt;/code&gt; control under the bubble. Deleting a turn tells you exactly how many turns it removes, each fork remembers where you left off, and old conversations load unchanged (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2147&quot;&gt;#2147&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Dictation starts hot.&lt;/b&gt; The catalog lookup and lazy weight load that used to land inside the first dictation of a session now run at enable / model-pick time &amp;mdash; a 30-second clip lands in well under half a second once warm, and the Dictation tab attributes slow runs (&amp;ldquo;model 1.2&amp;nbsp;s &amp;middot; asr 0.3&amp;nbsp;s&amp;rdquo;) (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2152&quot;&gt;#2152&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Faster MoE decode.&lt;/b&gt; Expert gate+up projections are fused into a single &lt;code&gt;gather_qmm&lt;/code&gt; launch (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2151&quot;&gt;#2151&lt;/a&gt;), and GDN prompt prefill gets a blocked-seq Metal kernel (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2144&quot;&gt;#2144&lt;/a&gt;); GatedDeltaNet input projections fuse into one quantized matmul (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2159&quot;&gt;#2159&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;New models.&lt;/b&gt; LTX-2.5 video generation (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2158&quot;&gt;#2158&lt;/a&gt;), Qwen Image through mflux (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2157&quot;&gt;#2157&lt;/a&gt;), Ternary Bonsai 8B (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2162&quot;&gt;#2162&lt;/a&gt;), North-Mini-Code (Cohere2-MoE, with a dedicated reasoning parser so chain-of-thought stops leaking into content) (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1223&quot;&gt;#1223&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2171&quot;&gt;#2171&lt;/a&gt;), and GPT-OSS Puzzle checkpoints (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1224&quot;&gt;#1224&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Speculative decoding stays under your control.&lt;/b&gt; Tested model families expose experimental MTP presets in the desktop (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2173&quot;&gt;#2173&lt;/a&gt;), and advanced users can opt into structurally compatible target/drafter pairs even when Rapid does not recommend them by default (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2177&quot;&gt;#2177&lt;/a&gt;) &amp;mdash; capability and recommendation stay separate, so an experimental path never silently becomes the default.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Safer multimodal serving.&lt;/b&gt; Remote and local media inputs are validated against SSRF and arbitrary-file-read paths before the VLM loader sees them (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2167&quot;&gt;#2167&lt;/a&gt;). Gemma 4 checkpoints with stale embedded chat templates are upgraded to the shipped compatible template at load time.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;SVG code blocks render a preview&lt;/b&gt; &amp;mdash; offscreen, never on the network (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2148&quot;&gt;#2148&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Mac &amp;amp; CLI polish.&lt;/b&gt; Background update progress is visible again (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2129&quot;&gt;#2129&lt;/a&gt;), WON&amp;rsquo;T FIT rows open a read-only Review (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2131&quot;&gt;#2131&lt;/a&gt;), a fresh install can quit before choosing telemetry (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2178&quot;&gt;#2178&lt;/a&gt;); &lt;code&gt;agents&lt;/code&gt; sizes its name column to the widest alias (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2139&quot;&gt;#2139&lt;/a&gt;), and a flaky update-check response no longer crashes &lt;code&gt;rapid-mlx upgrade&lt;/code&gt; (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2168&quot;&gt;#2168&lt;/a&gt;).&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul class=&quot;contrib&quot;&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/osdodo&quot;&gt;@osdodo&lt;/a&gt; &amp;mdash; switchable answer branches for Regenerate, Retry and prompt edits (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2147&quot;&gt;#2147&lt;/a&gt;)&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.12.17 — 2026-08-19 · Dictation fixed — update now</title>
    <link href="https://rapidmlx.com/changelog/0.12.17"/>
    <id>https://rapidmlx.com/changelog/0.12.17</id>
    <published>2026-08-19T12:00:00Z</published>
    <updated>2026-08-19T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>The 0.12.16 release build shipped without the macOS microphone entitlement, so dictation could never be enabled. 0.12.17 fixes it and gates every future release on the sealed signature carrying the key. Dictation works now — please update. Speech to…</summary>
    <content type="html">&lt;p&gt;The 0.12.16 release build shipped without the macOS microphone entitlement, so dictation could never be enabled. 0.12.17 fixes it and gates every future release on the sealed signature carrying the key.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Dictation works now &amp;mdash; please update.&lt;/b&gt; Speech to Text&amp;rsquo;s &amp;ldquo;Allow&amp;hellip;&amp;rdquo; button did nothing in 0.12.16: the notarized build lacked the microphone entitlement, so macOS refused the request silently &amp;mdash; no prompt, no error. The entitlement now ships in the signed app, and the build pipeline refuses to sign a release without it (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/issues/2134&quot;&gt;#2134&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2135&quot;&gt;#2135&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Agents see the context window your Mac can actually serve&lt;/b&gt;: memory-aware &lt;code&gt;max_model_len&lt;/code&gt; on &lt;code&gt;/v1/models&lt;/code&gt;, and &lt;code&gt;rapid-mlx models --json&lt;/code&gt; for scripts (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2122&quot;&gt;#2122&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Codex can dispatch MCP tools again&lt;/b&gt; over the Responses API (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2130&quot;&gt;#2130&lt;/a&gt;); out-of-range &lt;code&gt;--port&lt;/code&gt; fails with an actionable message (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2127&quot;&gt;#2127&lt;/a&gt;); the unknown-model hint drops its drifting alias count (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2128&quot;&gt;#2128&lt;/a&gt;).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.12.16 — 2026-08-19 · Dictate into any app</title>
    <link href="https://rapidmlx.com/changelog/0.12.16"/>
    <id>https://rapidmlx.com/changelog/0.12.16</id>
    <published>2026-08-19T12:00:00Z</published>
    <updated>2026-08-19T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Tap right Option and speak — the words land at your cursor in any app, transcribed on your Mac. Also in this release: web search that works out of the box, model picks that follow the Artificial Analysis index, chat that typesets math…</summary>
    <content type="html">&lt;p&gt;Tap right Option and speak — the words land at your cursor in any app, transcribed on your Mac. Also in this release: web search that works out of the box, model picks that follow the Artificial Analysis index, chat that typesets math, sliding-window prompt-cache reuse, and a page-by-page docs audit against the shipped code.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Dictate into any app.&lt;/b&gt; Tap right Option, say a sentence, and it lands wherever your cursor is &amp;mdash; any app, even with Rapid&amp;rsquo;s window closed. Audio goes to your local server&amp;rsquo;s transcription endpoint and nowhere else (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2049&quot;&gt;#2049&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Web search now works out of the box.&lt;/b&gt; Desktop chat&amp;rsquo;s web search defaults to Keenable&amp;rsquo;s keyless service &amp;mdash; no account, no API key, no more DuckDuckGo rate-limit dead ends. A free Parallel key in Settings &amp;rarr; Tools buys the best measured quality (tops the Artificial Analysis Search Index; ~1,000 free searches a month) (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2040&quot;&gt;#2040&lt;/a&gt;&amp;ndash;&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2044&quot;&gt;#2044&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Your Mac is offered the smartest model it can actually run.&lt;/b&gt; Recommendations follow the Artificial Analysis Intelligence Index: every Mac from 32&amp;nbsp;GB up gets Qwen3.8-27B &amp;mdash; GPT-5.6-class intelligence at ~40&amp;nbsp;tok/s with multi-token prediction on (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2055&quot;&gt;#2055&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Chat renders like it should.&lt;/b&gt; Inline and block LaTeX are typeset the way models actually write them (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2107&quot;&gt;#2107&lt;/a&gt;); code blocks stop flickering while an answer streams (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2106&quot;&gt;#2106&lt;/a&gt;); markdown code blocks and tables are visible again (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2056&quot;&gt;#2056&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Conversations get folders and Markdown export&lt;/b&gt;, and getting a model is two explicit steps &amp;mdash; Download, then Start (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2053&quot;&gt;#2053&lt;/a&gt;). Onboarding fills the window instead of floating as a small card (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2063&quot;&gt;#2063&lt;/a&gt;). Voice notes in Apple formats (M4A, CAF) transcribe directly (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2101&quot;&gt;#2101&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Faster in long chats.&lt;/b&gt; Sliding-window models keep reusing their prompt cache across turns instead of re-prefilling (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2064&quot;&gt;#2064&lt;/a&gt;); the prefix cache releases its memory after sitting idle (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2038&quot;&gt;#2038&lt;/a&gt;) and chat can opt out of it for sensitive prompts (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2048&quot;&gt;#2048&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;The docs were audited page by page&lt;/b&gt; against the shipped code (~20 fix PRs): all 94 &lt;code&gt;serve&lt;/code&gt; flags, every operator environment variable and the full endpoint surface are documented; six drifted defaults fixed and pinned by tests; PRIVACY/SECURITY tell the whole story (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/issues/2065&quot;&gt;#2065&lt;/a&gt;&amp;ndash;&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2113&quot;&gt;#2113&lt;/a&gt;). And the &lt;code&gt;install.sh&lt;/code&gt; you curl is now published only at release tags &amp;mdash; byte-identical to the tagged source (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2092&quot;&gt;#2092&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;CLI polish.&lt;/b&gt; &lt;code&gt;chat --port N&lt;/code&gt; asks the server what it serves (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2046&quot;&gt;#2046&lt;/a&gt;); &lt;code&gt;launch continue&lt;/code&gt; and &lt;code&gt;continue-dev&lt;/code&gt; resolve to the same client and the &lt;code&gt;agents&lt;/code&gt; footer counts honestly (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2108&quot;&gt;#2108&lt;/a&gt;); &lt;code&gt;recipe&lt;/code&gt; checks free disk before printing a &lt;code&gt;serve&lt;/code&gt; command that cannot fit (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2119&quot;&gt;#2119&lt;/a&gt;).&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul class=&quot;contrib&quot;&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/xiaoxiunique&quot;&gt;@xiaoxiunique&lt;/a&gt; &amp;mdash; math typesetting (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2107&quot;&gt;#2107&lt;/a&gt;), streaming-fence stability (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2106&quot;&gt;#2106&lt;/a&gt;), jump-to-latest, window floor and duplicate-attach fixes (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2021&quot;&gt;#2021&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2022&quot;&gt;#2022&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2023&quot;&gt;#2023&lt;/a&gt;)&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/osdodo&quot;&gt;@osdodo&lt;/a&gt; &amp;mdash; markdown visibility (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2056&quot;&gt;#2056&lt;/a&gt;) and the image progress sweep (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2028&quot;&gt;#2028&lt;/a&gt;)&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/ryo1sato&quot;&gt;@ryo1sato&lt;/a&gt; &amp;mdash; release the prefix cache after idle (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2038&quot;&gt;#2038&lt;/a&gt;)&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/loriz-art&quot;&gt;@loriz-art&lt;/a&gt; &amp;mdash; the full-window onboarding design (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2063&quot;&gt;#2063&lt;/a&gt;)&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/guo&quot;&gt;@guo&lt;/a&gt; &amp;mdash; NOTICE and upstream attribution (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1968&quot;&gt;#1968&lt;/a&gt;)&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.12.15 — 2026-08-18 · Tool calls stop truncating what your agent writes</title>
    <link href="https://rapidmlx.com/changelog/0.12.15"/>
    <id>https://rapidmlx.com/changelog/0.12.15</id>
    <published>2026-08-18T12:00:00Z</published>
    <updated>2026-08-18T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>If a coding agent wrote files through a local Qwen model on 0.12.5–0.12.14, upgrade first — outputs could be silently shortened. Also in this release: Qwen3.8-27B up to 23% faster with one flag (identical output, checksummed), downloads that reroute…</summary>
    <content type="html">&lt;p&gt;If a coding agent wrote files through a local Qwen model on 0.12.5–0.12.14, upgrade first — outputs could be silently shortened. Also in this release: Qwen3.8-27B up to 23% faster with one flag (identical output, checksummed), downloads that reroute instead of stalling, voice transcription that stops inventing words, and safer model loading.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Upgrade first if you run coding agents.&lt;/b&gt; On &lt;b&gt;0.12.5&amp;ndash;0.12.14&lt;/b&gt;, an agent (Claude Code, Aider, and friends) writing files through a Qwen 3.5/3.6 model could have its output silently shortened: a file meant to be 710 bytes arrived as &lt;b&gt;11 bytes&lt;/b&gt;, and nothing looked wrong &amp;mdash; no error, valid response. Even short values could corrupt (&lt;code&gt;Tokyo&lt;/code&gt; &amp;rarr; &lt;code&gt;Toyo&lt;/code&gt;). The cause was our constrained decoding fighting the model&amp;rsquo;s own output format; 0.12.15 fixes it. If your agent edited anything important on those versions, it&amp;rsquo;s worth re-checking those files. Gemma-4 and JSON-wire models were never affected (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/issues/1996&quot;&gt;#1996&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1997&quot;&gt;#1997&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Qwen3.8-27B gets faster &amp;mdash; for free.&lt;/b&gt; Add one flag &amp;mdash; &lt;code&gt;--speculative-config '{&quot;method&quot;:&quot;mtp&quot;}'&lt;/code&gt; &amp;mdash; and generation goes &lt;b&gt;38.9 &amp;rarr; 44.1&amp;nbsp;tok/s&lt;/b&gt; on an M3 Ultra, up to &lt;b&gt;23% faster&lt;/b&gt; when the model writes code, JSON or lists. The output is exactly the same: same sha256 with it on and off. Works on the aliases that ship an MTP head (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2004&quot;&gt;#2004&lt;/a&gt;); in the desktop app it&amp;rsquo;s a switch under Settings &amp;rarr; Performance (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1987&quot;&gt;#1987&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Downloads stay fast.&lt;/b&gt; Pulling a model now watches its own transfer speed, file by file; if a download slows to a crawl, that file automatically finishes from Hugging Face instead &amp;mdash; mid-pull, no restart. In our fresh-install test a 9B model was downloaded and chatting in about two minutes at 90&amp;nbsp;MB/s. &lt;code&gt;RAPID_MLX_MIRROR_MIN_MBPS=0&lt;/code&gt; restores the old behaviour if you ever need it (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2015&quot;&gt;#2015&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;DeepSeek Harness works out of the box.&lt;/b&gt; &lt;code&gt;rapid-mlx agents dsh --setup&lt;/code&gt; wires the &lt;code&gt;dsh&lt;/code&gt; coding agent to your local server &amp;mdash; it joins Claude Code, Codex, Hermes and Aider as agents we run against every release before shipping (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1982&quot;&gt;#1982&lt;/a&gt;). And when the served model can&amp;rsquo;t do step-by-step reasoning, &lt;code&gt;dsh&lt;/code&gt; no longer shows an effort selector that does nothing (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1984&quot;&gt;#1984&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Voice transcription stops inventing words.&lt;/b&gt; Pauses and silence used to come back as imagined speech &amp;mdash; Whisper was transcribing its own padding. A silent clip now returns an empty transcript, like it should (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1964&quot;&gt;#1964&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Safer to try models you just found.&lt;/b&gt; A model repository can no longer run code on your machine simply by being loaded; downloaded Python artifacts are integrity-checked (SHA256); the audio loader refuses pickled weights unless you explicitly allow them; &lt;code&gt;rapid-mlx share&lt;/code&gt; warns before a key leaves your machine; and &lt;code&gt;--trusted-hosts&lt;/code&gt; can pin which HTTP Host headers your server answers (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2011&quot;&gt;#2011&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Fixes.&lt;/b&gt; &lt;code&gt;install.sh&lt;/code&gt; requires a native arm64 Python and repairs a half-built venv (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1994&quot;&gt;#1994&lt;/a&gt;); hybrid vision models get the right cache instead of answering from stale state (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1963&quot;&gt;#1963&lt;/a&gt;); media-only models no longer appear as launchable chat models (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1965&quot;&gt;#1965&lt;/a&gt;); &lt;code&gt;rapid-mlx ps&lt;/code&gt; and &lt;code&gt;models&lt;/code&gt; stop colliding columns and &lt;code&gt;connect&lt;/code&gt; no longer announces a server that is not running (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/2006&quot;&gt;#2006&lt;/a&gt;); the unused &lt;code&gt;jlens&lt;/code&gt; subcommand is removed (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1992&quot;&gt;#1992&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Desktop.&lt;/b&gt; Settings gains a Developer section in development builds only &amp;mdash; rehearse first-run without touching real state, with every erasure opt-in and named before it happens (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1993&quot;&gt;#1993&lt;/a&gt;); the status footer sheds readouts instead of squeezing six chips into four&amp;rsquo;s width (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1991&quot;&gt;#1991&lt;/a&gt;); an MTP sidecar whose quantization differs from the base now warns instead of silently degrading (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1989&quot;&gt;#1989&lt;/a&gt;).&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul class=&quot;contrib&quot;&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/xiaoxiunique&quot;&gt;@xiaoxiunique&lt;/a&gt; &amp;mdash; Settings &amp;rarr; Developer with re-onboarding (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1993&quot;&gt;#1993&lt;/a&gt;) and the status-footer fix (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1991&quot;&gt;#1991&lt;/a&gt;)&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/rinaldofesta&quot;&gt;@rinaldofesta&lt;/a&gt; &amp;mdash; warn when an MTP sidecar&amp;rsquo;s quantization differs from the base (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1989&quot;&gt;#1989&lt;/a&gt;)&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/YUHAO-corn&quot;&gt;@YUHAO-corn&lt;/a&gt; &amp;mdash; strip multi-line release-note comments (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1990&quot;&gt;#1990&lt;/a&gt;)&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/moinulmoin&quot;&gt;@moinulmoin&lt;/a&gt; &amp;mdash; reported the x86_64-Python installer trap (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1994&quot;&gt;#1994&lt;/a&gt;)&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.12.14 — 2026-08-15 · Qwen3.8-27B in our own mixed-precision build</title>
    <link href="https://rapidmlx.com/changelog/0.12.14"/>
    <id>https://rapidmlx.com/changelog/0.12.14</id>
    <published>2026-08-15T12:00:00Z</published>
    <updated>2026-08-15T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>A Rapid-MLX mixed-precision quantization of Qwen3.8-27B that spends its bits where they matter, plus user-owned model aliases, the DeepSeek Harness agent, and the desktop app handing all updates to Sparkle. Qwen3.8-27B, mixed-precision. rapid-mlx…</summary>
    <content type="html">&lt;p&gt;A Rapid-MLX mixed-precision quantization of Qwen3.8-27B that spends its bits where they matter, plus user-owned model aliases, the DeepSeek Harness agent, and the desktop app handing all updates to Sparkle.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Qwen3.8-27B, mixed-precision.&lt;/b&gt; &lt;code&gt;rapid-mlx chat qwen3.8-27b-mixed-3.5bpw&lt;/code&gt; serves our own quantization of &lt;a href=&quot;https://huggingface.co/rapid-mlx/Qwen3.8-27B-mixed-3.5bpw-MLX&quot;&gt;rapid-mlx/Qwen3.8-27B-mixed-3.5bpw-MLX&lt;/a&gt; — 13.0&amp;nbsp;GB of weights versus the 4-bit build&amp;rsquo;s 15.0&amp;nbsp;GB, spending bits where they matter instead of flattening every tensor to 4-bit. Measured through &lt;code&gt;rapid-mlx serve&lt;/code&gt; on an M3 Ultra (8K prompt, peak across the process tree): 20&amp;nbsp;GB peak, 323&amp;nbsp;tok/s prefill, 40&amp;nbsp;tok/s decode, zero swap — &lt;b&gt;plan for a 48&amp;nbsp;GB Mac or larger&lt;/b&gt;. Strong at code (10/10) and tool-calling (25/30, including parallel and sequential multi-tool), but 5/10 on the MATH subset with thinking off — which is why it is &lt;b&gt;not&lt;/b&gt; a built-in RAM-tier default; for arithmetic-heavy work &lt;code&gt;qwen3.6-35b-4bit&lt;/code&gt; or &lt;code&gt;gemma-4-26b-4bit&lt;/code&gt; stay the safer picks (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1954&quot;&gt;#1954&lt;/a&gt;). 172 text aliases, 221 total.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Name your own models.&lt;/b&gt; &lt;code&gt;rapid-mlx alias set fast qwen3.5-4b-4bit&lt;/code&gt; gives any built-in model or Hugging Face repo id a name you choose, stored in your own config — no repo edit, no fork. Aliases can&amp;rsquo;t shadow a built-in name or chain to another user alias, and a malformed store fails closed rather than resolving to the wrong weights (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1942&quot;&gt;#1942&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;DeepSeek Harness joins the agents.&lt;/b&gt; &lt;code&gt;rapid-mlx agents dsh --setup&lt;/code&gt; wires DeepSeek Harness to your local server like the Tier-1 agents, and &lt;code&gt;rapid-mlx launch&lt;/code&gt; lists it. The agent test sweep now runs each agent inside a throwaway home, so it can no longer read or rewrite your real agent config (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1952&quot;&gt;#1952&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Vision pixel bounds.&lt;/b&gt; &lt;code&gt;--vision-min-pixels&lt;/code&gt; / &lt;code&gt;--vision-max-pixels&lt;/code&gt; cap what a multimodal model&amp;rsquo;s image preprocessor produces, so a large photo can&amp;rsquo;t balloon the KV cache on a memory-tight Mac. Both default to off (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1943&quot;&gt;#1943&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Desktop: Sparkle owns updates, end to end.&lt;/b&gt; The in-app DMG installer is gone; the app checks, downloads, verifies the signature, and installs through Sparkle. Builds from 0.12.12 onward keep themselves up to date; older builds are told to download once and never hit a broken in-app install path again (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1947&quot;&gt;#1947&lt;/a&gt;). Qwen 3.8 models are recognized as their own family — correct picker name and tool-calling shown as a capability (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1959&quot;&gt;#1959&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Fixes.&lt;/b&gt; &lt;code&gt;/v1/models&lt;/code&gt; reports a hybrid model&amp;rsquo;s live metadata instead of a stale snapshot (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1955&quot;&gt;#1955&lt;/a&gt;); a client disconnecting mid-stream no longer logs a false &amp;ldquo;missing finish&amp;rdquo; warning (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1951&quot;&gt;#1951&lt;/a&gt;); rejected CORS preflights return the correct content length (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1949&quot;&gt;#1949&lt;/a&gt;).&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul class=&quot;contrib&quot;&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/guo&quot;&gt;@guo&lt;/a&gt; — desktop app drops the in-app DMG installer, letting Sparkle own updates end to end (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1947&quot;&gt;#1947&lt;/a&gt;)&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.12.13 — 2026-08-14 · Qwen3.8-27B, text and vision</title>
    <link href="https://rapidmlx.com/changelog/0.12.13"/>
    <id>https://rapidmlx.com/changelog/0.12.13</id>
    <published>2026-08-14T12:00:00Z</published>
    <updated>2026-08-14T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Qwen’s newest 27B lands day-0 — a hybrid GatedDeltaNet model serving as a strong general-purpose and tool-using text model with full batched throughput, plus a vision-language mode — alongside a batch of desktop app fixes, including chat…</summary>
    <content type="html">&lt;p&gt;Qwen&amp;rsquo;s newest 27B lands day-0 — a hybrid GatedDeltaNet model serving as a strong general-purpose and tool-using text model with full batched throughput, plus a vision-language mode — alongside a batch of desktop app fixes, including chat attachments.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Qwen3.8-27B is one command away.&lt;/b&gt; &lt;code&gt;rapid-mlx chat qwen3.8-27b-4bit&lt;/code&gt; serves the hybrid (GatedDeltaNet) checkpoint on the default lane; start with &lt;code&gt;--mllm&lt;/code&gt; to answer questions about images through the serialized single-stream vision lane — verified describing a real photo end-to-end. The stale routing notice claiming &lt;code&gt;--mllm&lt;/code&gt; &amp;ldquo;will error&amp;rdquo; for hybrid backbones was corrected (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1939&quot;&gt;#1939&lt;/a&gt;). Catalog: 171 text aliases, 220 total.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Model list.&lt;/b&gt; An empty cache no longer shows a phantom &amp;ldquo;No&amp;rdquo; entry parsed out of the CLI&amp;rsquo;s &amp;ldquo;no models cached yet&amp;rdquo; notice (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1920&quot;&gt;#1920&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Onboarding.&lt;/b&gt; Completing macOS onboarding now requires explicit confirmation, and model inspection is deferred until consent (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1917&quot;&gt;#1917&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1926&quot;&gt;#1926&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Desktop.&lt;/b&gt; Chat accepts PDF, CSV and TXT attachments (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1932&quot;&gt;#1932&lt;/a&gt;); the Launch page&amp;rsquo;s Codex/Hermes rows actually launch (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1933&quot;&gt;#1933&lt;/a&gt;); resident image downloads show activity instead of a dead button (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1922&quot;&gt;#1922&lt;/a&gt;); audio models are downloaded and verified before serving (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1928&quot;&gt;#1928&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1923&quot;&gt;#1923&lt;/a&gt;); long answers no longer degrade from O(n&amp;sup2;) link cursor rects (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1930&quot;&gt;#1930&lt;/a&gt;); hover no longer masks button labels (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1934&quot;&gt;#1934&lt;/a&gt;); the composer placeholder stays clear of IME text (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1935&quot;&gt;#1935&lt;/a&gt;); zero-token stopped turns are dropped from wire history (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1914&quot;&gt;#1914&lt;/a&gt;).&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul class=&quot;contrib&quot;&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/loriz-art&quot;&gt;@loriz-art&lt;/a&gt; — onboarding requires explicit confirmation; model selection kept inside Step 2 (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1917&quot;&gt;#1917&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1931&quot;&gt;#1931&lt;/a&gt;)&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/osdodo&quot;&gt;@osdodo&lt;/a&gt; — chat attachments (PDF/CSV/TXT) and audio-model verification before serving (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1932&quot;&gt;#1932&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1928&quot;&gt;#1928&lt;/a&gt;)&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/xiaoxiunique&quot;&gt;@xiaoxiunique&lt;/a&gt; — Launch rows fixed, hover-label fix, O(n&amp;sup2;) cursor-rect fix (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1933&quot;&gt;#1933&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1934&quot;&gt;#1934&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1930&quot;&gt;#1930&lt;/a&gt;)&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/Jevin-F&quot;&gt;@Jevin-F&lt;/a&gt; — composer placeholder clear of IME text (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1935&quot;&gt;#1935&lt;/a&gt;)&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.12.12 — 2026-08-13 · Vision gets its first token faster</title>
    <link href="https://rapidmlx.com/changelog/0.12.12"/>
    <id>https://rapidmlx.com/changelog/0.12.12</id>
    <published>2026-08-13T12:00:00Z</published>
    <updated>2026-08-13T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>A vision-lane performance release plus resilience: streaming vision requests stop rebuilding the tokenizer vocab on every call, model loads can no longer hang on a cold network, and the desktop app gains signed background updates. Vision first-token…</summary>
    <content type="html">&lt;p&gt;A vision-lane performance release plus resilience: streaming vision requests stop rebuilding the tokenizer vocab on every call, model loads can no longer hang on a cold network, and the desktop app gains signed background updates.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Vision first-token latency drops sharply.&lt;/b&gt; The output-router detection that runs on every streaming request was rebuilding the full tokenizer vocab (~262k entries on Gemma) on &lt;em&gt;each&lt;/em&gt; call; it is now detected once and memoized, and the MLLM scheduler wakes on an event instead of a 10&amp;nbsp;ms idle poll. gemma-3 image requests that previously returned an empty completion (or crashed) now answer correctly (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1909&quot;&gt;#1909&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Model loads no longer hang on a cold network.&lt;/b&gt; Warm starts could stall on unbounded Hugging Face metadata calls; the loader now hands a local snapshot path to the model, so an offline or poisoned-DNS start can&amp;rsquo;t wedge the server (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1908&quot;&gt;#1908&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1888&quot;&gt;#1888&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Streaming errors tell the truth.&lt;/b&gt; MLLM streaming preflight errors return HTTP&amp;nbsp;400 instead of a silent 200 with empty content (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1897&quot;&gt;#1897&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Scheduler &amp;amp; caches.&lt;/b&gt; Batch-adaptive recurrent-barrier interval for single-stream decode (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1895&quot;&gt;#1895&lt;/a&gt;); hybrid sliding/full KV caches keep their per-layer cache class when trimmed (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1863&quot;&gt;#1863&lt;/a&gt;); image/video models are single-slot residents so they stop accumulating in memory (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1889&quot;&gt;#1889&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Catalog.&lt;/b&gt; Ling-3.0-tiny gains block-FP8 checkpoint support (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1910&quot;&gt;#1910&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Desktop.&lt;/b&gt; Signed background updates via Sparkle (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1907&quot;&gt;#1907&lt;/a&gt;); streaming aligned with native chat (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1906&quot;&gt;#1906&lt;/a&gt;); conversation search in the sidebar (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1879&quot;&gt;#1879&lt;/a&gt;); global and per-conversation custom instructions (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1883&quot;&gt;#1883&lt;/a&gt;); Launch integrations derived from the engine registry (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1894&quot;&gt;#1894&lt;/a&gt;).&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul class=&quot;contrib&quot;&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/guo&quot;&gt;@guo&lt;/a&gt; — release-pipeline hardening: PF-2 secrets gate, and the GitHub Release created last, after the updater pointer (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1859&quot;&gt;#1859&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1891&quot;&gt;#1891&lt;/a&gt;)&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/osdodo&quot;&gt;@osdodo&lt;/a&gt; — desktop conversation search, custom instructions, and Sparkle signed background updates (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1879&quot;&gt;#1879&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1883&quot;&gt;#1883&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1907&quot;&gt;#1907&lt;/a&gt;)&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/xiaoxiunique&quot;&gt;@xiaoxiunique&lt;/a&gt; — desktop streaming aligned with native chat (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1906&quot;&gt;#1906&lt;/a&gt;)&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/loriz-art&quot;&gt;@loriz-art&lt;/a&gt; — core workspace unified with the Direction D visual system (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1905&quot;&gt;#1905&lt;/a&gt;)&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/Jevin-F&quot;&gt;@Jevin-F&lt;/a&gt; — model loads no longer hang on unbounded Hugging Face metadata calls (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1908&quot;&gt;#1908&lt;/a&gt;)&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/aftersnow&quot;&gt;@aftersnow&lt;/a&gt; — Ling-3.0-tiny block-FP8 support (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1910&quot;&gt;#1910&lt;/a&gt;)&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.12.11 — 2026-08-12 · Faster under load, faster alone</title>
    <link href="https://rapidmlx.com/changelog/0.12.11"/>
    <id>https://rapidmlx.com/changelog/0.12.11</id>
    <published>2026-08-12T12:00:00Z</published>
    <updated>2026-08-12T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>A bench-driven performance release: concurrent throughput climbs 8–41% depending on the model, a lone request gets its own KV-cache fast path, and forced tool calls always arrive as valid JSON objects. Concurrent requests prefill as one wave. The…</summary>
    <content type="html">&lt;p&gt;A bench-driven performance release: concurrent throughput climbs 8&amp;ndash;41% depending on the model, a lone request gets its own KV-cache fast path, and forced tool calls always arrive as valid JSON objects.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Concurrent requests prefill as one wave.&lt;/b&gt; The hybrid admission throttle is retired — requests that arrive together are admitted together instead of being staggered 200&amp;nbsp;ms apart, which kept batched attention off its fast path for the batch&amp;rsquo;s whole lifetime (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1866&quot;&gt;#1866&lt;/a&gt;). Measured on an M3 Ultra: Qwen3.6-35B-A3B-8bit at 8 concurrent streams goes &lt;b&gt;190 &amp;rarr; 268 aggregate tok/s (+41%)&lt;/b&gt;; Qwen3.5-4B +20%, 9B +13%, gpt-oss-20b +12%, 27B +8%.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Deep batches coalesce scheduler steps.&lt;/b&gt; With four or more running requests the engine runs up to 4 scheduler steps per dispatch, cutting per-step executor round-trips (~10&amp;nbsp;ms/step at high aggregate rates). Finishes, pending admissions, and the memory-pressure check cadence are preserved (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1878&quot;&gt;#1878&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;A lone request keeps a singleton KV cache.&lt;/b&gt; Single-stream decode skips batched-form bookkeeping — plain causal mask straight onto the native SDPA fast path, and the dense-sampler fast path now engages at batch&amp;nbsp;size&amp;nbsp;1, promoting to batched caches only when a second request joins (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1874&quot;&gt;#1874&lt;/a&gt;). Qwen3.5-4B single-stream: 174.8 tok/s at short context, 147.5 at 16k.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Forced tool calls always carry object arguments.&lt;/b&gt; Under &lt;code&gt;tool_choice&lt;/code&gt;, a weak continuation could produce a bare scalar (&lt;code&gt;&quot;arguments&quot;: &quot;1&quot;&lt;/code&gt;) — shipped as-is on the non-stream path and silently dropped as an empty turn when streaming. Both paths now repair to the OpenAI wire contract, with schema-required violations still surfacing explicitly, and tool logits processors are no longer built for plain-chat requests (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1880&quot;&gt;#1880&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1878&quot;&gt;#1878&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Reliability.&lt;/b&gt; Prefix-cache entries can no longer be corrupted by the new singleton lane (loaned state is copied on admission); coalesced-step errors deliver already-produced tokens before surfacing; admission-wave timing survives malformed tuning env vars (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1874&quot;&gt;#1874&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1866&quot;&gt;#1866&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1878&quot;&gt;#1878&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Catalog.&lt;/b&gt; New alias &lt;code&gt;nemotron-3.5-lightning-30b-4bit&lt;/code&gt; joins the Nemotron line (170 text aliases, 219 total).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.12.10 — 2026-08-11 · A 131K-context reasoner on an 8&amp;nbsp;GB Mac</title>
    <link href="https://rapidmlx.com/changelog/0.12.10"/>
    <id>https://rapidmlx.com/changelog/0.12.10</id>
    <published>2026-08-11T12:00:00Z</published>
    <updated>2026-08-11T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>inclusionAI’s Ling-3.0-tiny gets the first MLX conversion anywhere and ships served natively — a 7.9B mixture-of-experts reasoner with 1.3B active parameters that fits an 8 GB Mac. Underneath: MoE experts can stream from disk, the scheduler fails…</summary>
    <content type="html">&lt;p&gt;inclusionAI&amp;rsquo;s Ling-3.0-tiny gets the first MLX conversion anywhere and ships served natively — a 7.9B mixture-of-experts reasoner with 1.3B active parameters that fits an 8&amp;nbsp;GB Mac. Underneath: MoE experts can stream from disk, the scheduler fails loudly instead of hanging clients, and auth fails closed.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Ling-3.0-tiny is served natively.&lt;/b&gt; &lt;code&gt;rapid-mlx serve ling-3.0-tiny-4bit&lt;/code&gt; runs inclusionAI&amp;rsquo;s 7.9B-total / 1.3B-active sparse-MoE reasoner (128 experts, top-8 plus one shared, KDA&amp;nbsp;+&amp;nbsp;MLA hybrid attention, 131K context, MIT) through a vendored &lt;code&gt;bailing_hybrid&lt;/code&gt; backbone verified against the official modeling code on identical weights (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1817&quot;&gt;#1817&lt;/a&gt;). Thinking streams as &lt;code&gt;reasoning_content&lt;/code&gt; — toggled by &lt;code&gt;enable_thinking&lt;/code&gt; or the model&amp;rsquo;s &lt;em&gt;detailed thinking on/off&lt;/em&gt; switch — and tool calls parse natively in both stream modes. The 4-bit conversion (4.2&amp;nbsp;GB) is the first MLX conversion of this architecture anywhere, published under the rapid-mlx org on Hugging Face and mirrored on the model CDN (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1819&quot;&gt;#1819&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1826&quot;&gt;#1826&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;MoE experts can stream from disk.&lt;/b&gt; &lt;code&gt;--disk-stream&lt;/code&gt; streams routed-expert weights from disk instead of holding every expert resident (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1803&quot;&gt;#1803&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Scheduler errors fail loudly.&lt;/b&gt; An engine error mid-batch now fails the in-flight requests instead of leaving their clients hanging (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1810&quot;&gt;#1810&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Auth fails closed.&lt;/b&gt; An empty companion key or a duplicated &lt;code&gt;x-api-key&lt;/code&gt; header is rejected instead of slipping through (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1811&quot;&gt;#1811&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;The desktop app gets a unified Settings surface.&lt;/b&gt; Settings UI and menu-bar branding are reworked into one coherent surface (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1828&quot;&gt;#1828&lt;/a&gt;), and the CLI&amp;rsquo;s RAM-tier model recommendations are now shared with the Mac app so both surfaces suggest the same models for your machine (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1832&quot;&gt;#1832&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Desktop paper cuts.&lt;/b&gt; Downloads report honestly and web tools are hardened (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1813&quot;&gt;#1813&lt;/a&gt;); cached-model defaults are chosen quality-aware (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1805&quot;&gt;#1805&lt;/a&gt;); onboarding is clearer and first-launch catalog probes are gated (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1804&quot;&gt;#1804&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1816&quot;&gt;#1816&lt;/a&gt;); third-party license texts ship inside the .app bundle (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1812&quot;&gt;#1812&lt;/a&gt;); Markdown tables read correctly under VoiceOver (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1822&quot;&gt;#1822&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1824&quot;&gt;#1824&lt;/a&gt;); and native XCUITest pixel coverage joins the desktop test stack (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1820&quot;&gt;#1820&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Release infrastructure.&lt;/b&gt; Installer checksums are version-stamped so cosign signing is idempotent (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1821&quot;&gt;#1821&lt;/a&gt;), the mlx-compat import-order contract is restored in &lt;code&gt;bailing_hybrid&lt;/code&gt; with its guard test green (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1823&quot;&gt;#1823&lt;/a&gt;), and two order-dependent full-suite flakes are gone (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1830&quot;&gt;#1830&lt;/a&gt;).&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul class=&quot;contrib&quot;&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/loriz-art&quot;&gt;@loriz-art&lt;/a&gt; — unified macOS Settings UI and menu-bar branding (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1828&quot;&gt;#1828&lt;/a&gt;)&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/MIt9&quot;&gt;@MIt9&lt;/a&gt; — &lt;code&gt;--disk-stream&lt;/code&gt; for MoE routed-expert weights (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1803&quot;&gt;#1803&lt;/a&gt;)&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.12.9 — 2026-08-10 · Muse Glimmer, natively</title>
    <link href="https://rapidmlx.com/changelog/0.12.9"/>
    <id>https://rapidmlx.com/changelog/0.12.9</id>
    <published>2026-08-10T12:00:00Z</published>
    <updated>2026-08-10T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Meta released Muse Glimmer 30B and rapid-mlx serves it the same week — through its own vendored implementation of the architecture, with no external runtime dependency. The desktop app learns to hear and speak, and MCP tools arrive in desktop chat.…</summary>
    <content type="html">&lt;p&gt;Meta released Muse Glimmer 30B and rapid-mlx serves it the same week — through its own vendored implementation of the architecture, with no external runtime dependency. The desktop app learns to hear and speak, and MCP tools arrive in desktop chat.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Muse Glimmer 30B is served natively.&lt;/b&gt; &lt;code&gt;rapid-mlx serve muse-glimmer-30b-4bit&lt;/code&gt; runs Meta&amp;rsquo;s 29.6B dense reasoner on the standard text lane — sliding-window attention, 131K context — through a vendored backbone verified against the reference implementation to a 1.4e-5 max deviation on identical weights (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1802&quot;&gt;#1802&lt;/a&gt;). The model thinks on a private channel and answers on another; rapid-mlx demultiplexes that wire into &lt;code&gt;reasoning_content&lt;/code&gt; and &lt;code&gt;content&lt;/code&gt;, and parses its ATEM tool-call envelope natively — streaming and non-streaming, including multi-turn tool results (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1791&quot;&gt;#1791&lt;/a&gt;). Muse joins the release gate as the sixth agent-verified family (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1808&quot;&gt;#1808&lt;/a&gt;), and the 4-bit weights (19.4&amp;nbsp;GB) are mirrored on the model CDN. The checkpoint&amp;rsquo;s vision tower ships in the weights but image input stays off until the multimodal path lands upstream.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;The desktop app can hear and speak.&lt;/b&gt; A new Audio tab turns recordings into text and text into speech, in a voice you pick — all on your Mac (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1786&quot;&gt;#1786&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;MCP tools reach desktop chat.&lt;/b&gt; The engine&amp;rsquo;s MCP support is wired through to the desktop app, so chat can call your configured MCP servers (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1787&quot;&gt;#1787&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Chat and Images keep more than one model warm.&lt;/b&gt; Budgeted multi-model residency lets the desktop hold a chat model and an image model at once instead of evicting on every tab switch (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1788&quot;&gt;#1788&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Models you already downloaded elsewhere are found.&lt;/b&gt; Weights another MLX runtime pulled are discovered and reused instead of downloaded again (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1785&quot;&gt;#1785&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Hybrid vision models stop crashing the batching engine.&lt;/b&gt; They are served through a serialized lane instead (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1798&quot;&gt;#1798&lt;/a&gt;), and MLLM serves now expose their status metrics (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1781&quot;&gt;#1781&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Desktop paper cuts.&lt;/b&gt; An isolated first run uses cached models instead of re-downloading (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1801&quot;&gt;#1801&lt;/a&gt;); overlapping memory confirmations no longer stack (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1800&quot;&gt;#1800&lt;/a&gt;); math renders correctly in the shipped app (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1797&quot;&gt;#1797&lt;/a&gt;); closing the main window behaves (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1795&quot;&gt;#1795&lt;/a&gt;); the updater and image cache state were repaired (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1794&quot;&gt;#1794&lt;/a&gt;); and a grounded answer that denies real-time access re-synthesizes once instead of shipping the refusal (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1784&quot;&gt;#1784&lt;/a&gt;).&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul class=&quot;contrib&quot;&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/ryo1sato&quot;&gt;@ryo1sato&lt;/a&gt; — MLLM status metrics (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1781&quot;&gt;#1781&lt;/a&gt;)&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/xiaoxiunique&quot;&gt;@xiaoxiunique&lt;/a&gt; — discover models other MLX runtimes downloaded (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1785&quot;&gt;#1785&lt;/a&gt;)&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/osdodo&quot;&gt;@osdodo&lt;/a&gt; — desktop Audio tab (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1786&quot;&gt;#1786&lt;/a&gt;) and multi-model residency (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1788&quot;&gt;#1788&lt;/a&gt;)&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/Jevin-F&quot;&gt;@Jevin-F&lt;/a&gt; — MCP in the desktop app (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1787&quot;&gt;#1787&lt;/a&gt;)&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.12.8 — 2026-08-10 · The desktop app makes pictures</title>
    <link href="https://rapidmlx.com/changelog/0.12.8"/>
    <id>https://rapidmlx.com/changelog/0.12.8</id>
    <published>2026-08-10T12:00:00Z</published>
    <updated>2026-08-10T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>A new Images tab renders locally, Chat reads the images you attach, and a wide band of engine correctness fixes lands underneath — including the packaging bug that would have shipped the Images tab unable to render anything in a downloaded copy. The…</summary>
    <content type="html">&lt;p&gt;A new Images tab renders locally, Chat reads the images you attach, and a wide band of engine correctness fixes lands underneath — including the packaging bug that would have shipped the Images tab unable to render anything in a downloaded copy.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;The desktop app generates images.&lt;/b&gt; The Images tab renders through the same one-model-per-process server the chat uses: pick an image model (&lt;code&gt;z-image-turbo&lt;/code&gt; or &lt;code&gt;flux2-klein-4b&lt;/code&gt;), load it through the usual readiness gate, prompt, and refine. Renders land in a filmstrip you can step back through, and selecting an older one restores the prompt that produced it (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1705&quot;&gt;#1705&lt;/a&gt;). Two launch-blockers were caught before shipping: the bundled sidecar was missing &lt;code&gt;mflux&lt;/code&gt;, so a downloaded copy could never actually generate (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1768&quot;&gt;#1768&lt;/a&gt;), and the disk-space gate mis-counted already-cached component-layout weights as an impending download and refused to start (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1773&quot;&gt;#1773&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Chat reads the images you attach.&lt;/b&gt; With a vision model loaded, attach an image to a message and ask about it; models that cannot read images show the attach button disabled with an explanation instead of failing later (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1723&quot;&gt;#1723&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;The Qwen tool-call parser handles awkward arguments correctly.&lt;/b&gt; A series of fixes to &lt;code&gt;qwen3_coder_xml&lt;/code&gt; addresses legacy raw string arguments whose own content contains XML-like closing tags — where the parser cannot tell an argument&amp;rsquo;s text from the wrapper around it. Some variants produced wrong arguments, others leaked wrapper framing into the answer or dropped the text after a call (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1730&quot;&gt;#1730&lt;/a&gt;). &lt;code&gt;AutoToolParser&lt;/code&gt;&amp;rsquo;s balanced-JSON scan was fixed alongside (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1726&quot;&gt;#1726&lt;/a&gt;), and a replayed terminal chunk under &lt;code&gt;tool_choice: auto&lt;/code&gt; no longer duplicates content into the answer (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1711&quot;&gt;#1711&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;&lt;code&gt;tool_choice=&amp;quot;none&amp;quot;&lt;/code&gt; is honored everywhere.&lt;/b&gt; A tool-trained model could emit a call — with a name and arguments that were never even declared — on the exact turn a client had turned tools off; the call is now dropped and the prose kept, across every parser and both stream modes (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1761&quot;&gt;#1761&lt;/a&gt;). Literal &lt;code&gt;&amp;lt;tool_call&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;think&amp;gt;&lt;/code&gt; tags in ordinary prose survive instead of being eaten (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1766&quot;&gt;#1766&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1779&quot;&gt;#1779&lt;/a&gt;), mid-conversation &lt;code&gt;system&lt;/code&gt; messages reach Harmony / gpt-oss models instead of being silently dropped (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1769&quot;&gt;#1769&lt;/a&gt;), and a truncated chain-of-thought is marked as incomplete rather than shipped as the answer (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1770&quot;&gt;#1770&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;The first follow-up message no longer re-reads the opening context.&lt;/b&gt; The opening turn never saved a reusable cache boundary, so the second message paid to re-prefill everything; reuse already worked from the third message on. Measured on &lt;code&gt;qwen3.6-27b-4bit&lt;/code&gt; with a ~9.9K-token document: the follow-up prefills &lt;b&gt;34&lt;/b&gt; tokens instead of 9,941 — 1.45&amp;nbsp;s instead of 32.4&amp;nbsp;s (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1732&quot;&gt;#1732&lt;/a&gt;). LFM2.5-2.6B gains bounded prefix reuse too: its alias said &lt;code&gt;is_hybrid: false&lt;/code&gt; while the runtime found hybrid layers, so every turn re-prefilled the whole context (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1764&quot;&gt;#1764&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;The server survives sustained load and rude clients.&lt;/b&gt; The scheduler reclaims paged full-KV and free-block memory instead of wedging on a &lt;code&gt;D-METAL-CAP&lt;/code&gt; 503 (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1646&quot;&gt;#1646&lt;/a&gt;), a streaming client disconnecting mid-generation no longer leaks a running slot until the server wedges (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1782&quot;&gt;#1782&lt;/a&gt;), and &lt;code&gt;GET /health&lt;/code&gt; returns 200 for image-gen and video-gen serves instead of 500 for the life of the serve (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1783&quot;&gt;#1783&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Reasoning-plus-tools turns get a real token budget.&lt;/b&gt; The desktop&amp;rsquo;s floor for those turns was set to exactly the default budget, so the &lt;code&gt;max()&lt;/code&gt; meant to lift it never lifted anyone; it is now 16,384 while Max Tokens sits at its default. A short budget does not fail loudly — it returns a cut-off answer that reads as a model that &amp;ldquo;could not do it&amp;rdquo; (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1722&quot;&gt;#1722&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Desktop paper cuts.&lt;/b&gt; &amp;ldquo;Browse all models&amp;rdquo; opens the catalogue instead of closing the wizard (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1662&quot;&gt;#1662&lt;/a&gt;); a stale last-served alias is validated before restore, so a removed model no longer fails the launch (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1729&quot;&gt;#1729&lt;/a&gt;); returning to Chat after loading an Images model switches the server back instead of leaving the load button inert (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1739&quot;&gt;#1739&lt;/a&gt;); the chat tab reports one throughput number instead of three, because prefill is no longer charged to tokens/second (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1728&quot;&gt;#1728&lt;/a&gt;); web-page approvals gain &amp;ldquo;Always allow&amp;rdquo; with private and local addresses still blocked (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1695&quot;&gt;#1695&lt;/a&gt;); and Claude Code gets an agent profile (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1720&quot;&gt;#1720&lt;/a&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;The release process itself got trustworthy.&lt;/b&gt; App and engine are cut in one event instead of two that could drift (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1649&quot;&gt;#1649&lt;/a&gt;); a release gate that had not run for eleven releases was found dead and repaired (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1671&quot;&gt;#1671&lt;/a&gt;); the Codex review step fails closed on backend, auth, timeout or execution failure instead of passing silently (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1700&quot;&gt;#1700&lt;/a&gt;); and four AX-only GUI golden flows run on every desktop PR — driving the app through the accessibility API with no screen recording, so they work unattended in CI (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1721&quot;&gt;#1721&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1731&quot;&gt;#1731&lt;/a&gt;, &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1708&quot;&gt;#1708&lt;/a&gt;).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.12.7 — 2026-08-07 · One version number</title>
    <link href="https://rapidmlx.com/changelog/0.12.7"/>
    <id>https://rapidmlx.com/changelog/0.12.7</id>
    <published>2026-08-07T12:00:00Z</published>
    <updated>2026-08-07T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>From this release the engine and the Rapid-MLX Desktop app carry one version number, enforced in CI. 0.12.6 is skipped deliberately — the desktop app 0.12.6 that users already have was built before the work below landed, so reusing that number would…</summary>
    <content type="html">&lt;p&gt;From this release the engine and the Rapid-MLX Desktop app carry &lt;b&gt;one&lt;/b&gt; version number, enforced in CI. &lt;b&gt;0.12.6 is skipped deliberately&lt;/b&gt; — the desktop app 0.12.6 that users already have was built before the work below landed, so reusing that number would have made it mean two different things.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;The two version numbers can no longer drift.&lt;/b&gt; They were maintained by hand in different files — &lt;code&gt;pyproject.toml&lt;/code&gt; for the engine, the app&amp;rsquo;s &lt;code&gt;Info.plist&lt;/code&gt; for the desktop build — with nothing comparing them, so drift was the default rather than a risk. On 2026-08-07 it reached users: the engine was 0.12.5 while the app was 0.12.6, and &lt;em&gt;both&lt;/em&gt; were correctly called &amp;ldquo;the latest release&amp;rdquo;. A check now fails any change where the two disagree, closing the chain end to end: git tag = &lt;code&gt;Info.plist&lt;/code&gt; = &lt;code&gt;pyproject.toml&lt;/code&gt;.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;The privacy consent switch works.&lt;/b&gt; In Settings&amp;nbsp;&amp;rarr;&amp;nbsp;Privacy, pressing &lt;em&gt;Send anonymous usage data&lt;/em&gt; wrote the preference but left the switch showing its old value — a privacy control that appeared to refuse your choice. Measured by driving accessibility against real builds: &lt;b&gt;0&amp;nbsp;&amp;rarr;&amp;nbsp;0 before, 0&amp;nbsp;&amp;rarr;&amp;nbsp;1 after&lt;/b&gt;.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Model recommendations are grounded in measurement.&lt;/b&gt; Every RAM tier now offers exactly two picks — faster and smarter — with measured ~8K peak memory and throughput from an M2&amp;nbsp;Pro 32&amp;nbsp;GB Mac mini. Two exceptions are stated rather than hidden: the &lt;em&gt;smarter&lt;/em&gt; primaries at 64&amp;nbsp;GB and 96&amp;nbsp;GB+ exceed the benchmark host and are carried forward unmeasured; their faster alternatives are measured.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;&amp;ldquo;Untested&amp;rdquo; no longer looks like a score of zero.&lt;/b&gt; A model with no compatible benchmark rendered an empty dashed track, so a missing measurement and a poor result were indistinguishable. The sweep is reproducible now too — persisted prefix-cache entries were inflating 8K prefill from ~313 to ~20,701&amp;nbsp;tok/s between reruns.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;&lt;code&gt;agents --setup&lt;/code&gt; can no longer eat the operator&amp;rsquo;s config.&lt;/b&gt; The release gate runs it on machines that are also someone&amp;rsquo;s daily driver. It used to back up and restore the real file, which failed on SIGKILL and — worse — faithfully restored a file that had already been damaged, leaving a developer&amp;rsquo;s codex pointed at a local server for weeks. It now honours &lt;code&gt;CODEX_HOME&lt;/code&gt; / &lt;code&gt;HERMES_HOME&lt;/code&gt;, and the gate refuses to run against the real config directory.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;A GUI golden-flow suite that finds controls by accessibility identifier&lt;/b&gt;, not screen position — six journeys plus three invariants, with committed structural snapshots, so a control that vanishes, is renamed, moves in the hierarchy, or silently disables becomes a reviewable diff. The snapshots discard coordinates by design, so they say nothing about visual layout.&lt;/li&gt;
      &lt;li&gt;Model tabs consolidated into a single &lt;b&gt;Model Management&lt;/b&gt; surface; syntax highlighting and markdown tables in chat; the tray&amp;rsquo;s &lt;em&gt;Check for updates…&lt;/em&gt; reports a result instead of nothing; a machine that fails the live memory guard is offered an honestly-labelled smaller model rather than a chooser whose smallest option is the one that just failed.&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Desktop app 0.12.6 — 2026-08-07 · Rapid can look things up</title>
    <link href="https://rapidmlx.com/changelog/desktop-0.12.6"/>
    <id>https://rapidmlx.com/changelog/desktop-0.12.6</id>
    <published>2026-08-07T12:00:00Z</published>
    <updated>2026-08-07T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Bundles the 0.12.5 engine. The headline is a set of built-in tools the model can reach mid-answer — with you deciding what it is allowed to touch. Weather, web search, and reading a page. Ask about something recent and the model can go and find out.…</summary>
    <content type="html">&lt;p&gt;Bundles the 0.12.5 engine. The headline is a set of built-in tools the model can reach mid-answer — with you deciding what it is allowed to touch.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Weather, web search, and reading a page.&lt;/b&gt; Ask about something recent and the model can go and find out. Each lookup shows a card you can open to see exactly what it asked for and what came back. Fetching a page asks permission first and names the site — and &lt;em&gt;&amp;ldquo;Don&amp;rsquo;t allow&amp;rdquo;&lt;/em&gt; is a normal answer, not an error. Search works out of the box; the backend is switchable in Settings&amp;nbsp;&amp;rarr;&amp;nbsp;Tools, and private or local addresses are refused.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Conversations can be pinned, renamed and archived.&lt;/b&gt; Right-click a chat in the sidebar or use the &lt;code&gt;···&lt;/code&gt; button on hover. Pinned chats get their own group at the top; archived ones collapse into a group you can reopen. Renaming a chat stops Rapid from re-titling it afterwards.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Deleting a conversation asks first&lt;/b&gt;, names the chat, and says plainly that it cannot be undone.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Every message has its own actions&lt;/b&gt; — copy any message, edit a question you already sent, regenerate an answer you did not like.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Models that can never chat are no longer offered.&lt;/b&gt; The picker was listing entries a conversation could never use.&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.12.5 — 2026-08-07 · Tool calling tells the truth</title>
    <link href="https://rapidmlx.com/changelog/0.12.5"/>
    <id>https://rapidmlx.com/changelog/0.12.5</id>
    <published>2026-08-07T12:00:00Z</published>
    <updated>2026-08-07T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Ten defects across the parsers, the streaming path and the prompt builder, all the same shape: what the model meant to call was not what got called, or not what you saw. Every streamed string argument could come back wrapped in quotes. On the…</summary>
    <content type="html">&lt;p&gt;Ten defects across the parsers, the streaming path and the prompt builder, all the same shape: what the model meant to call was not what got called, or not what you saw.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Every streamed string argument could come back wrapped in quotes.&lt;/b&gt; On the streaming path only, formatting whitespace arriving before a JSON value&amp;rsquo;s opening quote made the Qwen3-Coder XML parser read the wrapper quotes as argument bytes. &lt;code&gt;browse&lt;/code&gt; got &lt;code&gt;&amp;quot;https://example.com&amp;quot;&lt;/code&gt; — quotes included — and rejected it as not a URL; a file read got &lt;code&gt;&amp;quot;/path/to/file&amp;quot;&lt;/code&gt; and was told it does not exist. Non-streaming was unaffected, which is exactly what made it read as a weak model rather than a parser bug: same model, same prompt, only &lt;code&gt;stream&lt;/code&gt; differing — &lt;b&gt;4/4 correct without it, 5/5 corrupt with it&lt;/b&gt;. Found from the other end, as five stable failures in the Hermes agent suite (PR #1600).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;&lt;code&gt;agents codex --setup&lt;/code&gt; no longer deletes your Codex config.&lt;/b&gt; It rewrote &lt;code&gt;~/.codex/config.toml&lt;/code&gt; from a template instead of merging, so anyone who had customised Codex lost it the first time they pointed it at Rapid-MLX. It now deep-merges, backs the original up first, and copies metadata through the destination descriptor rather than by pathname — so the backup cannot be diverted by a symlink swapped in mid-write (PR #1539).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Tool-call arguments survive the round trip.&lt;/b&gt; Seven defects, one shape — a value the model emitted did not reach the tool: values mangled converting between wire formats (#1518), XML delimiters stripped out of string arguments (#1552), undeclared parameters accepted ambiguously (#1551), Qwen truncating its own arguments at the length cutoff (#1574), streamed arguments unvalidated on some parsers (#1559), Nemotron dropping the declared-tool gate while streaming (#1540), and forced-stream tool wire leaking into the response (#1546).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;LFM models no longer print their tool calls at you.&lt;/b&gt; On the streaming path LFM2.5 emitted raw markup into the visible answer while the call itself parsed fine, so it looked like a display glitch. It was not: for parsers without native tool-format support the engine serialises prior calls into the prompt as &lt;code&gt;[Calling tool: name({args})]&lt;/code&gt;, the model imitates its own transcript, and the parser only knew the pythonic dialect. &lt;b&gt;10/10 before, 0/10 after&lt;/b&gt; (PR #1592).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Concurrent chat and tool calls no longer kill the engine loop.&lt;/b&gt; With both in flight, &lt;code&gt;PromptProcessingBatch.extend&lt;/code&gt; wrote &lt;code&gt;None&lt;/code&gt; into mlx-lm&amp;rsquo;s per-slot logits-processor list and took the scheduler down — reproducibly, in 3 of 5 runs (PR #1526).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;&lt;code&gt;rapid-mlx ls&lt;/code&gt; was reporting cached sizes at roughly double reality.&lt;/b&gt; It walked the Hugging Face cache following symlinks, counting each blob once under &lt;code&gt;blobs/&lt;/code&gt; and again through every &lt;code&gt;snapshots/&lt;/code&gt; link. Every &amp;ldquo;reclaim space&amp;rdquo; figure inherited the error, including the ones the Mac app renders — Ternary&amp;nbsp;Bonsai&amp;nbsp;27B read 15.87&amp;nbsp;GiB against a true 7.9&amp;nbsp;GiB (PR #1584).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Ministral&amp;nbsp;3 is withdrawn.&lt;/b&gt; It could return no reply at all on some Macs; the alias is gone rather than left in the picker. Model count is now 215.&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Desktop app 0.12.5 — 2026-08-05 · An ordinary maths question could take the app down</title>
    <link href="https://rapidmlx.com/changelog/desktop-0.12.5"/>
    <id>https://rapidmlx.com/changelog/desktop-0.12.5</id>
    <published>2026-08-05T12:00:00Z</published>
    <updated>2026-08-05T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>A desktop-only release — the engine stays at 0.12.4, which this build bundles. Two of these shipped in front of every new user: a reply containing a formula quit the app outright, and the starter model everyone landed on fell apart on the kind of…</summary>
    <content type="html">&lt;p&gt;A desktop-only release — the engine stays at 0.12.4, which this build bundles. Two of these shipped in front of every new user: a reply containing a formula quit the app outright, and the starter model everyone landed on fell apart on the kind of question people try first.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Maths no longer crashes the app.&lt;/b&gt; When a reply contained a formula the app quit with a macOS crash dialog, and a plain &lt;code&gt;2 + 2 = 4&lt;/code&gt; was enough to trigger it. Formulas now render as their plain-text source rather than taking the app down; proper typesetting is still to come.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;The starter model was unusable and has been replaced.&lt;/b&gt; The pick that shipped with 0.12.1 came apart on ordinary multi-step questions — doubling words together, then looping until it ran out of room. Measured on the same Mac against the same question: &lt;b&gt;0/4 correct before, 16/16 after&lt;/b&gt;, with the first answer arriving in about a second. Anyone still on the retired starter is walked back through first-run setup rather than left on it (PR #1484).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;A silent server no longer hangs the chat.&lt;/b&gt; Sending a message used to sit there indefinitely if the model stopped responding. It now fails after a bounded wait and the message stays retryable.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Loading a model that will not fit is blocked instead of freezing the Mac.&lt;/b&gt; The check reads free memory at that moment and warns, rather than letting the load proceed into a freeze or a kernel panic.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Your API key is no longer shown in the clear&lt;/b&gt; in the copyable setup snippets on the Launch page.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Cursor no longer gets a configuration that cannot work.&lt;/b&gt; Cursor routes requests through its own servers, so a &lt;code&gt;localhost&lt;/code&gt; address was never reachable from it. The app now says so and points at Claude Code, Cline, or Continue for a genuinely local connection.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Two models that could fail to answer are hidden for now.&lt;/b&gt; Ministral&amp;nbsp;3 and Gemma&amp;nbsp;4&amp;nbsp;E2B looked like ordinary small chat models in the picker, but on some Macs they returned no reply at all. They stay hidden until that is fixed.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Quitting no longer stalls or crashes&lt;/b&gt;, and launching the app no longer risks shutting down a &lt;code&gt;rapid-mlx serve&lt;/code&gt; you started yourself in a terminal. Conversation history keeps its order, the compose box grows with what you type, and the transcript stops yanking you to the bottom while you read further up.&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.12.4 — 2026-08-04 · Caches that were quietly not caching</title>
    <link href="https://rapidmlx.com/changelog/0.12.4"/>
    <id>https://rapidmlx.com/changelog/0.12.4</id>
    <published>2026-08-04T12:00:00Z</published>
    <updated>2026-08-04T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Four of these are the same shape: a cache that reported success while storing nothing, or storing the wrong thing. None of them raised an error — they just made every turn pay full price. Plus an 8 GB Mac finally gets an answer instead of a…</summary>
    <content type="html">&lt;p&gt;Four of these are the same shape: a cache that reported success while storing nothing, or storing the wrong thing. None of them raised an error — they just made every turn pay full price. Plus an 8&amp;nbsp;GB Mac finally gets an answer instead of a rejection.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;An 8&amp;nbsp;GB Mac gets a recommendation instead of a rejection.&lt;/b&gt; Every previous pick was refused by auto-start on the smallest Macs, so the tier existed only to say no. It now recommends &lt;code&gt;lfm2.5-2.6b-4bit&lt;/code&gt; — about 2.0&amp;nbsp;GB resident, fast, and explicitly &lt;em&gt;not&lt;/em&gt; a coding model. Serving it required teaching the alias resolver about Hugging Face repos that ship every quantization in a &lt;em&gt;subdirectory&lt;/em&gt; of one repo: &lt;code&gt;LiquidAI/LFM2.5-2.6B-MLX&lt;/code&gt; holds eight, so a naive pull fetched ~20&amp;nbsp;GB to use 1.6&amp;nbsp;GB. The &lt;code&gt;curl | bash&lt;/code&gt; banner now recommends exactly what the desktop app recommends, with one test that fails if the two ever drift apart (PRs #1442, #1443, #1447).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;&lt;code&gt;--enable-prefix-cache&lt;/code&gt; was a silent no-op on the dense Qwen&amp;nbsp;3.5&amp;nbsp;/&amp;nbsp;3.6 aliases and Ternary&amp;nbsp;Bonsai.&lt;/b&gt; These models carry non-trimmable recurrent layers whose state is reusable only through the bounded snapshot path — but the auto-default that enables that path keyed on a hybrid flag these models are deliberately pinned &lt;em&gt;off&lt;/em&gt;, so it skipped exactly the models that needed it. Every store was dropped and a multi-turn tool agent re-prefilled its whole accumulated context every turn: &lt;b&gt;turn-2 TTFT 22.3&amp;nbsp;s&lt;/b&gt; on &lt;code&gt;qwen3.5-9b-4bit&lt;/code&gt;. Routing is unchanged; only the reuse path is switched on (PR #1445).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;A three-token drift at a message boundary could discard a 40K+ reusable prefix.&lt;/b&gt; Tokenization is not compositional: appending the next assistant or tool segment can change the previous prompt's final few byte-BPE tokens. A non-trimmable cache cannot trim to absorb that, so the whole snapshot was thrown away. An 8-token replay window covers the drift observed on Codex turns at negligible re-prefill cost (PR #1449).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Shutdown persisted the shallowest prefix first.&lt;/b&gt; The save has a short deadline and may commit only one entry; LRU order could start with a one-token bootstrap entry, spend the single guaranteed slot on it, and skip the real 100K+ frontier. Deadline-aware saves now go longest-first (PR #1451).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;The repetition guard answered a runaway loop with 503 and discarded the partial output.&lt;/b&gt; Worse, 503 is the same code as a genuine Metal-runtime abort — where &amp;ldquo;retry smaller&amp;rdquo; is correct advice — so agent frameworks read it as a transient outage and re-sent the identical prompt straight back into the loop. The guard stop is now distinguishable from a runtime abort and returns the tokens already generated. Measured on &lt;code&gt;qwen3.5-4b-4bit&lt;/code&gt;, a 30-turn tool-agent loop hit this twice; larger models, not at all (PR #1450).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;DeepSeek&amp;nbsp;V4 long decodes could exhaust Metal's resource count while memory looked healthy.&lt;/b&gt; The V4 cache updates functionally, so without realizing each forward's leaf arrays the decode retained one live lazy-graph chain per layer per token — hitting the fixed &lt;code&gt;499000&lt;/code&gt; resource limit with plenty of bytes free (PR #1448).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;DeepSeek&amp;nbsp;V4 could reopen thinking after it had been turned off,&lt;/b&gt; re-entering the reasoning parser mid-turn and leaking reasoning into content. Prompt shaping cannot enforce this; it is now suppressed at decode time. V4 also now accepts the &lt;code&gt;r:&lt;/code&gt;-prefixed DSML tool aliases it actually samples, instead of forwarding them as malformed calls (PRs #1452, #1446).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;The desktop app's memory column was two different metrics wearing one hat.&lt;/b&gt; Some rows were a bare-&lt;code&gt;mlx_lm&lt;/code&gt; allocation high-water mark, others were what &lt;code&gt;rapid-mlx serve&lt;/code&gt; actually uses — and &lt;code&gt;serve&lt;/code&gt; quantizes the KV cache to int4 by default, worth roughly 2&amp;nbsp;GB on a 27B. Re-measured through &lt;code&gt;serve&lt;/code&gt; on one machine, the tier table, the hardware-tiers doc and the blog now agree (PR #1453).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;The first text-to-speech request could 500&lt;/b&gt; when Kokoro's spaCy G2P model had not been resolved yet; it is now pre-resolved at the route gate (PR #1254).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Benchmark artifacts carry a schema version and a methodology hash,&lt;/b&gt; so results produced under different methodologies can no longer be silently aggregated together (PR #1455).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.12.3 — 2026-08-04 · A picker that answers &amp;ldquo;will this run on my Mac?&amp;rdquo;</title>
    <link href="https://rapidmlx.com/changelog/0.12.3"/>
    <id>https://rapidmlx.com/changelog/0.12.3</id>
    <published>2026-08-04T12:00:00Z</published>
    <updated>2026-08-04T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Gemma 4 checkpoints stopped serving at all. mlx-lm 0.31.x dropped mlx_lm/chat_templates/gemma4.py, while mlx-community/gemma-4-26b-a4b-it-4bit still declares &quot;chat_template_type&quot;: &quot;gemma4&quot; in its tokenizer config. mlx-lm imports that module by name…</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Gemma&amp;nbsp;4 checkpoints stopped serving at all.&lt;/b&gt; mlx-lm 0.31.x dropped &lt;code&gt;mlx_lm/chat_templates/gemma4.py&lt;/code&gt;, while &lt;code&gt;mlx-community/gemma-4-26b-a4b-it-4bit&lt;/code&gt; still declares &lt;code&gt;&quot;chat_template_type&quot;: &quot;gemma4&quot;&lt;/code&gt; in its tokenizer config. mlx-lm imports that module &lt;em&gt;by name&lt;/em&gt; with no guard, so the import raised &lt;code&gt;ModuleNotFoundError&lt;/code&gt; and &lt;code&gt;rapid-mlx serve&lt;/code&gt; died at startup with no fallback to the checkpoint&amp;rsquo;s own &lt;code&gt;chat_template.jinja&lt;/code&gt; — a regression against 0.6.71, which still shipped the module. Weights load &lt;em&gt;before&lt;/em&gt; the tokenizer in &lt;code&gt;mlx_lm.load&lt;/code&gt;, so a catch-and-retry would re-read multiple gigabytes; the offending field is neutralized up front instead (issue #1420, PR #1439).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;The desktop app recommends a model by your Mac&amp;rsquo;s memory.&lt;/b&gt; The old five-role matrix (Coding / Chat / Vision / …) asked you to classify yourself before running anything. It is replaced by one RAM-tier table: per tier a &lt;b&gt;smart&lt;/b&gt; pick — the most capable model that fits — and, where a genuinely faster model is worth a second card, a &lt;b&gt;fast&lt;/b&gt; alternative. About 1,500 lines lighter (PR #1437).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;The bundled app moves to 0.12.1&lt;/b&gt;, a signed release carrying engine 0.12.1 (PR #1433).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.12.1 — 2026-08-03 · A desktop app, and a Gemma 4 page that was quoting numbers nobody measured</title>
    <link href="https://rapidmlx.com/changelog/0.12.1"/>
    <id>https://rapidmlx.com/changelog/0.12.1</id>
    <published>2026-08-03T12:00:00Z</published>
    <updated>2026-08-03T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>A menu-bar Mac app, in the open-source repo. apps/rapid-mac is an Ollama-style local-LLM app under Apache 2.0 — the same engine with a one-click interface, download-only, with the rapid-mlx name reserved for the engine itself (PRs #1406, #1413…</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;A menu-bar Mac app, in the open-source repo.&lt;/b&gt; &lt;code&gt;apps/rapid-mac&lt;/code&gt; is an Ollama-style local-LLM app under Apache&amp;nbsp;2.0 — the same engine with a one-click interface, download-only, with the &lt;code&gt;rapid-mlx&lt;/code&gt; name reserved for the engine itself (PRs #1406, #1413, #1427).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;The Gemma&amp;nbsp;4 26B page was quoting fabricated speculative-decoding numbers.&lt;/b&gt; They were replaced with measured ones, alongside a corrected MoE flag and a serve guide sized for a 32&amp;nbsp;GB Mac (PR #1429). A companion recipe covers Gemma&amp;nbsp;4 12B on an 18&amp;nbsp;GB Mac (PR #1423).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;SuffixDecoding is no longer a tax on traffic it does not suit.&lt;/b&gt; Its floor on free-form generation went from &lt;b&gt;&amp;minus;32% to &amp;minus;6.7%&lt;/b&gt; (gemma-4-12b-4bit, M3&amp;nbsp;Pro) with the code-edit win intact, and M2&amp;nbsp;Pro&amp;rsquo;s high-overlap case moved from exactly 1.00&amp;times; to &lt;b&gt;+13%&lt;/b&gt;. It still does not clear the bar for defaulting on, so it stays opt-in — the point is that turning it on is no longer a gamble (PR #1419).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Gemma&amp;nbsp;4 gets live KV quantization&lt;/b&gt;, a working bench path, and an exposed KV-projection override (PR #1408).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Long-context prefill adapts to memory pressure&lt;/b&gt; instead of pushing through it (PR #1410).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;&lt;code&gt;pip install rapid-mlx[all]&lt;/code&gt; now installs an audio stack that actually works&lt;/b&gt; — the extra was pulling a combination that had never been validated together (PR #1421).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;mlx / mlx-lm / mlx-vlm version bounds are capped&lt;/b&gt;, and moving one is gated on a full-family output-coherence sweep. An upstream heuristic change had previously shipped garbage generations (issue #1248, PR #1400).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Community benchmarks submit over HTTP&lt;/b&gt; rather than by opening a GitHub PR (PR #1403).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Codex and DeepSeek&amp;nbsp;V4 engineering turns are steadier&lt;/b&gt; — bounded action priming, evidence-aware retries, recovery when a test command is unavailable, and a hardened DSML tool protocol (PRs #1402, #1407, #1417, #1418, #1424, #1428).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.11.9 — 2026-08-02 · Requests that hang, and requests that lie</title>
    <link href="https://rapidmlx.com/changelog/0.11.9"/>
    <id>https://rapidmlx.com/changelog/0.11.9</id>
    <published>2026-08-02T12:00:00Z</published>
    <updated>2026-08-02T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Every fix here is a case where the server failed to give an honest answer: it either never came back, or it reported success on output it had already judged bad. Nothing new is added; seven ways to be misled are removed. A streaming tool call could…</summary>
    <content type="html">&lt;p&gt;Every fix here is a case where the server failed to give an honest answer: it either never came back, or it reported success on output it had already judged bad. Nothing new is added; seven ways to be misled are removed.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;A streaming tool call could wedge a connection indefinitely.&lt;/b&gt; Once the tool parser sees an opener (&lt;code&gt;&amp;lt;tool_call&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;function=&lt;/code&gt;), the post-processor withholds every delta until the block closes — and that suppression had &lt;em&gt;no bound&lt;/em&gt;. A block that never closed held all content forever, so the SSE generator emitted nothing but &lt;code&gt;: keepalive&lt;/code&gt; comments and &lt;b&gt;no timeout at any layer could fire&lt;/b&gt;: the reported request generated 2,207 tokens, put 1 chunk on the wire, and ran 518&amp;nbsp;s — outliving its own 300&amp;nbsp;s client timeout. From the client it was indistinguishable from a server that never answered. Withheld bytes are now capped at 64&amp;nbsp;KB, after which the text is released as content and tool suppression latches off for the rest of the turn. The cap only applies before any tool call has reached the wire, so genuine incrementally-streamed tool calls are never touched (issue #1359, PR #1391).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;A forced tool call no longer fabricates arguments it knows are invalid.&lt;/b&gt; Under &lt;code&gt;tool_choice: &quot;required&quot;&lt;/code&gt; or a named function, when the parser surfaced no call the route synthesised one to honour the tool-call-guaranteed contract — with &lt;code&gt;arguments: &quot;{}&quot;&lt;/code&gt;. If the target tool's schema declared required properties, that was a call &lt;em&gt;the server already knew was schema-invalid&lt;/em&gt;, handed to the client under &lt;code&gt;finish_reason: &quot;tool_calls&quot;&lt;/code&gt; for it to parse and execute. Unmet required properties now return &lt;b&gt;422&lt;/b&gt; on chat non-stream and on both Responses sites; streaming cannot 422 after headers are sent, so it finishes &lt;code&gt;stop&lt;/code&gt; rather than fabricating. A tool with no required fields still synthesises &lt;code&gt;{}&lt;/code&gt; exactly as before (issue #1256, PR #1394).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;The repetition guard reports a failure instead of a success.&lt;/b&gt; Running Codex against a local DeepSeek V4 build, the model emitted &lt;code&gt;ambigu&lt;/code&gt; over and over. rapid-mlx correctly stopped it at 304 completion tokens — then logged &lt;code&gt;finished normally&lt;/code&gt;, so Codex emitted &lt;code&gt;turn.completed&lt;/code&gt; and exited successfully without changing a single file. Guard termination is now an aborted generation carrying an explicit error (PR #1396).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Short degenerate loops are caught before they exhaust Metal.&lt;/b&gt; A 46,475-token Responses request fell into a repeated short CJK loop, generated 10,844 completion tokens, and hit &lt;code&gt;[metal::malloc] Resource limit (499000) exceeded&lt;/code&gt; around scheduler step 12,032 — and the recovery path emitted a terminal output with no &lt;code&gt;error&lt;/code&gt;, so the request was reported as a success. Sustained 1–5 token loops are now detected, with a conservative 256-repeat floor, reading only the trailing 768 tokens regardless of context length, and still restricted to tool-bearing requests. Scheduler-local Metal failures now propagate through &lt;code&gt;RequestOutput.error&lt;/code&gt; (PR #1393).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Embeddings no longer leak Metal buffers.&lt;/b&gt; &lt;code&gt;/v1/embeddings&lt;/code&gt; never called &lt;code&gt;mx.clear_cache()&lt;/code&gt;, unlike every LLM path in the engine — and because &lt;code&gt;padding=True&lt;/code&gt; makes each batch a different sequence length, MLX's size-keyed allocator pool almost never had a reusable block. It only grew: roughly 70&amp;nbsp;MB retained per input text, &lt;b&gt;2.3&amp;nbsp;GB → 24&amp;nbsp;GB over 320 texts&lt;/b&gt;, and about 50&amp;nbsp;GB in a week-old production process. Buffers are now released after each batch on both the string and pre-tokenized paths (issue #1380, PR #1390).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;A warm start is no longer an outage.&lt;/b&gt; The persisted prefix cache was loaded synchronously between engine start and readiness, so &lt;code&gt;/health/ready&lt;/code&gt; and &lt;code&gt;/v1/models&lt;/code&gt; returned 503 for the entire multi-second read — an orchestrator gating traffic on readiness saw a warm start as downtime. Readiness now flips first and the cache warms in the background; shutdown cancels a load still in flight. This is safe because each entry installs as a single atomic swap under its own lock, so an early request either misses and recomputes (always correct) or hits a fully-installed cache — never a half-populated one (issue #1350, PR #1392).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;ffmpeg is found when it is not on &lt;code&gt;PATH&lt;/code&gt;.&lt;/b&gt; Video remux and crop now resolve the binary from &lt;code&gt;FFMPEG_BINARY&lt;/code&gt;, then the process &lt;code&gt;PATH&lt;/code&gt;, then the usual Homebrew and system locations — so a GUI-launched process with a minimal environment completes instead of failing at the last step (issue #1352, PR #1397).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.11.8 — 2026-08-02 · Embeddings stop truncating silently at 512 tokens</title>
    <link href="https://rapidmlx.com/changelog/0.11.8"/>
    <id>https://rapidmlx.com/changelog/0.11.8</id>
    <published>2026-08-02T12:00:00Z</published>
    <updated>2026-08-02T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>/v1/embeddings hardcoded the tokenizer at max_length=512. Anything longer came back HTTP 200, correctly shaped, and quietly missing its tail — which degrades a vector index with no signal anywhere. Reported by a user indexing code chunks with…</summary>
    <content type="html">&lt;p&gt;
      &lt;code&gt;/v1/embeddings&lt;/code&gt; hardcoded the tokenizer at &lt;code&gt;max_length=512&lt;/code&gt;. Anything longer came back HTTP&amp;nbsp;200, correctly shaped, and quietly missing its tail — which degrades a vector index with no signal anywhere. Reported by a user indexing code chunks with Qwen3-Embedding-4B, whose architecture supports 32K (issue #1381).
    &lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;The limit is now derived from the model.&lt;/b&gt; &lt;code&gt;auto&lt;/code&gt; reads &lt;code&gt;config.max_position_embeddings&lt;/code&gt;, then &lt;code&gt;tokenizer.model_max_length&lt;/code&gt;, guarding Hugging Face's large &quot;unset&quot; sentinel. It falls back to 512 only when the model declares nothing at all — and logs that it did.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;&lt;code&gt;--embedding-max-length auto|&amp;lt;int&amp;gt;&lt;/code&gt;&lt;/b&gt; — an operator ceiling for a lower memory or service limit. An explicit value is validated against and clamped to the model maximum.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;&lt;code&gt;--embedding-overflow-policy truncate|error&lt;/code&gt;&lt;/b&gt; — &lt;code&gt;truncate&lt;/code&gt; (the default) still discards the tail, but logs a warning and increments &lt;code&gt;rapid_mlx_embedding_truncations_total&lt;/code&gt; on &lt;code&gt;/metrics&lt;/code&gt;, so it is no longer silent. &lt;code&gt;error&lt;/code&gt; returns a structured &lt;b&gt;400&lt;/b&gt; with &lt;code&gt;code: &quot;input_too_long&quot;&lt;/code&gt; carrying the observed and allowed token counts.&lt;/li&gt;
      &lt;li&gt;Both apply to string and pre-tokenized inputs alike, and the usage block no longer over-reports the pre-truncation token count (PR #1386).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.11.7 — 2026-08-02 · Test-only</title>
    <link href="https://rapidmlx.com/changelog/0.11.7"/>
    <id>https://rapidmlx.com/changelog/0.11.7</id>
    <published>2026-08-02T12:00:00Z</published>
    <updated>2026-08-02T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>One change, and no behaviour change: proof that the RAPID_MLX_BASE_URL release guard (G7) fails loudly rather than passing vacuously — driven from bash across the boundary, with the exit code shadowed so a silent skip cannot read as a pass (PR…</summary>
    <content type="html">&lt;p&gt;
      One change, and no behaviour change: proof that the &lt;code&gt;RAPID_MLX_BASE_URL&lt;/code&gt; release guard (G7) fails loudly rather than passing vacuously — driven from bash across the boundary, with the exit code shadowed so a silent skip cannot read as a pass (PR #1384). Released so the published tag matches the tree the gate ran against.
    &lt;/p&gt;</content>
  </entry>
  <entry>
    <title>0.11.6 — 2026-08-02 · DeepSeek V4 gets its own drafter, and a guard against runaway output</title>
    <link href="https://rapidmlx.com/changelog/0.11.6"/>
    <id>https://rapidmlx.com/changelog/0.11.6</id>
    <published>2026-08-02T12:00:00Z</published>
    <updated>2026-08-02T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Four DeepSeek V4 changes that compound: the checkpoint's native speculative-decoding heads are finally used, its reasoning is parsed by a parser that understands it, a repeated prompt stops re-prefilling from scratch — and a model that falls into a…</summary>
    <content type="html">&lt;p&gt;Four DeepSeek V4 changes that compound: the checkpoint's native speculative-decoding heads are finally used, its reasoning is parsed by a parser that understands it, a repeated prompt stops re-prefilling from scratch — and a model that falls into a loop is stopped instead of running until the client gives up.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;DSpark — DeepSeek V4's checkpoint-native speculative decoding.&lt;/b&gt; DeepSeek ships three MTP stages plus low-rank Markov heads &lt;em&gt;inside&lt;/em&gt; the V4 Flash 0731 checkpoint; rapid-mlx now drafts and verifies with them instead of ignoring them. Turn it on with &lt;code&gt;--speculative-config '{&quot;method&quot;:&quot;dspark&quot;,&quot;num_speculative_tokens&quot;:5}'&lt;/code&gt;. Detection is fail-closed: the block geometry is read from the checkpoint's own &lt;code&gt;inference/config.json&lt;/code&gt;, and every required tensor is checked against the safetensors index — so a stripped conversion refuses to start rather than decoding wrong. &lt;code&gt;num_speculative_tokens&lt;/code&gt; must equal the checkpoint's &lt;code&gt;dspark_block_size&lt;/code&gt; (5 on the 0731 checkpoint); a partial block is rejected. On real Codex &lt;code&gt;/v1/responses&lt;/code&gt; tool rounds, 2.6–2.9 tokens were accepted per round. One limitation worth knowing before you try it: DSpark reads the checkpoint directory directly, so today it needs a &lt;b&gt;local path&lt;/b&gt; — &lt;code&gt;rapid-mlx serve /path/to/DeepSeek-V4-Flash-0731-MXFP4-MLX&lt;/code&gt; — not the &lt;code&gt;deepseek-v4-flash-0731-mxfp4&lt;/code&gt; alias, which resolves to a Hugging Face id. See &lt;a href=&quot;/docs/perf-flags.html#dspark&quot;&gt;perf flags&lt;/a&gt; (PR #1379).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;A DeepSeek V4 reasoning parser.&lt;/b&gt; V4 was being parsed by the generic DeepSeek-R1 parser, which does not understand V4's protocol — so part of the model's internal scratch reasoning was emitted as user-visible content. &lt;code&gt;reasoning_parser: deepseek_v4&lt;/code&gt; now backs all four V4 aliases, wired request-aware through Chat, Anthropic and Responses. An explicit-thinking stream keeps its reasoning in the reasoning channel with no &lt;code&gt;&amp;lt;think&amp;gt;&lt;/code&gt; leakage into raw SSE, reasoning or content (PR #1383).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Warm TTFT on a repeated prompt: ~24.6&amp;nbsp;s → 0.318&amp;nbsp;s.&lt;/b&gt; An exact-repeat 8,131-token prompt was still paying almost the full cold cost, because an &lt;em&gt;unusable&lt;/em&gt; full-length cache snapshot masked a usable 8,113-token message-boundary one. An exact non-trimmable hit now falls back to the longest usable strict prefix instead of silently full-prefilling. Measured on the real MXFP4 checkpoint, with byte-identical output:&lt;/li&gt;
    &lt;/ul&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;DeepSeek V4 Flash 0731 · MXFP4 · 8,131-token prompt, 124 completion tokens&lt;/th&gt;&lt;th&gt;TTFT&lt;/th&gt;&lt;th&gt;Decode&lt;/th&gt;&lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
        &lt;tr&gt;&lt;td&gt;Cold&lt;/td&gt;&lt;td class=&quot;mono&quot;&gt;25.830 s&lt;/td&gt;&lt;td class=&quot;mono&quot;&gt;25.81–26.11 tok/s&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Warm — before&lt;/td&gt;&lt;td class=&quot;mono&quot;&gt;~24.6 s&lt;/td&gt;&lt;td class=&quot;mono&quot;&gt;—&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Warm — after&lt;/td&gt;&lt;td class=&quot;mono&quot;&gt;0.318 s &lt;b&gt;(81.2× vs cold)&lt;/b&gt;&lt;/td&gt;&lt;td class=&quot;mono&quot;&gt;25.81–26.11 tok/s&lt;/td&gt;&lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;&lt;/div&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;The prefix cache survives a restart.&lt;/b&gt; Persisted V4 prefixes are reloaded and reused across server restarts, so the warm path above is warm on the &lt;em&gt;first&lt;/em&gt; request after a restart rather than the second.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;A runaway agent no longer generates until the client gives up.&lt;/b&gt; A real Codex + DeepSeek V4 Flash session repeated the same investigation sentence for &lt;b&gt;4,922 tokens over 234 seconds&lt;/b&gt;, until the client disconnected — the existing post-completion coherence telemetry can only notice that &lt;em&gt;after&lt;/em&gt; the fact, never stop it mid-flight. A token-level guard now checks a bounded suffix every eight decode tokens and stops exact periodic output, exposing &lt;code&gt;rapid_mlx_repetition_loop_stops_total&lt;/code&gt;. It is deliberately conservative — at least 72 repeated tokens, and restricted to tool-bearing agent requests, so plain chat is untouched (PR #1377). A follow-up made the copy threshold adaptive to loop length: a long periodic block stops after three copies while a short phrase still needs proportionally more, because a real 61-token paragraph loop was letting 424–464 tokens reach the UI before the guard fired (PR #1378). In 0.11.9 this guard stops reporting success — see above.&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.11.5 — 2026-08-01 · DeepSeek V4 Flash 0731, and a canary for bad output</title>
    <link href="https://rapidmlx.com/changelog/0.11.5"/>
    <id>https://rapidmlx.com/changelog/0.11.5</id>
    <published>2026-08-01T12:00:00Z</published>
    <updated>2026-08-01T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>DeepSeek V4 Flash 0731 is served. The 0731 checkpoint gets a first-class alias, deepseek-v4-flash-0731-mxfp4 — the most capable open-weights model in the registry, and the cheapest 50-point model on the Artificial Analysis index (PR #1364). Serving…</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;DeepSeek V4 Flash 0731 is served.&lt;/b&gt; The 0731 checkpoint gets a first-class alias, &lt;code&gt;deepseek-v4-flash-0731-mxfp4&lt;/code&gt; — the most capable open-weights model in the registry, and the cheapest 50-point model on the Artificial Analysis index (PR #1364). Serving it took three follow-ups: mixed-length batches (PR #1365), a stabilization pass (PR #1369), and making prefix reuse actually engage on V4 (PR #1371), where it had been silently doing nothing.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;DeepSeek DSML markup no longer leaks into Responses streams&lt;/b&gt; (PR #1373).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;An output-quality canary.&lt;/b&gt; Request telemetry can carry &lt;code&gt;output_degenerate&lt;/code&gt;, a boolean computed locally that flags runaway repetition — so a bad quantization surfaces as a version-scoped spike instead of scattered bug reports. The check runs on your machine and only its yes/no answer is sent; no prompt, no completion (PR #1250, #1266). Documented on the &lt;a href=&quot;/docs/telemetry.html#collect-degenerate&quot;&gt;telemetry page&lt;/a&gt;.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Small-model GPU smoke on free CI runners&lt;/b&gt; — coherence plus tool-calling on Qwen and Llama, catching the cheapest class of regression without waiting for the Studio.&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.11.4 — 2026-07-31 · Controls for the new multimodal lanes</title>
    <link href="https://rapidmlx.com/changelog/0.11.4"/>
    <id>https://rapidmlx.com/changelog/0.11.4</id>
    <published>2026-07-31T12:00:00Z</published>
    <updated>2026-07-31T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>A follow-up to 0.11.3 that makes the audio and video surfaces controllable, discoverable and reproducible — no new models, just the knobs the new lanes were missing. Every change here was exercised end-to-end on the Studio (M3 Ultra) against the…</summary>
    <content type="html">&lt;p&gt;A follow-up to 0.11.3 that makes the audio and video surfaces controllable, discoverable and reproducible — no new models, just the knobs the new lanes were missing. Every change here was exercised end-to-end on the Studio (M3 Ultra) against the published wheel.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Video motion controls.&lt;/b&gt; &lt;code&gt;POST /v1/videos&lt;/code&gt; now accepts &lt;code&gt;guidance_scale&lt;/code&gt;, &lt;code&gt;negative_prompt&lt;/code&gt;, explicit &lt;code&gt;fps&lt;/code&gt;/&lt;code&gt;frames&lt;/code&gt;, and (LTX image-to-video) &lt;code&gt;conditioning_strength&lt;/code&gt; — each validated against the served backend, so an out-of-range value returns a clear 400 instead of a bad clip (PR #1340).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Discoverable limits.&lt;/b&gt; &lt;code&gt;GET /v1/videos/capabilities&lt;/code&gt; reports the served backend's real bounds — the size range and multiple-of-64 rule, the &lt;code&gt;8n+1&lt;/code&gt; (LTX) and &lt;code&gt;4n+1&lt;/code&gt; (Wan) frame shapes, native fps, the pixel-frame workload ceiling and the reference-image caps — so a client can size a request without guessing (PR #1343).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Audio output format.&lt;/b&gt; &lt;code&gt;/v1/audio/speech&lt;/code&gt; and &lt;code&gt;/v1/audio/music&lt;/code&gt; take &lt;code&gt;sample_rate&lt;/code&gt; (8k–96k) and &lt;code&gt;channels&lt;/code&gt; (mono or stereo); the returned WAV is resampled and up- or down-mixed to match, and echoes the actual rate and channels in &lt;code&gt;X-Audio-*&lt;/code&gt; response headers (PR #1346).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Reproducible designed voices.&lt;/b&gt; Qwen3-TTS VoiceDesign accepts a &lt;code&gt;voice_seed&lt;/code&gt;, so a voice you described in natural language comes back byte-for-byte identical on the next call — the missing piece for keeping one narrator across a project (PR #1347).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;LTX videos come back video-only.&lt;/b&gt; The LTX checkpoint is an audio-video one, but its audio track was silent; that empty track is now stripped so the MP4 is a single video stream instead of reading to downstream tools as &quot;this clip has sound&quot; (PR #1349).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Docs caught up.&lt;/b&gt; The audio guide had five whole model families missing (PR #1345), and the video guide now states plainly that these backends return no audio (PR #1353).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.11.3 — 2026-07-30 · Audio grows up, and video ships</title>
    <link href="https://rapidmlx.com/changelog/0.11.3"/>
    <id>https://rapidmlx.com/changelog/0.11.3</id>
    <published>2026-07-30T12:00:00Z</published>
    <updated>2026-07-30T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>The largest single jump in the model registry so far: 191 → 214 aliases. Eleven new TTS/STT aliases, eight video-generation aliases, and a whole new modality behind an asynchronous jobs API. Version 0.11.2 was cut but never released: its Tier-1…</summary>
    <content type="html">&lt;p&gt;The largest single jump in the model registry so far: &lt;b&gt;191 → 214 aliases&lt;/b&gt;. Eleven new TTS/STT aliases, eight video-generation aliases, and a whole new modality behind an asynchronous jobs API. Version 0.11.2 was cut but never released: its Tier-1 agent gate failed. 0.11.3 is 0.11.2 plus a first attempt at the fix (PR #1341) — and its gate failed too. The defects turned out to be in the &lt;b&gt;gate harness itself, not in the release payload&lt;/b&gt;: the harness ran the Hermes setup without &lt;code&gt;--base-url&lt;/code&gt;, leaving its context at the 32K fallback below the 64K minimum Hermes requires to start at all, and its per-agent time budget was too tight for the 35B hybrid gate model's cold shader compile. The payload was then verified by hand on the Studio (M3 Ultra) — Claude Code, Codex and Aider pass, and Hermes passes once its context is set correctly — and 0.11.3 shipped through the documented emergency-release path, with the bypass and its reason stamped into the GitHub release notes. The harness has since been fixed.&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Video generation, a new lane.&lt;/b&gt; &lt;code&gt;POST /v1/videos&lt;/code&gt; follows OpenAI's job-based Videos API — submit, poll, download the MP4. Three backends ship: &lt;b&gt;Wan 2.1 / 2.2&lt;/b&gt; with four converted checkpoints, native frame-rate handling, &lt;code&gt;4n+1&lt;/code&gt; temporal-shape enforcement, per-checkpoint pixel-area ceilings and LoRA support (PR #1322); &lt;b&gt;CogVideoX-Fun&lt;/b&gt; with its runtime bundled so no source checkout is needed (PR #1313, #1329); and &lt;b&gt;MLX-native LTX-2.3&lt;/b&gt; (PR #1298). Jobs are serialized on purpose — two diffusion pipelines resident at once will exhaust unified memory. Needs Python 3.11+ and ffmpeg; core text and audio stay on 3.10 (PR #1325). See &lt;a href=&quot;/docs/models/families/video.html&quot;&gt;the video family page&lt;/a&gt;.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Voice cloning, four ways.&lt;/b&gt; &lt;b&gt;Qwen3-TTS Base&lt;/b&gt; clones from a reference clip plus its transcript, so a channel can keep one branded narrator (PR #1305). &lt;b&gt;IndexTTS 1.5&lt;/b&gt; clones from the clip &lt;em&gt;alone&lt;/em&gt; — no transcript — which makes it the least fiddly path (PR #1318). &lt;b&gt;F5-TTS&lt;/b&gt; (pure MLX, no torch) closes the Chinese expressive-cloning gap that Qwen3-TTS reads flat on and Chatterbox can't reach, being English-only (PR #1297, #1304). &lt;b&gt;Chatterbox&lt;/b&gt; gained zero-shot cloning and an exaggeration control (PR #1303).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Qwen3-TTS VoiceDesign — describe a voice instead of picking one.&lt;/b&gt; Timbre, gender, age, accent, emotion and prosody all come from a natural-language &lt;code&gt;instructions&lt;/code&gt; string; there are no named speakers at all. That is a strictly richer surface than CustomVoice's &lt;code&gt;instructions&lt;/code&gt;, which only modulates a fixed speaker (PR #1309).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Forced alignment — timings without recognition error.&lt;/b&gt; Give &lt;code&gt;Qwen3-ForcedAligner&lt;/code&gt; audio plus the transcript you already have and it returns per-character start/end times. Because it never guesses at words, it cannot mis-hear them — which is exactly what karaoke captions and beat-synced editing need, and it was unoccupied on MLX (PR #1301). The lane was then hardened: blocking work moved off the event loop, the aligner given its own model cache so it stops evicting the ASR model, and corrupted uploads no longer misreported as bad requests (PR #1317, #1327).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;SenseVoice — fast Asian-language ASR.&lt;/b&gt; FunAudioLLM SenseVoice Small (~234M, non-autoregressive CTC), strongest in the registry on Chinese, Cantonese, Japanese and Korean, and it emits per-segment emotion and audio-event tags alongside the transcript (PR #1308).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Word-level timestamps on transcription.&lt;/b&gt; &lt;code&gt;/v1/audio/transcriptions&lt;/code&gt; now returns per-word timings (PR #1299).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Local text-to-music.&lt;/b&gt; A vendored MLX Stable Audio 3 engine behind &lt;code&gt;POST /v1/audio/music&lt;/code&gt; (PR #1307, #1316).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Kokoro stops taking the worker down.&lt;/b&gt; A broken espeak G2P setup used to crash the audio worker or return 500s and crowd out other candidates; it now degrades and reports instead (PR #1312, #1314). VoxCPM's advertised Chinese support was withdrawn — it did not work, and claiming it was worse than not having it (PR #1302).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Release gating got stricter and better calibrated.&lt;/b&gt; A KV-quant differential quality gate with a chip-tier classifier (PR #1289), DeepSeek-R1 excluded from the coherence sweep where it was a known false positive (PR #1324), the Hermes gauntlet profile stabilized (PR #1330), and the G12 random-coverage gate recalibrated (PR #1332).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Dead code removed.&lt;/b&gt; The unused vLLM platform prototype (PR #1288), unused cloud routing (PR #1290) and legacy branding on public surfaces (PR #1292) are gone. &lt;code&gt;rapid-mlx models&lt;/code&gt; now shows download size per model (PR #1293).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.11.1 — 2026-07-28 · Correctness &amp;amp; first-run polish across the 0.11 line</title>
    <link href="https://rapidmlx.com/changelog/0.11.1"/>
    <id>https://rapidmlx.com/changelog/0.11.1</id>
    <published>2026-07-28T12:00:00Z</published>
    <updated>2026-07-28T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Community contributors: @pierre427 — DeepSeek-V4 explicit YaRN attention_factor (#1225) and containing local model_file imports to the model root (#1226). Live KV-cache quantization now engages on vision models too. The --kv-cache-dtype int8/int4…</summary>
    <content type="html">&lt;p&gt;&lt;b&gt;Community contributors:&lt;/b&gt;
      &lt;a href=&quot;https://github.com/pierre427&quot;&gt;@pierre427&lt;/a&gt; — DeepSeek-V4 explicit YaRN &lt;code&gt;attention_factor&lt;/code&gt;
      (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1225&quot;&gt;#1225&lt;/a&gt;) and containing local &lt;code&gt;model_file&lt;/code&gt; imports to the model root
      (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1226&quot;&gt;#1226&lt;/a&gt;).
    &lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Live KV-cache quantization now engages on vision models too.&lt;/b&gt; The &lt;code&gt;--kv-cache-dtype int8&lt;/code&gt;/&lt;code&gt;int4&lt;/code&gt; path probes the nested language-model &lt;code&gt;head_dim&lt;/code&gt;, so multimodal servers get the same steady-state KV savings as text models; a fail-safe keeps bf16 wherever no supported group size fits (PR #1208, #1231).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Qwen3.6-35B-A3B serves coherently again.&lt;/b&gt; An upstream mlx-lm change had applied a spurious +1.0 RMSNorm shift that garbled this checkpoint; it is now undone (PR #1234).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;MTP no longer returns intermittent empty responses.&lt;/b&gt; The Qwen3.6 MTP sidecar path could occasionally emit nothing; sidecar extraction and eligibility checks were hardened (PR #1201, #1214, #1215).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;A quieter, clearer first run.&lt;/b&gt; Cold-model downloads show a TTY-aware single-line progress bar with the correct starter size; the unauthenticated-download advisory and leaked Hugging Face progress bars are silenced; and cold-start dead air is gone (PR #1237, #1259, #1260, #1263).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;MCP config accepts the standard &lt;code&gt;mcpServers&lt;/code&gt; key.&lt;/b&gt; Following the standard examples previously resolved to zero servers; the standard key is now honored (PR #1243).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Output-coherence release gate.&lt;/b&gt; Six blocking golden checks plus an advisory garbage detector now guard every release across the model fleet (PR #1247, #1262).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.11.0 — 2026-07-24 · Quantized live KV cache — int4/int8 on the continuous-batching cache</title>
    <link href="https://rapidmlx.com/changelog/0.11.0"/>
    <id>https://rapidmlx.com/changelog/0.11.0</id>
    <published>2026-07-24T12:00:00Z</published>
    <updated>2026-07-24T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Community contributor: @66Ton99 — Codex Responses long-context handling (#1141). The live continuous-batching KV cache is now quantized. --kv-cache-dtype int4 (the default) and int8 previously only shrank the retained prefix cache — the live decode…</summary>
    <content type="html">&lt;p&gt;&lt;b&gt;Community contributor:&lt;/b&gt;
      &lt;a href=&quot;https://github.com/66Ton99&quot;&gt;@66Ton99&lt;/a&gt; — Codex Responses
      long-context handling (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1141&quot;&gt;#1141&lt;/a&gt;).
    &lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;The live continuous-batching KV cache is now quantized.&lt;/b&gt; &lt;code&gt;--kv-cache-dtype int4&lt;/code&gt; (the default) and &lt;code&gt;int8&lt;/code&gt; previously only shrank the retained &lt;i&gt;prefix&lt;/i&gt; cache — the live decode cache stayed bf16, so a long-context or high-concurrency batch still grew its KV memory at full precision (and &lt;code&gt;--disable-prefix-cache&lt;/code&gt; saved nothing). The continuous-batching cache is now quantized with dequant-on-read, cutting steady-state KV memory on long-context and multi-request serving. Hybrid, sliding-window and MLA-latent caches stay bf16 where no supported group size fits, so the path is safe to leave on by default (PR #1197, #1199).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Forced tool-call arguments are now grammar-constrained on reasoning models too.&lt;/b&gt; A forced or named tool call (&lt;code&gt;tool_choice=&quot;required&quot;&lt;/code&gt; or a specific function) on a reasoning model previously opted &lt;i&gt;out&lt;/i&gt; of the decode-time grammar while it was inside its thinking budget, leaving the arguments unconstrained. They are now hard-constrained like every other tool call — closing the last gap in the #558 tool-call-integrity work: forced or free, thinking or not, a tool call is guaranteed parseable (PR #1192, #558 line①).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.10.18 — 2026-07-24 · Bounded prefill memory on long prompts</title>
    <link href="https://rapidmlx.com/changelog/0.10.18"/>
    <id>https://rapidmlx.com/changelog/0.10.18</id>
    <published>2026-07-24T12:00:00Z</published>
    <updated>2026-07-24T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Long text-only prompts no longer spike memory. The multimodal batch generator was pushing the entire prompt through the language model in a single forward and projecting logits over every position, peaking around 35 GB on a ~20k-token prompt —…</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Long text-only prompts no longer spike memory.&lt;/b&gt; The multimodal batch generator was pushing the entire prompt through the language model in a single forward and projecting logits over every position, peaking around 35&amp;nbsp;GB on a ~20k-token prompt — enough to max out a 48&amp;nbsp;GB Mac. Text-only prefill is now chunked to bound peak memory (PR #1193, fixes #1187).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.10.17 — 2026-07-22 · Base-wheel VLM serve + install-hint fix</title>
    <link href="https://rapidmlx.com/changelog/0.10.17"/>
    <id>https://rapidmlx.com/changelog/0.10.17</id>
    <published>2026-07-22T12:00:00Z</published>
    <updated>2026-07-22T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Hybrid-VLM checkpoints serve cleanly from the base wheel. Serving a hybrid vision-language checkpoint without the [vision] extra now skips the vision path instead of erroring, and the Gemma-4 install hint points at the right extra (PR #1179).</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Hybrid-VLM checkpoints serve cleanly from the base wheel.&lt;/b&gt; Serving a hybrid vision-language checkpoint without the &lt;code&gt;[vision]&lt;/code&gt; extra now skips the vision path instead of erroring, and the Gemma-4 install hint points at the right extra (PR #1179).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.10.16 — 2026-07-22 · Grammar-constrained Gemma-4 native tool calls</title>
    <link href="https://rapidmlx.com/changelog/0.10.16"/>
    <id>https://rapidmlx.com/changelog/0.10.16</id>
    <published>2026-07-22T12:00:00Z</published>
    <updated>2026-07-22T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Gemma 4 native tool calls are grammar-constrained. Gemma 4's native tool-call format is now constrained by a grammar at decode time, extending guaranteed-parseable tool-calling to the Gemma-4 family (PR #1171, #558 E4).</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Gemma 4 native tool calls are grammar-constrained.&lt;/b&gt; Gemma 4's native tool-call format is now constrained by a grammar at decode time, extending guaranteed-parseable tool-calling to the Gemma-4 family (PR #1171, #558 E4).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.10.15 — 2026-07-21 · Grammar-constrained tool calling, out of the box</title>
    <link href="https://rapidmlx.com/changelog/0.10.15"/>
    <id>https://rapidmlx.com/changelog/0.10.15</id>
    <published>2026-07-21T12:00:00Z</published>
    <updated>2026-07-21T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>llguidance promoted to a core dependency. The default-on grammar-constrained tool-calling from 0.10.14 now works with zero extra setup — the grammar engine ships with the base install instead of being an opt-in extra, so guaranteed-parseable tool…</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;&lt;code&gt;llguidance&lt;/code&gt; promoted to a core dependency.&lt;/b&gt; The default-on grammar-constrained tool-calling from 0.10.14 now works with &lt;b&gt;zero extra setup&lt;/b&gt; — the grammar engine ships with the base install instead of being an opt-in extra, so guaranteed-parseable tool calls are on out of the box (PR #1146, part of #558).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.10.14 — 2026-07-21 · Default-on grammar-constrained tool calling</title>
    <link href="https://rapidmlx.com/changelog/0.10.14"/>
    <id>https://rapidmlx.com/changelog/0.10.14</id>
    <published>2026-07-21T12:00:00Z</published>
    <updated>2026-07-21T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Grammar-constrained tool calling, on by default. Tool-call generation is now constrained by a grammar at decode time, so the model cannot emit a malformed tool call — the structured output is guaranteed parseable rather than parsed-and-hoped.…</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Grammar-constrained tool calling, on by default.&lt;/b&gt; Tool-call generation is now constrained by a grammar at decode time, so the model &lt;b&gt;cannot&lt;/b&gt; emit a malformed tool call — the structured output is guaranteed parseable rather than parsed-and-hoped. Includes an automatic path that engages it without any configuration (PR #1143, part of #558).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.10.12 — 2026-07-17 · Response cache + trim-free prefix reuse</title>
    <link href="https://rapidmlx.com/changelog/0.10.12"/>
    <id>https://rapidmlx.com/changelog/0.10.12</id>
    <published>2026-07-17T12:00:00Z</published>
    <updated>2026-07-17T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Community contributors: @kumosan2 — hybrid prefix reuse (#1111); @romanbsd — nested Gemma 4 tool arguments (#1102); @pierre427 — pflash compression visibility (#1106). Prompt-deterministic response cache — opt-in exact-match short-circuit. New…</summary>
    <content type="html">&lt;p&gt;&lt;b&gt;Community contributors:&lt;/b&gt;
      &lt;a href=&quot;https://github.com/kumosan2&quot;&gt;@kumosan2&lt;/a&gt; — hybrid prefix reuse
      (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1111&quot;&gt;#1111&lt;/a&gt;);
      &lt;a href=&quot;https://github.com/romanbsd&quot;&gt;@romanbsd&lt;/a&gt; — nested Gemma 4 tool arguments
      (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1102&quot;&gt;#1102&lt;/a&gt;);
      &lt;a href=&quot;https://github.com/pierre427&quot;&gt;@pierre427&lt;/a&gt; — pflash compression visibility
      (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1106&quot;&gt;#1106&lt;/a&gt;).
    &lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Prompt-deterministic response cache — opt-in exact-match short-circuit.&lt;/b&gt; New &lt;code&gt;--response-cache-entries N&lt;/code&gt; retains up to N fully-computed &lt;b&gt;greedy&lt;/b&gt; (&lt;code&gt;temperature 0&lt;/code&gt; / &lt;code&gt;top_k 1&lt;/code&gt;) chat completions; a completely repeated request returns the stored completion verbatim with &lt;b&gt;zero GPU decode&lt;/b&gt; — the second and later identical calls are effectively free. The cache key spans every output-affecting field (model id, the canonical messages + chat kwargs, resolved sampling kwargs, &lt;code&gt;response_format&lt;/code&gt; / &lt;code&gt;logprobs&lt;/code&gt;), so any change is a clean miss and recompute; sampled requests are never short-circuited. It is &lt;b&gt;distinct from and complementary to&lt;/b&gt; the prefix / KV cache — the prefix cache reuses prefill &lt;i&gt;state&lt;/i&gt; and still decodes, this returns the entire stored completion and decodes nothing. New Prometheus counters &lt;code&gt;rapid_mlx_response_cache_hits_total&lt;/code&gt; / &lt;code&gt;_misses_total&lt;/code&gt;. Ideal for agent retry loops, eval harnesses, and dashboard / health probes that re-issue an identical request. Default &lt;code&gt;0&lt;/code&gt; = fully disabled, request path byte-for-byte unchanged (PR #1123).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Trim-free prefix reuse for hybrid &amp;amp; sliding-window models — opt-in.&lt;/b&gt; New &lt;code&gt;--hybrid-cache-entries N&lt;/code&gt; retains up to N non-trimmable prefix-cache entries so a stable prefix + a new suffix each turn reuses prior prefill instead of recomputing it. Covers both hybrid recurrent-state (GatedDeltaNet / Mamba) &lt;b&gt;and&lt;/b&gt; sliding-window (Gemma 4, GPT-OSS) models — best for stable-system-prompt / long-context agent workloads. An exact re-request of a rotated sliding-window prompt safely falls back to a full prefill (byte-equal to cold). Default &lt;code&gt;0&lt;/code&gt; = disabled (PR #1111, #1124).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Gemma 4 nested tool arguments.&lt;/b&gt; Correctly parse Gemma 4 tool calls whose arguments contain nested objects (PR #1102).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;pflash compression visibility.&lt;/b&gt; Surface the previously-silent endpoints-only compression collapse so a degraded pflash configuration is no longer hidden (PR #1106).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Dependency hygiene.&lt;/b&gt; Exclude the broken &lt;code&gt;mlx-vlm 0.6.4&lt;/code&gt; from all extras (PR #1119).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.10.10 — 2026-07-15 · Ternary Bonsai 27B + Qwen3-Coder-Next 80B</title>
    <link href="https://rapidmlx.com/changelog/0.10.10"/>
    <id>https://rapidmlx.com/changelog/0.10.10</id>
    <published>2026-07-15T12:00:00Z</published>
    <updated>2026-07-15T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Ternary Bonsai 27B — new flagship small-footprint model. bonsai-27b-2bit is a 2-bit ternary Qwen 3.5-class 27B that packs into 7.9 GB and runs on a 16 GB Mac (~46 tok/s on M3 Ultra). The quant is stock MLX 2-bit affine — no custom kernel — and it…</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Ternary Bonsai 27B — new flagship small-footprint model.&lt;/b&gt; &lt;code&gt;bonsai-27b-2bit&lt;/code&gt; is a 2-bit ternary Qwen 3.5-class 27B that packs into 7.9&amp;nbsp;GB and runs on a 16&amp;nbsp;GB Mac (~46&amp;nbsp;tok/s on M3 Ultra). The quant is &lt;b&gt;stock MLX 2-bit affine&lt;/b&gt; — no custom kernel — and it loads through the mlx-lm text path (served text-only via the &lt;code&gt;is_text_only&lt;/code&gt; profile flag to sidestep an mlx-vlm SSM bug, even though the config declares a vision tower). Strong on the mainstream: code, math, reasoning, EN/ZH general writing, and agent/framework tool-calling (verified end-to-end with the OpenAI SDK, LangChain, pydantic-ai, smolagents CodeAgent, and Aider). Known limitation: strict Chinese classical regulated verse (五言绝句 with fixed rhyme) can trip a repetition loop — a niche edge case. Weights are on the &lt;a href=&quot;https://models.rapidmlx.com/prism-ml/Ternary-Bonsai-27B-mlx-2bit/&quot;&gt;R2 mirror&lt;/a&gt;.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Qwen3-Coder-Next 80B — new coder family SKUs.&lt;/b&gt; Added &lt;code&gt;qwen3-coder-next-80b-4bit&lt;/code&gt; (44.8&amp;nbsp;GB) and &lt;code&gt;qwen3-coder-next-80b-8bit&lt;/code&gt; (84.7&amp;nbsp;GB), the 80B-A3B Coder-Next MoE at 4-bit and 8-bit MLX with the &lt;code&gt;qwen3_coder_xml&lt;/code&gt; tool-call parser. HF-pull (not yet on the R2 mirror). See the &lt;a href=&quot;/docs/aliases.html#text-families&quot;&gt;alias reference&lt;/a&gt;.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;KV-cache export / import.&lt;/b&gt; Serialize a warmed prompt-prefix KV cache to disk and re-hydrate it on a later serve, so a long shared system prompt / document context is paid for once rather than re-prefilled every session.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Gemma 4 hardening.&lt;/b&gt; Correctness and stability fixes to the vendored Gemma 4 text path.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Release-infra hardening.&lt;/b&gt; Toughened the auto-release / version-bump pipeline so version markers and the PyPI + Homebrew publish steps stay in lockstep.&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.10.9 — 2026-07-12 · share serve-flag passthrough + MTP K=3 default</title>
    <link href="https://rapidmlx.com/changelog/0.10.9"/>
    <id>https://rapidmlx.com/changelog/0.10.9</id>
    <published>2026-07-12T12:00:00Z</published>
    <updated>2026-07-12T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Systematic serve-flag passthrough over share. rapid-mlx share &lt;model&gt; -- &lt;serve flags&gt; now forwards everything after a literal -- verbatim to the rapid-mlx serve that share spawns (the git / cargo / kubectl end-of-options idiom), so every serve flag…</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Systematic serve-flag passthrough over &lt;code&gt;share&lt;/code&gt;.&lt;/b&gt; &lt;code&gt;rapid-mlx share &amp;lt;model&amp;gt; -- &amp;lt;serve flags&amp;gt;&lt;/code&gt; now forwards everything after a literal &lt;code&gt;--&lt;/code&gt; verbatim to the &lt;code&gt;rapid-mlx serve&lt;/code&gt; that share spawns (the git / cargo / kubectl end-of-options idiom), so every serve flag works over the tunnel without share re-declaring each one. A prefix-aware denylist keeps share-owned flags (&lt;code&gt;--host&lt;/code&gt; / &lt;code&gt;--api-key&lt;/code&gt; / &lt;code&gt;--port&lt;/code&gt; / &lt;code&gt;--listen-fd&lt;/code&gt; / &lt;code&gt;--log-level&lt;/code&gt;) from being forwarded, preventing accidental LAN re-exposure or API-key override (PR #1096).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Spec-decode over share is opt-in, MTP K=3 by default.&lt;/b&gt; Speculative decoding stays off by default across a share; opt in per-share with &lt;code&gt;-- --force-spec-decode --speculative-config '{&quot;method&quot;:&quot;mtp&quot;}'&lt;/code&gt;. When &lt;code&gt;--force-spec-decode&lt;/code&gt; is set, MTP defaults to K=3 unless you pass an explicit &lt;code&gt;num_speculative_tokens&lt;/code&gt; (&lt;code&gt;--mtp-max-k&lt;/code&gt; and &lt;code&gt;--speculative-config&lt;/code&gt; are mutually exclusive).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.10.8 — 2026-07-11 · HY3 native MTP (opt-in self-speculative decoding)</title>
    <link href="https://rapidmlx.com/changelog/0.10.8"/>
    <id>https://rapidmlx.com/changelog/0.10.8</id>
    <published>2026-07-11T12:00:00Z</published>
    <updated>2026-07-11T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>HY3 native MTP — opt-in self-speculative decoding. Hunyuan 3's built-in 3.8B MTP head (a DeepSeek-V3-style prediction layer that the 4-bit conversion had stripped) is re-extracted into a sidecar and wired into the vendored spec-decode installer…</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;HY3 native MTP — opt-in self-speculative decoding.&lt;/b&gt; Hunyuan 3's built-in 3.8B MTP head (a DeepSeek-V3-style prediction layer that the 4-bit conversion had stripped) is re-extracted into a sidecar and wired into the vendored spec-decode installer, giving HY3 factory-trained self-speculative drafting with no separate draft model (PR #1094). It is &lt;b&gt;off by default&lt;/b&gt; — enable per serve with &lt;code&gt;--force-spec-decode --speculative-config '{&quot;method&quot;:&quot;mtp&quot;}'&lt;/code&gt;. On M3 Ultra the head currently measures roughly break-even-to-slightly-slower on decode throughput (draft accept ~52–74% at K=3 doesn't overcome the per-step draft + verify cost), so plain autoregressive decode stays the default and recommended path.&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.10.7 — 2026-07-10 · Long-run OOM fix, Hunyuan 3 + Liquid</title>
    <link href="https://rapidmlx.com/changelog/0.10.7"/>
    <id>https://rapidmlx.com/changelog/0.10.7</id>
    <published>2026-07-10T12:00:00Z</published>
    <updated>2026-07-10T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Community contributors: @66Ton99 — idle Responses SSE heartbeats (#1061); @MaXoS-Agent and @wparuch — Apple M2 Max community benchmarks (#1065, #1068); @ShiroKSH — TurboQuant Metal packaging (#1086). Long-run Metal OOM fixed. The scheduler no longer…</summary>
    <content type="html">&lt;p&gt;&lt;b&gt;Community contributors:&lt;/b&gt;
      &lt;a href=&quot;https://github.com/66Ton99&quot;&gt;@66Ton99&lt;/a&gt; — idle Responses SSE heartbeats
      (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1061&quot;&gt;#1061&lt;/a&gt;);
      &lt;a href=&quot;https://github.com/MaXoS-Agent&quot;&gt;@MaXoS-Agent&lt;/a&gt; and
      &lt;a href=&quot;https://github.com/wparuch&quot;&gt;@wparuch&lt;/a&gt; — Apple M2 Max community benchmarks
      (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1065&quot;&gt;#1065&lt;/a&gt;,
      &lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1068&quot;&gt;#1068&lt;/a&gt;);
      &lt;a href=&quot;https://github.com/ShiroKSH&quot;&gt;@ShiroKSH&lt;/a&gt; — TurboQuant Metal packaging
      (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/1086&quot;&gt;#1086&lt;/a&gt;).
    &lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Long-run Metal OOM fixed.&lt;/b&gt; The scheduler no longer caches non-trimmable GatedDeltaNet recurrent state in the reuse cache, so long-lived / high-concurrency sessions stop leaking Metal memory and eventually hitting an OOM. The load-bearing stability win of the release (PR #1075, fixes #1025 and the #1058 leak).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Hunyuan 3 (HY3) — new vendor family (Ultra-only preview).&lt;/b&gt; Day-one support for Tencent's Hunyuan 3, a 295B-total / 21B-active MoE with a 3.8B MTP head. &lt;b&gt;Ultra-only:&lt;/b&gt; peak resident memory is ~156&amp;nbsp;GB, so it requires an M3 Ultra with 256&amp;nbsp;GB unified memory and will not fit smaller Macs. Alias &lt;code&gt;hy3-preview-4bit&lt;/code&gt; (4-bit MLX) with a dedicated &lt;code&gt;hy_v3&lt;/code&gt; tool-call + reasoning parser (PR #1070).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Tool-call parser coverage expansion.&lt;/b&gt; New parser families so tool-calling works across more of the catalog: LiquidAI LFM2.x (&lt;code&gt;lfm&lt;/code&gt;), Mistral / Devstral / Ministral (&lt;code&gt;mistral&lt;/code&gt;), DeepSeek-Coder-V2-Lite (&lt;code&gt;deepseek_v3&lt;/code&gt;), and NVIDIA Nemotron (fail-open). Ported from the vLLM / SGLang reference parsers rather than hand-rolled.&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.10.5 — 2026-07-08 · Fix batch</title>
    <link href="https://rapidmlx.com/changelog/0.10.5"/>
    <id>https://rapidmlx.com/changelog/0.10.5</id>
    <published>2026-07-08T12:00:00Z</published>
    <updated>2026-07-08T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Spec-decode unified interface migration. Legacy _install_mtp installer removed (−475 LOC dead code) — every MTP path now flows through the vendored installer that was already the live runtime. mtp_optimistic is hard-rejected at all three entry…</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Spec-decode unified interface migration.&lt;/b&gt; Legacy &lt;code&gt;_install_mtp&lt;/code&gt; installer removed (−475 LOC dead code) — every MTP path now flows through the vendored installer that was already the live runtime. &lt;code&gt;mtp_optimistic&lt;/code&gt; is hard-rejected at all three entry points (&lt;code&gt;SchedulerConfig.__post_init__&lt;/code&gt;, &lt;code&gt;server.load_model&lt;/code&gt;, CLI normalizer) so misuse fails loud instead of silently ignoring the flag. &lt;code&gt;spec_decode='suffix'&lt;/code&gt; is preserved as a canonical value; &lt;code&gt;mtp_max_k&lt;/code&gt; conflict detection is now idempotent for the disabled default. Matched-vendored bench on Qwen3.6-27B-4bit + MTP sidecar (90 requests × 3 runs) confirmed behavior parity: tok/s median 43.83 → 46.03 (+5.0% noise), MTP rounds 17704 → 17619 (0.5% delta), finish reasons 59/31 → 60/30 (PR #1050).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;README trim.&lt;/b&gt; Slimmed from 1142 → ~280 lines. Each trimmed section carries a → link to the specific docs page anchor instead of losing content silently (PR #1054).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;install.sh Tier-1 refresh.&lt;/b&gt; &lt;code&gt;RECOMMENDED_MODEL&lt;/code&gt; now maps to the 0.10 Tier-1 families (gpt-oss-120b · qwen3.6-35b-a3b · gpt-oss-20b · qwen3.5-4b fallback). Canonical URLs migrated to &lt;code&gt;rapidmlx.com&lt;/code&gt; across the script (PR #1053).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;HF → R2 mirror tool.&lt;/b&gt; New &lt;code&gt;scripts/mirror_to_r2.py&lt;/code&gt; handles streaming multipart mirrors of gated / large model weights (used to seed gpt-oss-120b MXFP4-Q8 and Qwen3.6-{27,35}B-MTP-4bit into R2). Bench / maintenance tooling only, not a runtime dependency (PR #1056).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;OpenHands integration harness.&lt;/b&gt; Corrected the gpt-oss XFAIL reason (CodeActAgent parses text-action XML tags; gpt-oss emits harmony analysis + final channels — the format mismatch, not a stop-scoping bug). Docker digest handling in the harness now uses a two-ref pattern that avoids the OpenHands 0.9.0 &lt;code&gt;base_image.split(':')&lt;/code&gt; bug on 3-way digest tags (PR #1055, tracked upstream at &lt;a href=&quot;https://github.com/All-Hands-AI/OpenHands/issues/15167&quot;&gt;All-Hands-AI/OpenHands#15167&lt;/a&gt;).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.10.3 — 2026-07-07 · Integrations + parser fixes</title>
    <link href="https://rapidmlx.com/changelog/0.10.3"/>
    <id>https://rapidmlx.com/changelog/0.10.3</id>
    <published>2026-07-07T12:00:00Z</published>
    <updated>2026-07-07T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Harmony parser final-channel stop scoping. User-supplied stop= sequences now only match against the harmony final channel, so gpt-oss on CodeActAgent no longer prematurely truncates when a stop token appears inside the analysis channel. Unblocks…</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Harmony parser final-channel stop scoping.&lt;/b&gt; User-supplied &lt;code&gt;stop=&lt;/code&gt; sequences now only match against the harmony final channel, so gpt-oss on CodeActAgent no longer prematurely truncates when a stop token appears inside the analysis channel. Unblocks gpt-oss under OpenHands / Aider (PR #1051, closes #1049).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Real Aider bash-CLI integration harness.&lt;/b&gt; Four Tier-1 family × Aider cells were un-xfailed after wiring a live &lt;code&gt;aider --model openai/&amp;lt;alias&amp;gt;&lt;/code&gt; harness that actually issues a code-edit round-trip (PR #1047).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Real OpenHands Docker E2E harness.&lt;/b&gt; CodeActAgent runs against &lt;code&gt;ghcr.io/all-hands-ai/openhands:0.9.0&lt;/code&gt; with a digest-pinned runtime image; three of four Tier-1 cells un-xfailed (gpt-oss cell still XFAIL — see the 0.10.5 note above) (PR #1048).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;R2 mirror bypass fixes.&lt;/b&gt; &lt;code&gt;jlens&lt;/code&gt; and &lt;code&gt;bench&lt;/code&gt;/&lt;code&gt;bench --submit&lt;/code&gt; now honor the R2 mirror before falling back to Hugging Face — matching what &lt;code&gt;serve&lt;/code&gt; and &lt;code&gt;pull&lt;/code&gt; already did (PRs #1045, #1046).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Spec-decode unified interface (staging).&lt;/b&gt; MTP moved onto the vLLM-style &lt;code&gt;speculative_config&lt;/code&gt; plumbing that &lt;code&gt;#1050&lt;/code&gt; then completes in 0.10.5 (PR #1044, operator lane).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.10.2 — 2026-07-07 · Interpretability</title>
    <link href="https://rapidmlx.com/changelog/0.10.2"/>
    <id>https://rapidmlx.com/changelog/0.10.2</id>
    <published>2026-07-07T12:00:00Z</published>
    <updated>2026-07-07T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>rapid-mlx jlens — read a model's internal draft. A read-only Jacobian-lens command that decodes what a model is disposed to say at every layer, reports where the answer crystallizes (early-exit headroom) and how far ahead of the logit lens it reads.…</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;&lt;code&gt;rapid-mlx jlens&lt;/code&gt; — read a model's internal draft.&lt;/b&gt; A read-only Jacobian-lens command that decodes what a model is disposed to say at every layer, reports where the answer crystallizes (early-exit headroom) and how far ahead of the logit lens it reads. Runs locally on quantized MLX models via a Jacobian–vector product — the full &lt;code&gt;d×d&lt;/code&gt; Jacobian is never materialized and it differentiates through 4/8-bit weights. Follows Anthropic's &lt;a href=&quot;https://transformer-circuits.pub/2026/workspace/index.html&quot;&gt;Global Workspace&lt;/a&gt; work. Supports dense decoders (Qwen3, Llama, Phi); linear-attention / hybrid and VLM vision towers are flagged as unsupported rather than crashing. &lt;code&gt;--verbose&lt;/code&gt; adds per-layer ranked readouts + the answer's rank trajectory; &lt;code&gt;--json&lt;/code&gt; for machine output.&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.10.1</title>
    <link href="https://rapidmlx.com/changelog/0.10.1"/>
    <id>https://rapidmlx.com/changelog/0.10.1</id>
    <published>2026-07-05T12:00:00Z</published>
    <updated>2026-07-05T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Version hygiene. Reverted an accidental early 0.10.1 bump from #1010 and re-tagged cleanly (PRs #1020, #1021). No functional change.</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Version hygiene.&lt;/b&gt; Reverted an accidental early 0.10.1 bump from #1010 and re-tagged cleanly (PRs #1020, #1021). No functional change.&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.10.0</title>
    <link href="https://rapidmlx.com/changelog/0.10.0"/>
    <id>https://rapidmlx.com/changelog/0.10.0</id>
    <published>2026-07-04T12:00:00Z</published>
    <updated>2026-07-04T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Community contributor: @wuwangzhang1216 — Codex namespace tool groups on the Responses API (#993). Codex tool groups on /v1/responses. The Responses endpoint now accepts Codex namespace tool groups, fixing tool-call handling for Codex-style clients…</summary>
    <content type="html">&lt;p&gt;&lt;b&gt;Community contributor:&lt;/b&gt;
      &lt;a href=&quot;https://github.com/wuwangzhang1216&quot;&gt;@wuwangzhang1216&lt;/a&gt; —
      Codex namespace tool groups on the Responses API
      (&lt;a href=&quot;https://github.com/raullenchai/Rapid-MLX/pull/993&quot;&gt;#993&lt;/a&gt;).
    &lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Codex tool groups on &lt;code&gt;/v1/responses&lt;/code&gt;.&lt;/b&gt; The Responses endpoint now accepts Codex namespace tool groups, fixing tool-call handling for Codex-style clients (PR #993).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.9.14</title>
    <link href="https://rapidmlx.com/changelog/0.9.14"/>
    <id>https://rapidmlx.com/changelog/0.9.14</id>
    <published>2026-07-04T12:00:00Z</published>
    <updated>2026-07-04T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>OpenAI reasoning_effort translation. The reasoning_effort request field is now translated at the route layer, so OpenAI-shaped clients that set it map cleanly onto the engine's reasoning controls (PR #1009, closes #448).</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;OpenAI &lt;code&gt;reasoning_effort&lt;/code&gt; translation.&lt;/b&gt; The &lt;code&gt;reasoning_effort&lt;/code&gt; request field is now translated at the route layer, so OpenAI-shaped clients that set it map cleanly onto the engine's reasoning controls (PR #1009, closes #448).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.9.13</title>
    <link href="https://rapidmlx.com/changelog/0.9.13"/>
    <id>https://rapidmlx.com/changelog/0.9.13</id>
    <published>2026-07-04T12:00:00Z</published>
    <updated>2026-07-04T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Gemma-4 MTP sidecar CLI. New --mtp-sidecar flag plus an eligibility gate for Gemma-4 speculative decoding — the CLI-facing half of the 0.9.13 MTP work (PR #1000).</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Gemma-4 MTP sidecar CLI.&lt;/b&gt; New &lt;code&gt;--mtp-sidecar&lt;/code&gt; flag plus an eligibility gate for Gemma-4 speculative decoding — the CLI-facing half of the 0.9.13 MTP work (PR #1000).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.9.12</title>
    <link href="https://rapidmlx.com/changelog/0.9.12"/>
    <id>https://rapidmlx.com/changelog/0.9.12</id>
    <published>2026-07-02T12:00:00Z</published>
    <updated>2026-07-02T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Gemma-4 MTP drafter, stabilized. The 0.9.11 assistant-drafter inject was reverted (PR #997) and re-landed in a polished form (PR #998), so Gemma-4 speculative decoding runs without the first-cut rough edges.</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Gemma-4 MTP drafter, stabilized.&lt;/b&gt; The 0.9.11 assistant-drafter inject was reverted (PR #997) and re-landed in a polished form (PR #998), so Gemma-4 speculative decoding runs without the first-cut rough edges.&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.9.11</title>
    <link href="https://rapidmlx.com/changelog/0.9.11"/>
    <id>https://rapidmlx.com/changelog/0.9.11</id>
    <published>2026-07-02T12:00:00Z</published>
    <updated>2026-07-02T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Gemma-4 speculative decoding (MTP). Google's official assistant-drafter inject plus a Gemma-4 entry in the MTP allowlist (PRs #990 + #988) — faster Gemma-4 generation with byte-identical output. Scheduler prefix-cache fix. On an exact prompt-cache…</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Gemma-4 speculative decoding (MTP).&lt;/b&gt; Google's official assistant-drafter inject plus a Gemma-4 entry in the MTP allowlist (PRs #990 + #988) — faster Gemma-4 generation with byte-identical output.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Scheduler prefix-cache fix.&lt;/b&gt; On an exact prompt-cache hit the cache is trimmed by one token to prevent a duplicate KV entry (PR #994).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;CLI audio aliases.&lt;/b&gt; &lt;code&gt;rapid-mlx pull&lt;/code&gt; / &lt;code&gt;rm&lt;/code&gt; now resolve audio aliases (PR #992).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.9.10</title>
    <link href="https://rapidmlx.com/changelog/0.9.10"/>
    <id>https://rapidmlx.com/changelog/0.9.10</id>
    <published>2026-07-01T12:00:00Z</published>
    <updated>2026-07-01T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Whisper silence-hallucination guard. A Silero VAD pre-trim strips the silent lead-in so STT stops inventing text over quiet audio (PR #980). Tool-call argument normalization. Assistant tool_call.arguments is coerced to a dict at the chat-template…</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Whisper silence-hallucination guard.&lt;/b&gt; A Silero VAD pre-trim strips the silent lead-in so STT stops inventing text over quiet audio (PR #980).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Tool-call argument normalization.&lt;/b&gt; Assistant &lt;code&gt;tool_call.arguments&lt;/code&gt; is coerced to a dict at the chat-template boundary, fixing downstream shape mismatches (PR #981).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Qwen3-Coder XML streaming.&lt;/b&gt; The streaming parser now anchors on &lt;code&gt;&amp;lt;function=…&amp;gt;&lt;/code&gt; instead of the &lt;code&gt;&amp;lt;tool_call&amp;gt;&lt;/code&gt; wrapper (PR #979).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Anthropic adapter.&lt;/b&gt; Non-leading &lt;code&gt;system&lt;/code&gt; messages are merged before the chat template is applied (PR #976).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Server flags.&lt;/b&gt; &lt;code&gt;python -m vllm_mlx.server&lt;/code&gt; now threads TurboQuant flags into &lt;code&gt;SchedulerConfig&lt;/code&gt; (PR #983).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;README&lt;/b&gt; audited and rewritten for clarity and value-prop (PR #601).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.9.9 — 2026-06-30 · Multi-user &amp;amp; long-context release</title>
    <link href="https://rapidmlx.com/changelog/0.9.9"/>
    <id>https://rapidmlx.com/changelog/0.9.9</id>
    <published>2026-06-30T12:00:00Z</published>
    <updated>2026-06-30T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Compressed KV cache by default on 9 hero MoE aliases — Qwen3.5-9B / 27B and the Qwen3.6-35B-A3B family (4 / 6 / 8-bit + DWQ). Roughly 2× more concurrent users at the same RAM budget, with byte-identical output vs the uncompressed baseline.…</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Compressed KV cache by default on 9 hero MoE aliases&lt;/b&gt; — Qwen3.5-9B / 27B and the Qwen3.6-35B-A3B family (4 / 6 / 8-bit + DWQ). Roughly 2× more concurrent users at the same RAM budget, with byte-identical output vs the uncompressed baseline.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Radix-tree prefix cache is default-on.&lt;/b&gt; Concurrent requests that share a system prompt (IDE assistants, Cursor / Claude Code / Aider fleets, multi-user chat) reuse the KV automatically. Verified 13× aggregate throughput at 10 concurrent clients.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;128k context on Qwen3.5-9B out of the box.&lt;/b&gt; No flag flips — the alias resolves to the model's native 256k position-embedding cap.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Speculative decoding (MTP + DFlash) is lossless when enabled.&lt;/b&gt; Byte-identical output verified vs the non-spec baseline. MTP works with the &lt;code&gt;qwen3.5-9b-mtp-4bit&lt;/code&gt; sidecar; DFlash works with &lt;code&gt;qwen3.5-27b-8bit&lt;/code&gt; + the z-lab drafter.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;DFlash is now flag-gated as experimental.&lt;/b&gt; Install with &lt;code&gt;pip install 'rapid-mlx[dflash]'&lt;/code&gt;, enable with &lt;code&gt;--enable-dflash&lt;/code&gt;. Measured 1.4× pooled speedup on Qwen3.5-27B-8bit — the previously advertised 3.5× number was from a broken bench and has been corrected here.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Long-running session stability verified.&lt;/b&gt; 8+ hour agent loops show flat memory (±1% RSS drift over 8 h, 2,878 turns).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;GLM-5.2 removed from the roadmap.&lt;/b&gt; Both offline GGUF → MLX conversion attempts (Q2_K and Q3_K_M sources) landed a working load path but the model produced incoherent output on this REAP-50-pruned checkpoint.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Config.&lt;/b&gt; New CLI flag &lt;code&gt;--kv-cache-turboquant none&lt;/code&gt; opts out of the compressed KV cache on a per-server basis. Default is per-alias auto.&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.8.19</title>
    <link href="https://rapidmlx.com/changelog/0.8.19"/>
    <id>https://rapidmlx.com/changelog/0.8.19</id>
    <published>2026-06-25T12:00:00Z</published>
    <updated>2026-06-25T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Tmax-27B hybrid-cache fix. is_hybrid: true on all Tmax-27B variants — was incorrectly false in 0.8.18, which corrupted the RNN state on prefix-cache hits (PR #902). Responses item shape defaults to type: &quot;message&quot; when role+content are present (PR…</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Tmax-27B hybrid-cache fix.&lt;/b&gt; &lt;code&gt;is_hybrid: true&lt;/code&gt; on all Tmax-27B variants — was incorrectly &lt;code&gt;false&lt;/code&gt; in 0.8.18, which corrupted the RNN state on prefix-cache hits (PR #902).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Responses item shape&lt;/b&gt; defaults to &lt;code&gt;type: &quot;message&quot;&lt;/code&gt; when role+content are present (PR #904).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;thinking accounting.&lt;/b&gt; &lt;code&gt;enable_thinking&lt;/code&gt; now threads into prompt accounting on the chat + responses paths so reasoning models report token usage correctly (PR #906, follow-up to #891).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Auto-config routing.&lt;/b&gt; V4 / V5 model-type detection aligned with the alias classifier (PR #903).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;CLI&lt;/b&gt;: &lt;code&gt;rapid-mlx serve&lt;/code&gt; now exits non-zero on a port-already-in-use error (PR #905).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;CI&lt;/b&gt;: pr_validate full_unit flakes on macOS uv-managed Python fixed (PR #907).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.8.18</title>
    <link href="https://rapidmlx.com/changelog/0.8.18"/>
    <id>https://rapidmlx.com/changelog/0.8.18</id>
    <published>2026-06-24T12:00:00Z</published>
    <updated>2026-06-24T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Tmax-9B + Tmax-27B aliases added. First-mover MLX support — see the Tmax docs page (PR #899). tool_call promotion in reasoning ported from upstream into the refactored think_parser (closes #344, PRs #896 + #898). Auto-disable thinking on casual chat…</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Tmax-9B + Tmax-27B aliases added.&lt;/b&gt; First-mover MLX support — see the &lt;a href=&quot;/docs/models/tmax.html&quot;&gt;Tmax docs page&lt;/a&gt; (PR #899).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;tool_call promotion in reasoning&lt;/b&gt; ported from upstream into the refactored think_parser (closes #344, PRs #896 + #898).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Auto-disable thinking&lt;/b&gt; on casual chat completions (matches the M-2 / #891 pattern, PR #895).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Auto-disable thinking when tools are provided&lt;/b&gt; — strict-JSON pattern carried over to reasoning models (PR #891).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Audio&lt;/b&gt;: &lt;code&gt;_serve_audio_mode&lt;/code&gt; now honours &lt;code&gt;--embedding-model&lt;/code&gt; and &lt;code&gt;--served-model-name&lt;/code&gt; (closes R11-K #258, PR #894).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Tool parser&lt;/b&gt;: prevent &lt;code&gt;deepseek_v3&lt;/code&gt; parser from binding to non-V3 Qwen2 distills + warn on misbind (PR #887).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Tempfile leak fix&lt;/b&gt;: &lt;code&gt;managed_tempfile&lt;/code&gt; helper applied across leak sites (closes #719, PR #888).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Strict JSON schema retry&lt;/b&gt; on context-length re-check before the repair retry (closes #267b, PR #886).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.8.16</title>
    <link href="https://rapidmlx.com/changelog/0.8.16"/>
    <id>https://rapidmlx.com/changelog/0.8.16</id>
    <published>2026-06-22T12:00:00Z</published>
    <updated>2026-06-22T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>/v1/models surfaces effective parsers. The tool_call_parser and reasoning_parser the alias resolved to are now visible per model (V-1, S-2, PR #878). reasoning_content sanitization on the tool_choice=required path so the reasoning trace is not…</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;&lt;code&gt;/v1/models&lt;/code&gt; surfaces effective parsers.&lt;/b&gt; The &lt;code&gt;tool_call_parser&lt;/code&gt; and &lt;code&gt;reasoning_parser&lt;/code&gt; the alias resolved to are now visible per model (V-1, S-2, PR #878).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;reasoning_content sanitization&lt;/b&gt; on the &lt;code&gt;tool_choice=required&lt;/code&gt; path so the reasoning trace is not leaked into the tool-call output (V-2, PR #881).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.8.15</title>
    <link href="https://rapidmlx.com/changelog/0.8.15"/>
    <id>https://rapidmlx.com/changelog/0.8.15</id>
    <published>2026-06-21T12:00:00Z</published>
    <updated>2026-06-21T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Strict JSON schema mode enforced via post-generate validation + repair retry (closes #423, PR #873). Reasoning tail rescue: tail re-routed to content when finish_reason=length hits mid-reasoning (closes 8-round D-carry #259, PR #875). CLI: rapid-mlx…</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Strict JSON schema mode&lt;/b&gt; enforced via post-generate validation + repair retry (closes #423, PR #873).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Reasoning tail rescue&lt;/b&gt;: tail re-routed to &lt;code&gt;content&lt;/code&gt; when &lt;code&gt;finish_reason=length&lt;/code&gt; hits mid-reasoning (closes 8-round D-carry #259, PR #875).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;CLI&lt;/b&gt;: &lt;code&gt;rapid-mlx launch &amp;lt;client&amp;gt;&lt;/code&gt; — one-shot IDE bootstrap for Cursor, Claude Code, Aider, etc. (closes #566, PR #870).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;deepseek_v3 variant&lt;/b&gt; added for the R1-0528 family (PR #874).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Chat output&lt;/b&gt; always emits the &lt;code&gt;content&lt;/code&gt; key on the assistant message — fixes clients that throw on its absence (PR #872).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.8.14</title>
    <link href="https://rapidmlx.com/changelog/0.8.14"/>
    <id>https://rapidmlx.com/changelog/0.8.14</id>
    <published>2026-06-20T12:00:00Z</published>
    <updated>2026-06-20T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Responses streaming fix: exclude the reasoning-cutoff sentinel from downstream_output_seen — regression from PR #860 (PR #869). README documents the 0.8.13 audio support (TTS + STT, 26 aliases) (PR #868). Length-stop rescue stub for reasoning models…</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Responses streaming fix&lt;/b&gt;: exclude the reasoning-cutoff sentinel from &lt;code&gt;downstream_output_seen&lt;/code&gt; — regression from PR #860 (PR #869).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;README&lt;/b&gt; documents the 0.8.13 audio support (TTS + STT, 26 aliases) (PR #868).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Length-stop rescue stub&lt;/b&gt; for reasoning models restored after refactor (closes #858, PR #860).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>0.8.13 — 2026-06-19 · Audio launch</title>
    <link href="https://rapidmlx.com/changelog/0.8.13"/>
    <id>https://rapidmlx.com/changelog/0.8.13</id>
    <published>2026-06-19T12:00:00Z</published>
    <updated>2026-06-19T12:00:00Z</updated>
    <author><name>raullenchai</name></author>
    <summary>Audio support shipped. 26 aliases — 13 TTS (Kokoro, Chatterbox, VibeVoice, VoxCPM, Dia) and 13 STT (Whisper, Parakeet) — via /v1/audio/speech and /v1/audio/transcriptions. Install with pip install 'rapid-mlx[audio]'. Audio CLI: --audio-mode +…</summary>
    <content type="html">&lt;ul&gt;
      &lt;li&gt;&lt;b&gt;Audio support shipped.&lt;/b&gt; 26 aliases — 13 TTS (Kokoro, Chatterbox, VibeVoice, VoxCPM, Dia) and 13 STT (Whisper, Parakeet) — via &lt;code&gt;/v1/audio/speech&lt;/code&gt; and &lt;code&gt;/v1/audio/transcriptions&lt;/code&gt;. Install with &lt;code&gt;pip install 'rapid-mlx[audio]'&lt;/code&gt;.&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Audio CLI&lt;/b&gt;: &lt;code&gt;--audio-mode&lt;/code&gt; + comprehensive alias registry (R10-A, PR #854).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Responses&lt;/b&gt;: emit reasoning item on &lt;code&gt;max_output_tokens&lt;/code&gt; cutoff (R11-M-F1, PR #866).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Embeddings&lt;/b&gt;: &lt;code&gt;[embeddings]&lt;/code&gt; extra + 503 on missing model + &lt;code&gt;/v1/models&lt;/code&gt; visibility (H-08 + H-09 + H-13, PR #861).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;VLM penalties&lt;/b&gt;: frequency / presence / repetition penalties now pass through to the VLM sampler (closes #512, PR #864).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;Tool-choice=required&lt;/b&gt;: finalize invariant pinned in streaming (R11-V1 + R11-V2, PR #859).&lt;/li&gt;
      &lt;li&gt;&lt;b&gt;UI-TARS&lt;/b&gt;: accumulator-anchor + honour &lt;code&gt;enable_thinking=false&lt;/code&gt; (R10-F, PR #850).&lt;/li&gt;
    &lt;/ul&gt;</content>
  </entry>
</feed>
