POST APRIL 12, 2026 / SHIPPING-APP POINT OF VIEW

A new LLM ships, now what? How three aliases and one event turn any model release into same-day availability for a Mac app

After April 12, 2026, the top search results for model releases, new LLMs, and AI announcements are lists: GPT-6 shipped, Opus 4.7 went GA, Mythos Preview got a Glasswing partner program, Gemma 4 went open source. This page is not that list. It is the implementation problem underneath. If you build a consumer app that uses LLMs, the interesting question is not what shipped. It is how the thing that shipped becomes available to a user by dinner.

M
Matthew Diakonov
11 min read
4.9from Written from the Fazm source tree
ShortcutSettings.swift:152
ACPBridge.swift:1202
ChatProvider.swift:1048
AppState.swift:439
com.fazm.control

What actually shipped after April 12, 2026

For context, here is the honest list of shipping model releases and AI announcements in the days right after April 12, 2026. None of these are the point of this page, they are just the input signal a desktop app has to react to.

GPT-6
Claude Opus 4.7
Claude Mythos Preview
Gemma 4 31B
Qwen 3.6-Plus
GLM-5.1
Claude Haiku 4.5
Claude Sonnet 4.6

GPT-6 (OpenAI)

April 14, 2026. 2M token context. $2.50 / $12 per MTok. Proprietary.

Claude Opus 4.7 GA (Anthropic)

Same $5 / $25 Opus pricing as 4.6. 87.6% SWE-bench Verified, 94.2% GPQA, 3.3x higher-resolution vision.

Claude Mythos Preview

Gated behind Project Glasswing to roughly 50 partner organizations. Not public.

Gemma 4 31B Dense

Apache 2.0. Released earlier in April. Outperforms models 20x its size on reported benchmarks.

Qwen 3.6-Plus

1M token context. Agentic coding focus. Alibaba.

GLM-5.1

744B MoE. MIT license. Zhipu.

Benchmarks are as reported by each vendor; the ones that matter for an agent on a real Mac are tool-use reliability and instruction following, not vision resolution.

The problem nobody writing these lists mentions

A model release is a non-event to a user until an app they use actually picks it up. The usual path is: vendor announces, you update a constant somewhere in your client, you cut a release, you push to TestFlight / Sparkle / an app store, users update. Best case that is hours. With a Mac App Store review it can be days.

Fazm takes a different shape. Our model picker does not store model IDs. It stores three aliases. The runtime resolves the alias to whatever the SDK says is latest in that tier. Here is the comparison.

FeatureHardcoded model ID pickerFazm alias picker
What the client storesSpecific IDs like claude-opus-4-6, gpt-4o-2024-08-06Three aliases: haiku, sonnet, opus
How 'latest' is resolvedAt build time, from a constants fileAt runtime, via models_available event
Time from vendor release to user accessHours to days, requires new releaseSame day, no app update
UI labels shown to end usersClaude Opus 4.6 / GPT-4o / etc. (brand-based)Scary / Fast / Smart (tier-based)
When a vendor deprecates a specific IDQuery fails until the client updatesAlias falls through to next latest
When a model is gated (Mythos / Glasswing)Shown, then fails on invokeHidden from picker automatically

The anchor: three lines of Swift

The entire mechanism rests on a single table in Desktop/Sources/FloatingControlBar/ShortcutSettings.swift. Here is the literal source. Lines 151 through 154:

Desktop/Sources/FloatingControlBar/ShortcutSettings.swift

Three rows. That is the entire picker. The word latest in each label is not a marketing phrase. It reflects what actually happens: the alias is forwarded to the ACP SDK, which resolves it to whatever the current latest Haiku, Sonnet, or Opus model is at request time.

A reader can verify this directly. Open the file at that path, scroll to line 151, and the table is there.

How a new model ID actually reaches the picker

When the ACP bridge (a long-lived Node.js subprocess that speaks Anthropic's Agent Client Protocol) boots a session, it reports its available models back to the Swift layer as a JSON line on stdout. The Swift side parses it into a typed list, then merges it into the picker.

From vendor release to picker entry

VendorACP bridge (Node)ACPBridge.swiftShortcutSettingsUser UInew model ID resolvable by SDK{ type: 'models_available', models: [...] }onModelsAvailable(parsed)updateModels(acpModels)@Published availableModels changed

The two file-and-line references that matter here:

  • Desktop/Sources/Chat/ACPBridge.swift:1202 handles the .modelsAvailable(let models) case, parses the dictionary into (modelId, name, description) tuples, and calls onModelsAvailable.
  • Desktop/Sources/Providers/ChatProvider.swift:1016 installs that handler and forwards to ShortcutSettings.shared.updateModels(models).

Why the picker labels are not Claude-branded

Most LLM pickers surface the vendor's exact brand name to the user. Fazm does not. The short labels a user sees in the floating bar are Scary, Fast, and Smart. There is a reason for that that has consequences for how you should think about model releases.

Scary

Smallest, fastest, cheapest tier. 'Scary' because it is scary how little it costs to run and it is really meant for classification and routing, not generation. Maps to the Haiku family substring.

Fast

The default. Best speed-to-quality tradeoff. Maps to the Sonnet family substring. This is what the three ACP sessions (main, floating, observer) warm up with.

Smart

Largest, slowest, most expensive tier. Maps to the Opus family substring. The right pick when the agent has to chain tool calls over many turns.

Because the label is a tier, not a brand, a new model release inside that tier does not require any UI change. Opus 4.6 was Smart. Opus 4.7 is Smart. The next Opus will also be Smart. The user does not learn a new name every six weeks.

The flow of a single model release through the system

1

Vendor announces and enables the new model ID

Anthropic announces claude-opus-4-7. The API starts accepting it. Docs update. This is step zero from Fazm's perspective.

2

ACP bridge picks it up via SDK

The Node.js bridge uses Anthropic's published SDK. Next time it starts a session or checks models, the new ID appears in the model list it returns.

3

Bridge emits models_available

The bridge sends a JSON line: {type: 'models_available', models: [{modelId: 'claude-opus-4-7', name: 'Opus 4.7', description: ...}, ...]}. This is a stdout-to-stdin event, no HTTP.

4

ACPBridge.swift parses and forwards

At line 1202 of ACPBridge.swift, the .modelsAvailable case parses the array and calls onModelsAvailable with typed tuples.

5

ShortcutSettings.updateModels merges the list

modelFamilyMap matches 'opus' in 'claude-opus-4-7', keeps the user-friendly label 'Smart', and replaces the availableModels publisher.

6

UI re-renders, picker now offers the new model

SettingsPage and the floating bar's DetachedChatWindow both read availableModels via @Published, so they update without any explicit code.

7

User selects it, or does not

setModel:<id> either via the UI or via a distributed notification (see com.fazm.control in CLAUDE.md) routes the next query to the new model.

What this looks like from the outside

Because there is a distributed-notification control channel in the running app, you can watch the picker pick up a new model without opening the UI. Here is a session that does exactly that.

check picker state, then force a model switch
3

Lines of Swift that determine which LLM families a Fazm user can pick, today and for every release after April 12, 2026.

Desktop/Sources/FloatingControlBar/ShortcutSettings.swift, lines 152-154

Where the model sits in the rest of the agent

Picking a model is upstream of the interesting part of a desktop agent. The model receives not a screenshot but structured accessibility-tree text from the frontmost macOS app. Here is the shape of one turn, from the moment a user presses the shortcut.

a single Ask Fazm turn

Frontmost app
Floating bar
Selected tier
ACP bridge
Vendor LLM
Tool calls
Response

The hub in that diagram is the reason a new model release matters operationally. The hub resolves the user's tier selection to a model ID the moment a request is made. Vendor releases a better Opus at 10am? The 11am request uses it.

What a new model actually changes for a Mac agent

Not all model improvements hit the same part of the stack. Some matter a lot for screenshot-driven agents and almost nothing for accessibility-tree-driven ones.

Release features, ranked by how much they move the needle for Fazm

  • Tool-use reliability improvements (direct impact: long-running desktop tasks stop dropping mid-chain)
  • Instruction-following improvements (direct impact: 'don't close the draft, just reformat it' actually works)
  • Longer context windows (useful for reading long Mail threads, Figma files, and deep accessibility trees)
  • Higher-resolution vision (Opus 4.7's 3.3x gain; helpful for the capture_screenshot fallback path, not the default path)
  • Per-token price cuts (obvious: cheaper queries, same behavior)
  • Gated preview models (Mythos): zero impact until Glasswing opens up

The numbers that actually matter

0Aliases the picker stores
0App updates required for a new Opus / Sonnet / Haiku
0Line in ACPBridge.swift that handles models_available
0%Opus 4.7 SWE-bench Verified, as reported

How to apply this if you are shipping your own client

This pattern is not exotic and does not require a Mac. Any LLM client, web or native, can adopt it. The hard part is accepting that the vendor brand is not the unit of choice you expose to a user.

Rule of thumb

Pick the smallest set of tiers that capture the real tradeoff for your users. For most consumer use cases that is three: small-fast-cheap, balanced, largest-slowest-best. Call them whatever makes sense for your product. Resolve tier to model ID at request time, not at build time. Do not ship a release every time a vendor does.

Want to see a model release land in a real app in under a minute?

Book a 20-minute call; I will share the screen, run the com.fazm.control getState command before and after a model swap, and walk through ShortcutSettings.swift live.

Book a call

Frequently asked questions

What counts as a model release or AI announcement after April 12, 2026?

In the week following April 12, 2026, the notable shipping items are: GPT-6 (OpenAI, April 14, 2M token context, $2.50 / $12 per MTok, proprietary), Claude Opus 4.7 GA (Anthropic, at the same $5 / $25 Opus pricing as 4.6, with 87.6% SWE-bench Verified and 94.2% GPQA), Claude Mythos Preview (Anthropic, gated to about 50 Project Glasswing partners, no GA), Gemma 4 31B Dense (Google, Apache 2.0, April 2), Qwen 3.6-Plus (Alibaba, 1M context, agentic coding), and GLM-5.1 (Zhipu, 744B MoE, MIT). This page is not another list of those. It is about what a consumer Mac app has to do to actually serve a just-announced model to users the same day.

How does Fazm pick up a newly announced LLM without an app update?

Fazm's model picker stores three aliases, not specific model IDs. They are hardcoded as defaults in Desktop/Sources/FloatingControlBar/ShortcutSettings.swift on lines 152 through 154: ModelOption(id: 'haiku', label: 'Scary (Haiku, latest)'), ModelOption(id: 'sonnet', label: 'Fast (Sonnet, latest)'), and ModelOption(id: 'opus', label: 'Smart (Opus, latest)'). At runtime, the ACP SDK bridge emits a models_available event (handled in Desktop/Sources/Chat/ACPBridge.swift around line 1202) that carries whatever model IDs the server currently resolves those aliases to. ShortcutSettings.updateModels(_:) on line 179 merges that list into availableModels. No TestFlight build, no Sparkle update, no Mac App Store review.

Why did you name the aliases 'Scary', 'Fast', 'Smart' instead of Haiku, Sonnet, Opus?

The app is a consumer product, not a developer tool. A user picking between 'Scary', 'Fast', and 'Smart' immediately understands the tradeoff (small-fast-cheap / balanced / largest-slowest-best) without having to know which brand's model family they are in. The internal short labels live at Desktop/Sources/FloatingControlBar/ShortcutSettings.swift:200 (modelFamilyMap). Haiku maps to 'Scary' because it is the scary-cheap tier and exists mainly to classify or route requests quickly.

Does this work for non-Anthropic model releases too, like GPT-6 or Gemma 4?

Not automatically. The alias mapping in modelFamilyMap (ShortcutSettings.swift, line 158) is keyed on the substrings 'haiku', 'sonnet', and 'opus'. Any model family that matches one of those substrings in its model ID gets absorbed into the picker the next time models_available fires. Models from other vendors come in through separate MCP server or provider paths, not through this picker. For GPT-6, Gemma 4, Qwen 3.6-Plus, and GLM-5.1, the integration point is a different code path (MCP server config), not this alias table.

Why does Fazm pin Claude Sonnet 4.6 as the warmup default even though Opus 4.7 is available?

Three ACP sessions are pre-warmed with a specific model ID at Desktop/Sources/Providers/ChatProvider.swift lines 1048 through 1050 (main, floating, and observer, all 'claude-sonnet-4-6'). Sonnet is the right default for short-turn desktop work because it has the best speed-to-quality tradeoff for one-shot queries fired from a floating bar. The user is free to flip to 'opus' (which the runtime resolves to whatever 'latest Opus' currently is, i.e. 4.7) from the picker. The warmup default is a quality-of-first-response decision, not a ceiling.

Is this the same thing as an 'auto' model router that Anthropic or OpenAI offers?

No. Server-side auto routing picks a specific model for you based on the prompt. Fazm's alias picker is the user choosing a tier explicitly (Scary / Fast / Smart) and the client resolving that tier to the latest model in that tier. The user still controls the tradeoff. We also do not silently swap models mid-conversation, which is what auto-routing often does.

How fast does Fazm actually pick up a new model after an announcement?

As fast as the SDK behind the ACP bridge does. The ACP bridge is a Node.js process that uses Anthropic's published SDK; the moment that SDK's model list reflects a new release (e.g. opus 4.7 available), the next models_available event Fazm receives will contain it, and ShortcutSettings.updateModels drops it into the picker. For recent Opus-family releases this has been same-day. There is no Fazm-side cache, no polling interval tuning, no feature flag.

What does the desktop app actually do with the model once the user sends a query?

For native apps, Fazm does not screenshot. It reads the frontmost window with AXUIElementCreateApplication(frontApp.processIdentifier) and AXUIElementCopyAttributeValue(appElement, kAXFocusedWindowAttribute as CFString, &focusedWindow) at AppState.swift lines 439 through 441, turns that accessibility tree into structured text, and passes it to the selected model. That is why vision improvements in a new release (Opus 4.7's 3.3x higher-resolution vision, for example) matter less for Fazm than for screenshot-based agents. Structured AX text + a better instruction-following model is already the right shape.

If a model release is gated (like Mythos Preview / Project Glasswing), does Fazm still see it?

No. models_available only lists models the current account's credentials can actually call. Mythos is distributed to about 50 Project Glasswing partner organizations; if you are not one of them, it does not appear in your list and will not show up in Fazm's picker. This is correct behavior. Showing a model the user cannot actually invoke is worse than not showing it.

How can I verify Fazm actually switched to a new model after a release?

Fazm has a programmatic control channel. Send a com.fazm.control distributed notification with userInfo ['command': 'getState'] and it writes a JSON blob to /tmp/fazm-control-state.json containing model, modelLabel, and availableModels. You can set the model with userInfo ['command': 'setModel:claude-opus-4-6']. The full command table is in the project CLAUDE.md under 'Programmatic Control (com.fazm.control)'.