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.

M
Matthew Diakonov
7 min read
4.9from Mac users, Fazm beta
One release a day, zero app updates
Model picker labels: Scary, Fast, Smart
Works with any app on your Mac

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.

0GA Claude families
$0Opus 4.7 input $/Mtok
$0Opus 4.7 output $/Mtok
0Days since Opus 4.7 GA

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:

Desktop/Sources/FloatingControlBar/ShortcutSettings.swift

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

Anthropic
ACP SDK
session/new
ShortcutSettings
Scary
Fast
Smart

The six steps, one by one

1

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.

2

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.

3

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.

4

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.

5

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.

6

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.

fazm-dev.log · post-deploy cold start

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.

acp-bridge/src/index.ts · emitModelsIfChanged

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.

0Rows in the family map
0Distinct short labels
0Version numbers visible to the user
0App updates needed for a new Claude release

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:

FeatureMost AI desktop appsFazm
What you pick in the dropdownclaude-opus-4-7-2025-04-22Smart
How the 'latest Sonnet' is resolvedRelease notes, config file, manual bumpSubstring match on 'sonnet' at session/new
What happens when Anthropic ships a new GAApp ships an update, changelog, settings migrationNext launch, no update, same label
What happens when 'default' is returned for a new familyUnknown model error or silent fallbacknormalizeModelId rewrites 'opus' to 'default' on read
Where the model ID surfaces in the UISettings page, chat header, every message bubbleNowhere. 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

Scary · Haiku 4.5Fast · Sonnet 4.6Smart · Opus 4.7latest, by substring matchno app update requiredno semver in the UIno model ID in the pillfour rows in the family map

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.