April 16, 2026 · Opus 4.7 GA
A new Claude model shipped. Three rows of Swift delivered it.
Anthropic released Claude Opus 4.7 on a Thursday afternoon. By Thursday evening it was the default Smart option in the Fazm floating bar. No Fazm build shipped. No user action was required. The entire upgrade ran through a three-row substring table and a seven-line normalizer function that have been in the repo since January.
The release, in plain English
Anthropic moved Claude Opus 4.7 to general availability on April 16, 2026. It keeps the same hybrid reasoning model shape as Opus 4.6, adds a 1M context window, and pushes advanced software engineering scores higher than its predecessor. Pricing stayed at $5 input and $25 output per million tokens. The official announcement landed on anthropic.com/claude/opus the same day.
Every other guide on this release stops there, or lines up benchmarks next to Opus 4.6. The more interesting question, if you run Claude inside a consumer desktop app, is what actually happens on the user’s Mac the afternoon the new model ships. That is the question this page answers, using the Fazm source as a worked example.
The anchor fact
The Fazm model picker is driven by 0 rows of Swift
Not an enum. Not a JSON config. Not a server-side feature flag. A static three-row array at ShortcutSettings.swift:159 that substring-matches any Anthropic model ID against haiku, sonnet, or opus. When Opus 4.7 shipped, that table did not change. Only the ID feeding into it did.
The table, verbatim
Here is the code that decided what the Smart option meant on April 16. It was written months before Opus 4.7 existed and it did not need a single character changed to absorb the release.
There are two pieces of logic. The top is the label and sort table. The bottom is the normalizer that collapses any full model ID down to a family alias. That alias is what Fazm actually passes to the ACP agent, which means the user’s saved preference follows whatever the current Opus model is at request time.
How claude-opus-4-7 reaches the floating bar
What actually runs when you relaunch
The upgrade is not magic. It is a handful of messages flowing from the Anthropic SDK up through a Node bridge into Swift. Here is the sequence, with the exact file and line for each hop.
First session after an Anthropic release
The log line you would see
If you tail /private/tmp/fazm.log on the first relaunch after Opus 4.7 dropped, this is what the transition looks like. The important line is the one that starts with updated availableModels, emitted by ShortcutSettings.swift:198.
The full path, in order
Six steps from Anthropic’s ship announcement to the dropdown in your menu bar. None of them require a person to intervene.
Anthropic flips claude-opus-4-7 to GA
April 16, 2026. The new Opus ID begins returning 200s from api.anthropic.com. Pricing stays at $5 input and $25 output per million tokens, same tier as Opus 4.6. The SDK release notes land the same morning.
A Fazm user relaunches the app
The ACP bridge starts a new Node subprocess with @agentclientprotocol/claude-agent-acp version 0.29.2. The SDK's session/new response now includes claude-opus-4-7 in the availableModels list.
ACPBridge.swift parses models_available
At line 1131 the Swift bridge decodes the message, builds an array of (modelId, name, description) tuples, and forwards it to onModelsAvailable. The handler was registered inside ChatProvider.swift line 1016 during warmup.
ShortcutSettings.updateModels walks the list
For every new model ID, the function loops the three-row family map. claude-opus-4-7 contains the substring opus so it gets labeled Smart (Opus, latest) and a sort order of 2. Sonnet 4.6 and Haiku 4.5 keep their slots.
The @Published availableModels array reassigns
ShortcutSettings is an ObservableObject. Assigning a new ordered list to availableModels triggers SwiftUI invalidations across every view that reads it, including AIResponseView.swift line 1131 and SettingsPage.swift line 2025.
The floating bar shows Smart = Opus 4.7
The user opens the floating bar and taps the model picker. The Smart option is still Smart; the dropdown label now reads Smart (Opus, latest), with the underlying ID silently upgraded from claude-opus-4-6 to claude-opus-4-7. Next request uses the new model.
Five design choices that made the zero-build upgrade work
The reason the release landed quietly is not that the code is clever. It is that five small decisions, each made for a different reason, happened to compose well when Anthropic shipped a new model.
Three rows. That's it.
The modelFamilyMap in ShortcutSettings.swift is three tuples: haiku, sonnet, opus. No enum, no JSON config, no server fetch. A new model release only works if its ID contains one of those three words, which every Anthropic model always has.
Alias over ID
Fazm stores your selection as a short alias (sonnet) rather than a full version string. The ACP agent layer resolves the alias to the latest model in that family on every request, so upgrades are a no-op.
Substring, not regex
The match is String.contains, not a regex pattern. That choice lets Anthropic rename claude-opus-4-7 to claude-opus-5 and still have the check pass without changing a line of Swift.
Sort order is baked in
Each family has a display order (haiku = 0, sonnet = 1, opus = 2). When Anthropic ships a new family, it falls back to 99 and lands at the end of the dropdown until a build with a new row ships.
Zero network dependency
The model list is reported by the ACP SDK on session/new, not fetched from a Fazm server. Going offline does not break the picker. Anthropic shipping a new model while Fazm is running does not require Fazm to be reachable at all.
Aliased model IDs vs pinned model IDs
The tradeoff is not free. Aliases make upgrades invisible; pinned IDs make behavior reproducible. Fazm picks aliases everywhere except one flow (browser profile import) where reproducibility matters more than newness.
| Feature | Pinned ID (claude-sonnet-4-6) | Alias (sonnet) |
|---|---|---|
| New Anthropic model available | Stays on the pinned ID | Auto-upgrade on next session |
| Old model deprecated by Anthropic | Request returns 404 until code ships | Silent failover to the next family member |
| Bug reproduction against a specific model | Exact model in the code forever | Need logs to identify the actual ID used |
| Regression testing across releases | Deterministic by construction | Not deterministic |
| Where Fazm uses this | BrowserProfileMigrationManager.swift lines 324, 342, 358 | Main chat, floating bar, observer session (all three warmups) |
Why this matters outside Fazm
The interesting property is not that Fazm absorbed Opus 4.7 in an afternoon. It is that absorbing a new Anthropic model at all is a design decision, not a given. A shell script that calls curl https://api.anthropic.com/v1/messages with a hard-coded claude-opus-4-6 string does not get better when Opus 4.7 ships; it just keeps doing what it was told.
The inverse is also true. A product that blindly tracks the latest model each time Anthropic renames something will change its user-visible behavior on a random Thursday, which is its own risk. Fazm threads that needle by exposing three stable labels (Scary, Fast, Smart) and rotating what they point at underneath, so the product’s outer interface is consistent while the inner model can move.
The implementation fits on a napkin. Three rows. A substring match. One dispatch through an @Published ObservableObject. That is the entire machinery that turned an Anthropic release announcement into a new default option in the Fazm menu bar, on a day nobody at Fazm was on call.
The assumption underneath all of this
Everything above assumes the model is being given something meaningful to work on. That assumption is doing a lot of quiet work. Fazm feeds Claude the structured accessibility tree of whatever Mac app you are using (read through AXUIElement via the macOS Accessibility API), not a compressed screenshot. That matters because every time Anthropic ships a smarter model, a better input pipeline compounds; a worse input pipeline just pays a bigger token bill.
Most Mac automation tools that plug into Claude screenshot the screen, OCR it, and ask the model to guess what is clickable. The moment you hand the model a real tree of buttons, labels, roles, and positions, you skip the guessing step. Opus 4.7 working against a real accessibility tree is doing a different job from Opus 4.7 working against a PNG, and the Fazm upgrade story is about making sure the first one is the default.
“A new Anthropic model ships, and the only thing that has to change on the client is the ID flowing through a three-row table. That is the most the app is doing and the least it needs to do.”
Matt, on the Fazm upgrade that did not happen
Curious how Fazm handles your specific workflow on Opus 4.7?
Show us the flow. Twenty minutes with the team, screen shared, real app under the cursor.
Book a call →Frequently asked questions
What did Anthropic release in April 2026?
The headline release was Claude Opus 4.7, generally available on April 16, 2026. It lifts Opus 4.6 on advanced coding tasks, ships with a 1M context window, and keeps the same pricing tier as its predecessor. Alongside it Anthropic previewed Claude Mythos (codename Capybara) for security researchers and launched Claude Design inside Claude Apps. For app developers plugging into Claude, the only thing that changed overnight was that the ACP SDK started reporting a new model ID on session/new.
What is the actual new model ID for Opus 4.7?
The Anthropic SDKs expose it as claude-opus-4-7. Inside Fazm the app never types the full string. It uses the short alias opus, which the ACP agent layer resolves to whatever Opus model Anthropic is currently shipping. That is why Fazm's model picker showed Opus 4.7 the same afternoon it went GA, without anyone re-signing a build.
How does Fazm pick up a new Claude model without an app update?
Every time the ACP bridge starts a session it sends a models_available message back to the Swift side. The message is parsed in ACPBridge.swift at line 1131 and handed to onModelsAvailable. ShortcutSettings.updateModels then walks the new list and substring-matches each ID against a three-row family table at ShortcutSettings.swift line 159. If the ID contains opus it is labeled Smart (Opus, latest). If it contains sonnet it is Fast. If it contains haiku it is Scary. That is the entire upgrade mechanism.
What is the three-row substring table?
It is a static array of tuples inside ShortcutSettings.swift lines 159 through 163: (haiku, Scary, 0), (sonnet, Fast, 1), (opus, Smart, 2). The first field is the substring to match against the model ID Anthropic returns. The second is the one-word label users see in the floating bar. The third is the sort order so Haiku is always first and Opus is always last. When Opus 4.7 arrived on April 16 the table did not change. Only the ID feeding into it did.
What happens to a user who was pinned to claude-sonnet-4-6 before the new release?
Nothing bad. ShortcutSettings.normalizeModelId at line 169 takes any stored ID, checks whether it contains sonnet, and if so collapses it to the short alias sonnet. The alias is the thing Fazm actually sends to the ACP agent. If Anthropic later retires the full claude-sonnet-4-6 ID in favor of claude-sonnet-4-7, the user's saved preference still works because the alias points at the newest model in the Sonnet family at request time.
Does this mean Fazm ships without ever knowing which Claude model it is running?
Almost. Fazm writes claude-sonnet-4-6 into a few places as a default, notably Desktop/Sources/FloatingControlBar/BrowserProfileMigrationManager.swift lines 324, 342, and 358 where the browser profile import flow needs a deterministic model for stability. Everywhere else the model is read from the ACP models_available payload, not from a constant, which is why the app's behavior tracks Anthropic's release calendar instead of the Fazm release calendar.
Why aren't the friendly labels tied to benchmarks?
Because a user who opens the floating bar once a day does not want to read a leaderboard. The three labels, Scary (Haiku, latest), Fast (Sonnet, latest), and Smart (Opus, latest), map to latency, balance, and capability, and they survive every model revision Anthropic ships. Opus 4.6 was Smart. Opus 4.7 is Smart. Opus 5 will be Smart. The label is stable; the wiring behind it is what changes.
What happens if Anthropic renames the family entirely?
The family map fails over. ShortcutSettings.updateModels at lines 187 through 189 catches any model that does not contain haiku, sonnet, or opus as a substring. It falls back to the raw API-provided name and assigns a sort order of 99 so the unfamiliar model lands at the end of the picker. The app stays functional; the label just becomes less friendly until a new build ships with an extra row in the table.
Do I need to restart Fazm for a new Anthropic model to appear?
Only a new ACP session needs to come up. In practice that is a relaunch, because warmup happens at app start. There is no server-side feature flag, no Fazm backend fetch, and no prompt from Fazm asking the user to opt in. If you close and reopen Fazm on the same day Anthropic ships Opus 4.7, the Smart option in the floating bar now points at Opus 4.7.
How does this compare to a screenshot-based automation app?
Most Mac automation apps that call Claude do it by capturing pixels, running OCR, and asking the model what to do. That pipeline is expensive, slow, and totally indifferent to Anthropic's model releases because the bottleneck is the vision step. Fazm reads the real accessibility tree (AXUIElement via the macOS Accessibility API) for the app under the cursor, then hands that structured tree to whichever Claude model the user picked. A new Claude release makes Fazm smarter the day it lands. A screenshot pipeline mostly gets a bigger token bill.
Where can I read the source myself?
Fazm is open source at github.com/mediar-ai/fazm. The relevant files for this story are Desktop/Sources/FloatingControlBar/ShortcutSettings.swift (the family table and the normalizer), Desktop/Sources/Chat/ACPBridge.swift (the models_available handler at line 1131), and Desktop/Sources/Providers/ChatProvider.swift (the three-session warmup at line 1047). Grep for modelFamilyMap, normalizeModelId, and updateModels to see every consumer.
More on the same Anthropic April 2026 thread, from different angles.
Keep reading
Anthropic Claude updates April 2026
A wider sweep of everything Anthropic shipped this month, framed through what a consumer Mac app has to absorb.
Anthropic Claude latest model April 2026
The observer architecture: why Fazm runs two parallel Sonnet 4.6 sessions per user and what the second one is doing in the background.
Anthropic April 2026 news
One function, one config file, zero app updates. The rewiring story behind a full month of Anthropic releases.
Sources cited in this page: the Anthropic Opus 4.7 announcement at anthropic.com, Fazm’s open-source Swift app at github.com/mediar-ai/fazm, and the ACP SDK at npmjs.com/package/@agentclientprotocol/claude-agent-acp. Every file path in the body (ShortcutSettings.swift, ACPBridge.swift, ChatProvider.swift, BrowserProfileMigrationManager.swift) is in that repository and can be grepped directly.