Opus 4.7, the new weekly Opus cap, and the ten-line UserDefaults migration Fazm runs on every launch to keep your assistant answering
The April 2026 Claude news cycle covers the model layer. Opus 4.7 GA. Same $5 / $25 pricing. Claude Code redesign. Routines preview. The new seven_day_opus weekly rate-limit bucket. What nobody writes about is what a shipping consumer Claude app actually does when that weekly cap starts landing on its users. Fazm answers with a one-time migration guarded by a UserDefaults boolean. That boolean has a specific name. That migration has exact semantics. This page is about both.
Anthropic Claude headlines, April 2026
The anchor fact
0 lines of Swift, two UserDefaults keys, one silent demotion
On every Fazm launch, the ShortcutSettings singleton initializer runs a one-time migration branch. If your saved Claude model is claude-opus-4-6 and the guard key shortcut_didMigrateFromOpus is false, the app writes claude-sonnet-4-6 over the top, flips the guard to true, and continues launching. The next thing you see is a floating bar that says Fast instead of Smart.
The three Claude tiers Fazm exposes
Scary, Fast, Smart
Three model IDs, three short labels, three different tradeoffs. The short labels are what fits in the floating bar chrome next to the send button. Scary is not a warning, it is how fast Haiku returns when you ask it something small. Smart is the one the migration takes away from existing users who had it pinned.
Scary (Haiku)
Model ID claude-haiku-4-5-20251001. The fastest option. Used by the screen observer, suggested-replies, and anywhere the UI needs a response in under a second. Latency is the feature.
Fast (Sonnet), the new default
Model ID claude-sonnet-4-6. After the April 2026 migration, Fast is what every existing user ends up on unless they deliberately re-pick Smart. All three ACP sessions (main, floating, observer) warm up on claude-sonnet-4-6 at ChatProvider.swift lines 1048 to 1050.
Smart (Opus)
Model ID claude-opus-4-6. Still available, still selectable. Subject to the new seven_day_opus weekly cap, which is why the migration moves existing users off it as the daily driver.
Everything else the ACP SDK reports
updateModels() at lines 168 to 189 catches incoming IDs by substring: 'haiku' -> Scary, 'sonnet' -> Fast, 'opus' -> Smart. Unknown families fall through to the Anthropic name with 'Claude ' stripped. This is how Opus 4.7 shows up as Smart without a code change.
Per-query override
ChatProvider.modelOverride returns ShortcutSettings.shared.selectedModel. The floating bar passes it into each send. Overriding per query is cheap, and the model picker chip lives right next to send.
The default model list, verbatim from the source
These three entries are the fallback the app uses before the ACP SDK has had time to report what the server actually supports. Change the array and you change what every Fazm install sees on first launch.
Three inputs, one ShortcutSettings singleton, one selectedModel
The model ID that ends up on the next outgoing Claude request has three possible origins. All three funnel through the same in-memory property, which is what the floating bar reads at send time.
How selectedModel gets its value
Sequence of events the first time you launch Fazm after the April 2026 update
1. App process starts, ShortcutSettings singleton initializes
The @MainActor private init() at line 265 of ShortcutSettings.swift runs before any UI renders. UserDefaults reads are synchronous on the main thread, by design.
2. Read shortcut_selectedModel from UserDefaults
Line 288. If the user had previously picked Smart, this returns the exact string 'claude-opus-4-6'. If they had stayed on the default, it returns 'claude-sonnet-4-6' and the migration branch is dead.
3. Read shortcut_didMigrateFromOpus guard
Line 289. Boolean. False for any install that predates v2.0.6 shipped on April 4, 2026. True afterward.
4. Evaluate the two-clause if
Line 290. AND condition: saved model equals 'claude-opus-4-6' AND guard is false. Both must hold. The compound predicate is what makes the migration strictly one-time per install.
5. Overwrite the saved model with claude-sonnet-4-6
Line 291. UserDefaults write. Persists across launches. The next time the app starts, the guard is already true, so this branch skips.
6. Flip the guard, set the in-memory property
Lines 292 to 293. shortcut_didMigrateFromOpus is now permanently true for this install. selectedModel in memory is claude-sonnet-4-6. The floating bar is about to render with Fast selected.
7. ACP bridge warms three sessions, all on Sonnet
Later in the launch sequence, ChatProvider.warmupSession (line 1047) spins up main, floating, and observer sessions, each keyed to claude-sonnet-4-6 for their system prompts. The migration decision is already baked in by this point.
8. User types a question, gets an answer on Fast
First query hits claude-sonnet-4-6. Weekly Opus budget is untouched. The user, unless they look at the model chip, does not know anything happened.
What the log file shows on first launch after the update
The rate-limit vocabulary
Four type strings, four labels, one new one
The Anthropic API returns a rate-limit type string on every throttle. The April 2026 news is that seven_day_opus is now part of that vocabulary, distinct from the overall weekly limit and distinct from seven_day_sonnet. Here is how Fazm maps those strings into words a user will understand.
What happens when a user still hits the new weekly Opus cap
Migration or no migration, power users who manually pin Smart will still hit seven_day_opus sometimes. When that fires, Fazm does not silently switch models, because the user explicitly chose Opus and it is not the app's job to override that. Instead, the app surfaces the right label and lets the user choose.
Before and after the April 2026 migration
The two states of the same existing install. Before the migration runs on launch, and the first frame after. Everything to the left of the migration is a user's manually-picked setting. Everything to the right is the app making a product decision on their behalf, once.
| Feature | After migration fires once | Before April 2026 migration |
|---|---|---|
| shortcut_selectedModel | claude-sonnet-4-6 (written by migration branch) | claude-opus-4-6 (user-picked, pinned for months) |
| shortcut_didMigrateFromOpus | true (latched forever) | false (never set) |
| Floating bar chip reads | Fast | Smart |
| Where quota is burned | seven_day_sonnet, separate weekly bucket | seven_day_opus weekly cap, spent by Tuesday |
| Average query latency | 1.3s to 2.1s on Sonnet 4.6 | 2.8s to 4.5s on Opus 4.6 |
| Context window | Same as Sonnet for Claude 4 family | Same as Sonnet for Claude 4 family |
| ACP warmup sessions | main / floating / observer all default to Sonnet regardless | main / floating / observer all default to Sonnet regardless |
| User-visible error during migration | None, migration runs before first UI frame | None, migration runs before first UI frame |
| User can re-pick Smart | Yes, manual pick stays forever (guard stays true, no re-migration) | Yes, manual pick stays forever |
“On every Fazm launch, the ShortcutSettings initializer checks shortcut_didMigrateFromOpus. If it is false and the saved model is claude-opus-4-6, the app silently switches the user to Sonnet, flips the guard, and continues.”
Fazm ShortcutSettings.swift, lines 287 to 296
Why the comment in the source exists
// Opus burns through rate limits too fast
That single-line comment sits directly above the migration branch at line 287. It is the entire product rationale in eight words. An always-on desktop assistant that answers hundreds of short queries per day is not the workload Opus pricing and the new seven_day_opus cap are optimized for. Opus is optimized for long, hard, agentic runs.
The migration is Fazm picking Sonnet for the default workload and leaving Opus in place as an opt-in Smart mode for the queries that actually benefit from it. That is the Anthropic Claude news story for April 2026 that the model announcements cannot tell you, because it only exists once the model lands on a real product.
What Fazm does on every launch after the April update
This is the deterministic startup sequence the Claude-facing parts of the app run. Steps 1 through 4 run before any UI is visible.
Claude startup sequence, post-April-2026
- Read shortcut_selectedModel from UserDefaults
- Read shortcut_didMigrateFromOpus guard
- Run Opus-to-Sonnet migration if guard is false AND saved model is claude-opus-4-6
- Initialize the three default model tiers (Scary, Fast, Smart)
- Warm up three ACP sessions (main, floating, observer) on claude-sonnet-4-6
- Register models_available handler so ACP can refresh the list with server-reported models
- Relabel dynamic models by substring match (haiku -> Scary, sonnet -> Fast, opus -> Smart)
- Render the floating bar with whatever selectedModel is in memory after the above
The April 2026 Claude news you will see elsewhere
Opus 4.7 GA on April 14. Same $5 input / $25 output per MTok as Opus 4.6, stronger on long-running agent workloads, available through the Anthropic API and Claude.ai. Day-one access varied by plan and region.
The new seven_day_opus weekly cap. Previously, weekly limits were enforced under a single seven_day bucket. April 2026 splits Opus usage off into its own counter. An app now sees two separate rate-limit type strings: seven_day_opus for Opus-specific quota and seven_day_sonnet for Sonnet-specific quota. The overall seven_day limit still exists.
Claude Code desktop redesign and Routines preview. Announced April 14 alongside Opus 4.7. Claude Code got a visual overhaul on macOS and Windows, and Routines landed as a research preview for defining repeatable agent workflows.
Terms of Service update, early April. A consumer T&S refresh required users who had not re-accepted on claude.ai to do so before new API traffic would succeed. Apps that hard-coded a re-auth-as-remediation path surfaced confusing errors because re-auth alone did not fix it.
Custom API endpoint support. Fazm 2.2.0 on April 11 added a Custom API Endpoint setting so corporate gateways and proxies could route Claude traffic through their own infrastructure (ANTHROPIC_BASE_URL). The feature exists because early-April demand from users on enterprise networks made it clear the built-in endpoint was not always reachable.
Frequently asked questions
Frequently asked questions
What is the one-line summary of Anthropic Claude news in April 2026?
Anthropic landed four things that reshaped how consumer apps schedule Claude calls. Opus 4.7 went GA on April 14 at the same $5 input / $25 output per MTok as Opus 4.6. The weekly rate-limit surface got finer: alongside the existing five_hour and seven_day windows, a dedicated seven_day_opus cap now tracks Opus usage separately from Sonnet usage. The Claude Code desktop app shipped a redesign and the Routines research preview on April 14. And the Terms of Service updated early in the month, requiring users to re-accept on claude.ai before new API calls would succeed. Each of those lands as a specific string or numeric label inside a shipping Mac app.
What is seven_day_opus and where does it appear in Fazm's source?
seven_day_opus is the Anthropic rate-limit type label for the weekly Opus usage window. It is returned on agent errors when a user exhausts their Opus weekly quota, distinct from seven_day (the overall weekly limit) and five_hour (the session limit). Fazm's ChatProvider.swift lines 538 to 546 implement a rateLimitTypeLabel function that maps four type strings to human-readable labels: five_hour becomes 'session limit', seven_day becomes 'weekly limit', seven_day_opus becomes 'Opus weekly limit', seven_day_sonnet becomes 'Sonnet weekly limit', and overage becomes 'extra usage limit'. The four labels are the operational vocabulary the UI speaks when Claude says no.
Why did Fazm move users off Opus in April 2026?
Because Opus at the post-April-2026 weekly cap is not viable as the default for an always-on desktop assistant. A Fazm user types into the floating bar throughout the day: short questions, follow-ups, one-shot tasks. Opus 4.7 is strong on long multi-step engineering work, but the weekly Opus budget is sized for occasional deep work, not for being the hammer that hits every nail. Sonnet 4.6 is faster, cheaper, has a separate rate-limit bucket (seven_day_sonnet), and is the model Anthropic's own Claude Code pipeline defaults to for most operations. The one-time migration is Fazm accepting that reality on behalf of its existing Opus users.
Where is the silent Opus-to-Sonnet migration in Fazm's source?
Lines 287 to 296 of /Users/matthewdi/fazm/Desktop/Sources/FloatingControlBar/ShortcutSettings.swift, inside the ShortcutSettings singleton initializer. Ten lines total. It reads the saved model from UserDefaults under the key shortcut_selectedModel, reads a guard boolean under the key shortcut_didMigrateFromOpus, and runs the migration only if the saved model equals the string 'claude-opus-4-6' AND the guard has never fired before. On migration, it writes 'claude-sonnet-4-6' to shortcut_selectedModel, flips shortcut_didMigrateFromOpus to true, and sets the in-memory selectedModel property to match. The migration is idempotent by construction: once the guard is true, the branch is dead.
What are the exact UserDefaults keys involved?
Two strings. shortcut_selectedModel stores the Claude model identifier the user's floating bar will call (default claude-sonnet-4-6, previously claude-opus-4-6 for users who manually picked Smart). shortcut_didMigrateFromOpus is a boolean that starts at false, flips to true the first time the migration runs, and stays true forever after. Both live in the app's standard UserDefaults domain. A reader with access to the app sandbox can inspect them with: defaults read ai.fazm.desktop shortcut_didMigrateFromOpus. The double-key design is how Fazm keeps the migration one-time: a user who later manually re-picks Opus does not get migrated a second time.
What do 'Smart', 'Fast', and 'Scary' mean inside Fazm?
They are the short labels for the three Claude model tiers the floating bar surfaces. Line 151 to 155 of ShortcutSettings.swift: claude-haiku-4-5-20251001 is 'Scary (Haiku)' with short label 'Scary', claude-sonnet-4-6 is 'Fast (Sonnet)' with short label 'Fast', and claude-opus-4-6 is 'Smart (Opus)' with short label 'Smart'. 'Scary' refers to Haiku's speed, not its safety: responses come back so fast it is unsettling. The short labels are what render in the tight floating bar chrome when there is no room for full model names. After the April migration, new users default to 'Fast' and the 'Smart' option is still available but no longer auto-selected.
How does Fazm keep the model list fresh as Anthropic ships new models?
The ACP (Agent Client Protocol) subprocess emits a models_available notification after a session opens. ChatProvider.swift line 1018 forwards that list to ShortcutSettings.shared.updateModels(models). The updater at lines 168 to 189 of ShortcutSettings.swift maps each incoming model ID through a substring table (if the ID contains 'haiku' it gets the 'Scary' label; if it contains 'sonnet' it gets 'Fast'; if it contains 'opus' it gets 'Smart'), and unknown families fall through to the raw Claude name with 'Claude ' stripped. This is how an Opus 4.7 entry shows up as 'Smart' without any code change: the substring match catches it. The list only refreshes if it actually changed.
Does the migration touch the built-in bridge mode?
No. The migration is about which Claude model ID the floating bar asks for. The bridge mode (personal OAuth versus bundled Anthropic API key) is independent and lives in ChatProvider.swift under @AppStorage('bridgeMode'). A user whose shortcut_selectedModel gets migrated from claude-opus-4-6 to claude-sonnet-4-6 keeps whatever bridge mode they already had. A separate decision path handles the case where the selected model is not reachable through the current bridge. The two systems were designed to be orthogonal on purpose.
What are the four rate-limit type labels the app knows about?
Four strings the app maps to display text. five_hour is the session limit, which resets every five hours and applies to both personal OAuth and bundled-key sessions. seven_day is the global weekly limit on the user's Claude account. seven_day_opus is the Opus-specific weekly cap that Anthropic enforces separately in April 2026 to manage Opus 4.7 capacity. seven_day_sonnet is the Sonnet-specific weekly cap. There is also overage, which tracks pay-as-you-go extra usage once a weekly cap is hit and the user has opted into overage billing. All five map to labels through the rateLimitTypeLabel static function at ChatProvider.swift lines 537 to 546.
What changed about Claude Terms of Service in April 2026, and how does Fazm respond?
Anthropic updated its consumer terms and acceptable-use policy early in April 2026, and users who did not re-accept on claude.ai started getting API errors containing phrases like 'consumer terms', 'terms of service', 'accept', or 'terms and privacy'. Fazm classifies these with a separate matcher called isTermsAcceptanceRequired at ChatProvider.swift lines 1370 to 1382, and when it fires the app does not try to re-auth the user (re-auth does not fix a T&S acceptance gap) but surfaces the raw error and points the user to claude.ai. The T&S matcher is deliberately distinct from the model-access matcher because the remediation is different.
Is the migration reversible?
In one direction. A user whose model was silently moved from Smart to Fast can re-pick Smart at any time through the model toggle in the floating bar chrome or the Ask Fazm settings panel. The migration guard (shortcut_didMigrateFromOpus) stays true after that, so the one-time migration does not fire again. If the user picks Smart and then later updates Fazm, they stay on Smart. The migration only ever moves a user once, and only in the Opus-to-Sonnet direction. There is no corresponding Sonnet-to-Opus auto-migration.
How can I verify every claim in this guide?
Open /Users/matthewdi/fazm/Desktop/Sources/FloatingControlBar/ShortcutSettings.swift. Lines 139 to 141: the @Published selectedModel property. Lines 151 to 155: the three default model IDs and their friendly labels. Lines 168 to 189: the ACP-driven updateModels function that relabels models dynamically. Lines 287 to 296: the one-time Opus-to-Sonnet migration. Lines 288 to 289: the two UserDefaults keys. Line 293: the in-memory write. Then open /Users/matthewdi/fazm/Desktop/Sources/Providers/ChatProvider.swift. Lines 537 to 546: the four rate-limit type labels. Line 1018: the ACP models_available handler wiring. Line 1048 to 1050: the three ACP sessions (main, floating, observer) all default to claude-sonnet-4-6.
Install Fazm and watch the migration fire (or not) in your own log
Download the Mac app. If you had a previous install on Smart, the next launch writes claude-sonnet-4-6 over claude-opus-4-6 and flips shortcut_didMigrateFromOpus to true. You can watch it in ~/Library/Logs/Fazm.log. The code is ten lines and the keys are two strings. That is the whole change.
Download Fazm →
Comments
Public and anonymous. No signup.
Loading…