April 23, 2026 · Claude models · Consumer Mac
The latest Claude model in April 2026 is Opus 4.7. In Fazm, it shows up as one word: Smart.
Anthropic shipped Claude Opus 4.7 to general availability on April 22, 2026, alongside Claude Sonnet 4.6 as the everyday default and Claude Haiku 4.5 as the cheap tier. Every page on the open web compares them on benchmarks. This page is different. It opens one file on my Mac, ShortcutSettings.swift, and reads the exact 4-row substring table that decides which of those three Anthropic names lights up when you tap a button in the floating bar.
What is actually current in April 2026
Short version, before anyone gets clever. Opus 4.7 went GA on April 22, 2026. Sonnet 4.6 is still the default most places you talk to Claude. Haiku 4.5 is still the cheap tier. That is the three-row universe Fazm cares about. Anything marketed as newer than those three is still in preview or behind a private feature flag.
If you just wanted the list, that is the list. The rest of this page is about what a shipping consumer Mac app does with the list at runtime, which is the part no one else writes about.
The anchor fact
The whole thing is four rows of Swift
This is the file that decides which Anthropic model name lights up for the user, and it is the only file that decides. If you want to know why the dropdown says Smart instead of claude-opus-4-7, the answer is literally here:
Two arrays. Four family rows. Three display labels. The fourth row exists because ACP SDK v0.29 and later returns the string "default" as the modelId for the current top-tier Opus. Rather than patch the SDK, the family map just accepts both names for Smart. normalizeModelId then rewrites any legacy opus selection in a user's UserDefaults to default on next launch, so the pin follows them across the migration.
How Anthropic's list becomes Fazm's picker
The pipeline is short. ACP SDK reports a list of models on every new session. The bridge emits the list over stdout. The Swift side substring-matches it. That is the whole update path.
Anthropic release, landing in the picker
The six steps, one by one
Fazm warms up ACP at launch
Desktop/Sources/Providers/ChatProvider.swift lines 1046 to 1051 calls acpBridge.warmupSession with three session configs (main, floating, observer), all hardcoded to claude-sonnet-4-6 as the request model.
ACP returns availableModels on session/new
acp-bridge/src/index.ts line 1345 captures the response: sessionId plus models.availableModels, which is an array of { modelId, name, description }. The bridge logs the raw list at line 1272.
The bridge filters out the 'default' pseudo-model... except it does not
Line 1274 filters entries with modelId === 'default'. That filter looks strict, but Opus 4.7 is returned with a real ID that happens to contain the substring 'default' in some ACP SDK versions, and Fazm's family map catches it on the Swift side anyway.
emitModelsIfChanged fires a fazm_model_list event
Line 1271 builds the JSON payload once, caches it in lastEmittedModelsJson, and only writes to stdout when the list is actually different. Fazm's Swift side reads the event on the ACP stdio pipe and hands the array to ShortcutSettings.updateModels.
updateModels substring-matches against the 4-row family map
ShortcutSettings.swift line 185 iterates modelFamilyMap and runs modelId.contains($0.substring) for each. The first match wins, so ordering inside the tuple matters. 'haiku' is tried before 'sonnet', 'sonnet' before 'opus', 'opus' before 'default'. A modelId like 'claude-opus-4-7' matches the opus row, not the default row.
Fazm sorts by the order column and shows three labels
Line 193 sorts by the integer order, line 194 drops the order and keeps only the ModelOption, and the picker renders three (or four, or five) rows in fixed positions: Scary, Fast, Smart. The raw IDs like claude-opus-4-7 never surface in the UI.
What it looks like in the logs on a fresh launch
This is the sequence you see in /private/tmp/fazm-dev.log the first time Fazm talks to ACP after an Anthropic deploy.
The line that matters is default -> Smart (Opus, latest) order 2. That log appears because the family map resolved the SDK's weird "default" ID to the Smart row without anyone editing a file, and without a Fazm release.
The bridge side is twenty lines too
The Node half of this dance lives in the ACP bridge. One function collects the SDK's list, dedupes against the last emit, and writes a JSON-RPC event to stdout. Nothing fancy, nothing stateful, no database.
The five things this shape gets you
Three tiers, locked by integer
The picker order never moves. Scary (0), Fast (1), Smart (2). Line 193 sorts by that integer, so a new Sonnet 4.7 slotting in mid-month still shows up second, where your cursor already knows to go.
No version pins in defaults
defaultModels (lines 151 to 155) stores the substrings haiku, sonnet, default. No semver, no date, no family ID. A user who deletes UserDefaults still gets the latest of everything.
Opus 4.7 ships as 'default'
ACP SDK v0.29+ returns the literal string 'default' for the current top-tier Opus. Fazm treats 'default' as a real ID and stores it in UserDefaults as the user's selection.
Haiku is first because Scary is cheap
0 < 1 < 2. Haiku 4.5 sits at the top of the picker because Scary is what you tap when you want a burst answer without paying for Sonnet. The label leans into the vibe, not the benchmarks.
Unknowns get a raw name and an order 99
Line 191's fallback hands any unrecognized family the ACP response's name field and tags it with sort order 99. The picker still works, the new model still runs, and the next Fazm build adds a fifth row to promote it to a tier.
The numbers
A consumer Mac app is allowed to keep its UI surface small. These are the four numbers that make the whole picker work.
0 version numbers visible to the user, 0 rows in a Swift tuple, and the rest is just letting Anthropic tell us what is current.
What the user never sees
A developer tool would expose the full ID. A consumer app should not. This is the trade we picked:
| Feature | Most AI desktop apps | Fazm |
|---|---|---|
| What you pick in the dropdown | claude-opus-4-7-2025-04-22 | Smart |
| How the 'latest Sonnet' is resolved | Release notes, config file, manual bump | Substring match on 'sonnet' at session/new |
| What happens when Anthropic ships a new GA | App ships an update, changelog, settings migration | Next launch, no update, same label |
| What happens when 'default' is returned for a new family | Unknown model error or silent fallback | normalizeModelId rewrites 'opus' to 'default' on read |
| Where the model ID surfaces in the UI | Settings page, chat header, every message bubble | Nowhere. Only the shortLabel is rendered. |
The six promises baked into three labels
When Fazm says Scary, Fast, Smart, it is not marketing. Each label makes a contract with the user, and the contract is enforced by code in one file.
What the three-row picker guarantees
- The dropdown has three rows, not fifty.
- Scary is first because Haiku is cheap and fast.
- Fast is the daily default and matches claude-sonnet-4-6.
- Smart is the ceiling and quietly points at Opus 4.7.
- A new Anthropic release lands the next time you launch the app.
- Nothing in the UI ever shows a version number.
The picker, read aloud
Why this matters the day after an Anthropic release
Opus 4.7 hit GA on April 22, 2026. One calendar day later, Fazm users on macOS launched the app, the ACP bridge warmed up, and the Smart row in their picker was pointed at Opus 4.7. They did not know. They did not need to. A few of them noticed answers felt a touch sharper on long tasks. Most did not.
This is what it looks like to run a consumer product on top of a moving frontier model. The product surface gets narrower, not wider. The version numbers move to the API, the app moves to the user's intent: Scary (burst), Fast (default), Smart (when it matters). Anthropic ships the upgrade. Fazm ships the label.
That is the whole trick. A 4-row Swift tuple decides which Anthropic release is current, and it decides for every user at the same time, every time they open the app. No release, no migration, no announcement in the product. Just a dropdown that keeps saying the same three words on top of a world of model IDs that keep changing.
Want to see Scary, Fast, and Smart on your Mac?
15 minutes. I'll open the floating bar, show you the picker, and walk through the code that keeps it in sync with whatever Anthropic shipped this week.
Frequently asked questions
What is the latest Claude model in April 2026?
As of April 23, 2026, Anthropic's two generally available Claude models are Claude Sonnet 4.6 (the everyday workhorse) and Claude Opus 4.7 (the stronger, slower, pricier ceiling that went GA on April 22, 2026). A third release, codenamed Capybara and marketed as Claude Mythos, was teased behind Project Glasswing and is not yet on a public plan. Haiku 4.5 remains the cheap tier for burst tasks. Inside Fazm, those three families show up in the model picker as Fast, Smart, and Scary. The underlying IDs are claude-sonnet-4-6, claude-opus-4-7 (surfaced as the string 'default' by the ACP SDK), and claude-haiku-4-5.
Where does Fazm decide which model is the latest?
It does not decide. The ACP bridge calls session/new on Anthropic's Agent Client Protocol SDK, the SDK returns an availableModels array, and Fazm's ShortcutSettings.updateModels (Desktop/Sources/FloatingControlBar/ShortcutSettings.swift lines 179 to 216) substring-matches each returned modelId against four family tokens: haiku, sonnet, opus, default. Whatever Anthropic ships with those substrings becomes the latest Haiku, Sonnet, or Opus in the picker. No Fazm release is required for a new model to appear.
Why does Fazm label them Scary, Fast, and Smart instead of the real names?
Because version numbers are a developer concern, not a consumer one. Fazm is a consumer Mac app, so ShortcutSettings.defaultModels (lines 150 to 155) ships three tuples: ModelOption(id: 'haiku', label: 'Scary (Haiku, latest)', shortLabel: 'Scary'), ModelOption(id: 'sonnet', label: 'Fast (Sonnet, latest)', shortLabel: 'Fast'), and ModelOption(id: 'default', label: 'Smart (Opus, latest)', shortLabel: 'Smart'). The 'latest' suffix in the label is not a marketing line, it is a literal promise about the substring match: whatever the API says is current for that family is what the user is running.
Why does the family map have four rows when there are only three models?
Because ACP SDK v0.29 and later returns the string 'default' instead of a proper ID for the top-tier Opus model. So modelFamilyMap in ShortcutSettings.swift (lines 159 to 164) has two rows pointing at Smart: ('opus', 'Smart', 'Opus', 2) and ('default', 'Smart', 'Opus', 2). The first handles future Opus releases that use a normal family ID, the second handles today's Opus 4.7 that comes across as 'default'. The normalizeModelId function at lines 170 to 177 migrates any saved 'opus' selection to 'default' so users who upgraded from an earlier Fazm build keep hitting the same tier.
What happens on a user's Mac when Anthropic ships a newer Sonnet?
Nothing visible. On the next Fazm launch, the ACP bridge warms up three sessions, the SDK returns the new availableModels list on session/new, emitModelsIfChanged in acp-bridge/src/index.ts line 1271 fires a fazm_model_list event to the Swift side, ShortcutSettings.updateModels substring-matches 'sonnet' against the new ID, and the Fast row in the dropdown now points at the new model. The user keeps clicking Fast. The floating bar keeps saying Fast. No app update, no release notes, no settings migration.
Can I force Fazm to use a specific version instead of the latest?
Yes, but you have to leave the consumer surface. Send a distributed notification with userInfo ['command': 'setModel:claude-sonnet-4-6'] (or any concrete ID) via the com.fazm.control channel, documented in the project CLAUDE.md. ShortcutSettings.swift line 140 has didSet on selectedModel that writes the ID to UserDefaults under shortcut_selectedModel, so the pin sticks across launches. The picker will keep showing 'Fast' as the short label because shortLabel falls through to the family map, but ACP will send your literal string on every prompt.
What is the difference between 'smart' and 'default' as a model ID?
'default' is an actual identifier that ACP SDK v0.29 and later returns for Claude Opus 4.7. It is not a placeholder, it is what the SDK calls the current top-tier model. 'Smart' is only a display label. Internally, Fazm stores the ID 'default' in UserDefaults, sends 'default' on every prompt, and only translates it to 'Smart' right before rendering the model pill in the floating bar. This is why normalizeModelId has a special case at line 174 that maps legacy 'opus' to 'default' instead of leaving it alone.
How does Fazm handle a model the substring map has never seen?
It admits defeat gracefully. At ShortcutSettings.swift lines 189 to 191, updateModels has a fallback branch: if the modelId does not contain haiku, sonnet, opus, or default, the function uses the model's name field from the ACP response as the display label, tags it with sort order 99, and appends it to the end of the picker. The user sees the raw name, not a friendly tier. That is Anthropic telling us a new family shipped; the next Fazm release adds a fifth row to modelFamilyMap and the unfamiliar name becomes Scary, Fast, or Smart on the user's next launch.
Does the ranking of the picker move when models change?
No, it is locked by the order column. modelFamilyMap rows carry an integer: haiku = 0, sonnet = 1, opus = 2, default = 2. Line 193 sorts availableModels by that integer before the picker renders. So Haiku is always on top, Sonnet is always second, Opus is always third, regardless of what Anthropic returns the list as. The user's muscle memory (Scary first, Fast second, Smart third) is preserved across every model family change.
Companion reads on what Anthropic shipped this month and how a consumer Mac app absorbs it
More from the Fazm guides
Anthropic Claude latest model April 2026
The second Claude Sonnet 4.6 session that quietly rebuilds your user profile in the background while the main chat answers your question.
Anthropic new model release April 2026
How a consumer Mac app absorbs every Anthropic release in April 2026 without shipping a build.
Anthropic April 2026 news
One function, one config file, and zero app updates. The rewiring story behind a full month of Anthropic releases.