Field notes from a Mac app built on Claude

Anthropic Claude AI news, April 2026, seen from inside a shipping consumer Mac app

Opus 4.7 GA, Claude Design, Mythos Preview, a brief Claude Code Pro removal test, and an admitted stretch of degraded quality. This page is not another recap of those posts. It walks through what each one actually did to users of Fazm, a Mac agent that runs on top of Claude, and explains why most of them felt almost none of it.

Opus 4.7 GA 2026-04-22Claude Design 2026-04-17Mythos Preview 2026-04-07$10 builtin capFazm 2.0.7 to 2.4.1
M
Matthew Diakonov
11 min read
4.7from Sourced from the Fazm repo across 11 April 2026 releases
Every claim anchored to a file path and line number
Cross-referenced against Anthropic's public April 2026 posts
Written from inside the ChatProvider failover code, not a press recap

The short version

April 2026 did not give downstream apps a single announcement to react to. It gave them a fortnight of edge changes: a new flagship model, a new product surface, a security-focused preview model under investigation, a plan-level test that briefly removed Claude Code from Pro, and a quality degradation admission that covered the previous six weeks. Any one is a headline. Together they are the kind of cycle that breaks a consumer app that assumes Anthropic is a single stable endpoint.

Fazm is a Mac desktop agent that routes every user message through ChatProvider, a Swift actor that can talk to two different Claude backends. The default for every new user is a Fazm-managed Vertex AI Claude instance, funded from a $10 per-user budget. The second backend is the user's own claude.ai OAuth account, which takes over when the budget is spent. The rest of this page is how that two-backend router reacted, line by line, to the April 2026 news cycle.

$10.00

Pre-query guard: check if builtin cost cap is reached. If so, switch to personal mode before the next message, not after it fails.

Desktop/Sources/Providers/ChatProvider.swift line 2272, paraphrased

$0Builtin cap per user
0switchBridgeMode call sites
0Fazm releases in April 2026
0Opus model GA'd mid-month

Backdrop

The cycle, in the order it landed

This is not a press summary. The left column is what Anthropic or Fazm shipped on a given day in April 2026. The right column is what the Fazm codebase already did or chose to do about it. Dates that look unrelated usually were: the value is in the pattern of edge changes arriving constantly, not in any single item.

1

April 5 — personal-plan model fallback ships inside Fazm

Fazm 2.0.7 lands the first half of the bidirectional failover: if a user's personal Claude account cannot access the selected model, ChatProvider falls back to built-in and auto-retries the same query. Nothing about this was triggered by a specific Anthropic announcement. It was triggered by a Sentry cluster of "stream ended with no chunks" failures in the week prior.

2

April 7 — Claude Mythos Preview and Project Glasswing

Anthropic introduces Mythos Preview, a security-focused general-purpose model, and Project Glasswing, an initiative to use it on critical software. The same day, Fazm 2.1.2 upgrades ACP to 0.25.0 with tighter credit-exhaustion and rate-limit handling. These are unrelated events on the same day, which is how April 2026 mostly behaved.

3

April 11 — founder chat crash-loop fix

Fazm 2.2.0 adds the two-substring rate-limit guard at ChatQueryLifecycle.swift line 68 after a single user generated a loop of three repeated rate-limit failures that crashed the app on relaunch. The guard matches on both "usage limit" and "rate limit" so future rewording at the Anthropic edge does not bypass it.

4

April 16 — privacy language tightened

Fazm 2.3.2 replaces "nothing leaves your device" with "local-first" in onboarding and system prompts. The language had been wrong since Fazm added a second Claude session for memory writing in February. The fix lands the week the Mythos breach investigation is disclosed.

5

April 17 — Claude Design launches

Anthropic ships Claude Design in research preview for Pro, Max, Team, and Enterprise, powered by Opus 4.7. Fazm does not use Claude Design directly, but the release hints at Opus 4.7 going GA soon, which means the dynamic model picker is about to earn its keep.

6

April 20 — dynamic model list and ACP 0.29.2

Fazm 2.4.0 makes available models populate from the agent and upgrades ACP to 0.29.2. It also adds custom MCP server support via ~/.fazm/mcp-servers.json, shortens the free trial from 21 days to 1 day, and triggers the paywall after 3 messages. The model list change is the one that matters for this week's Claude news: new Anthropic model IDs will now slot in without an app release.

7

April 22 — Opus 4.7 GA and the Claude Code Pro test

Opus 4.7 goes generally available at $5 input and $25 output per million tokens. The Smart slot in Fazm's picker maps to it on the next ACP session/new, via the substring map at ShortcutSettings.swift line 159. The same day, Anthropic's head of growth confirms a test removing Claude Code from the $20 Pro plan for about 2 percent of new prosumer signups. Fazm's built-in mode means most new users never cared.

8

April 23 — degradation admission and the crash-loop guard

Anthropic publicly acknowledges that three distinct changes in March and April degraded Claude Code, Claude Agent SDK, and Cowork quality, and says the issues are fixed. Nothing inside Fazm changes in response: the crash-loop rollback guard in FazmApp.swift line 138 is already the structural fix. If a bad Anthropic path triggers three consecutive crashes at launch, Fazm rolls back before the user sees a fourth one.

Anchor fact

A $10 constant, a bridgeMode string, and three switch sites

If you only read one section of this page, read this one. Almost every news item in April 2026 tested a different assumption about where Anthropic meets its users. Fazm's answer is a small piece of Swift, on a single file, that decides which backend to talk to and when to move between them.

Desktop/Sources/Providers/ChatProvider.swift

That block, plus the three error-path branches below it, is the whole reason a Fazm user can open the app on April 22 without a Claude Pro subscription, get a response from Opus 4.7 via Vertex AI, keep going for days, and only ever be asked to connect their own Claude account once the built-in budget is spent. The default value of bridgeMode is set to “builtin” at declaration time, so every fresh install starts in this mode.

Desktop/Sources/Providers/ChatProvider.swift

Why the April 2026 news cycle stayed off most screens

Two of these three branches move a user from builtin to personal (credit exhausted, or the bundled key hit an auth error). The third moves them in the opposite direction, from personal to builtin, when a personal plan denies the selected model. Add the pre-query cap check at line 2272 and you have a router that moves users toward whichever backend still works for this particular query, regardless of what Anthropic changed last night.

One query, two possible backends

What happens when you press Return

Every message a Fazm user sends passes through ChatProvider. ChatProvider asks one question first: is this conversation in builtin mode or personal mode? That single piece of state, persisted in @AppStorage under the bridgeMode key, decides which route the ACPBridge opens and which Claude the user is actually talking to.

ChatProvider as the routing layer

Bundled API key
Personal OAuth
ChatProvider
Opus 4.7
Sonnet 4.6
Haiku 4.5

Credit exhaustion sequence

What the switch actually looks like in flight

The interesting moment is not when bridgeMode equals “builtin” and the query succeeds. It is the one query where the built-in budget runs out. The timing matters: the pre-query cap check at line 2272 runs before ACPBridge is even called, so the user still gets an answer on the first query after the cap is hit, and the switch shows up as an alert alongside the response rather than replacing it.

query N+1 after the $10 cap is reached

UserChatProviderACPBridgeClaudesendMessage(text)builtinCumulativeCostUsd >= 10.0switchBridgeMode(to: personal)restart as personalOAuthnew session with OAuth tokenstreamed responsechunks forwardedresponse + Connect Claude alert

What the news tested

Five April 2026 events, five outcomes for a Fazm user

Each card below is one item from the April 2026 Claude news cycle paired with what the router actually did about it. The goal is not to claim Fazm handled every case perfectly. It is to show which downstream symptoms reached a user and which ones were absorbed before they did.

Claude Code Pro removal test

April 22 cohort test. Irrelevant to a Fazm user in builtin mode, because the conversation never touched a claude.ai Pro subscription in the first place.

Opus 4.7 GA

Same-day pickup via emitModelsIfChanged in the ACP bridge. Smart slot relabels the new model ID on the next session without an app restart.

Quality degradation admission

Anthropic's fix lands server-side. Fazm's contribution is the crash-loop rollback that kept a bad response path from turning into a launch loop.

Mythos Preview breach

Ecosystem signal, not a direct dependency. Tightened privacy language shipped the same week, unrelated in timing but consistent in tone.

Rate-limit phrasing drift

Matched at ChatQueryLifecycle.swift line 68 by both "usage limit" and "rate limit" substrings. Phrasing can drift again without breaking the guard.

Direct vs. downstream

Claude user directly vs. Fazm user during April 2026

The difference is not that Fazm is faster or cheaper. It is that Fazm decouples the user from Anthropic's plan structure. That decoupling is the thing that turned most of the month's headlines into no-ops for a Fazm user.

FeatureDirect Claude consumerFazm user
New user, first chat, no Claude accountBlocked at Pro sign-up if the test cohort flag hits them on April 22Works. Routes through bundled Anthropic key with Vertex AI on the backend, gated by the $10 builtin cap
Opus 4.7 shows up mid-monthWait for your app's next update that hard-codes the new model IDPicked up automatically via emitModelsIfChanged on the next ACP session
Personal Claude plan denies selected modelSilent stream failure or a raw error toastChatProvider.swift line 2951 falls back to builtin, auto-retries at line 2971
Rate limit phrasing changes at the edgeGuard keyed on exact string breaks, error bubbles upTwo-substring match at ChatQueryLifecycle.swift line 68 absorbs both "usage limit" and "rate limit"
Degradation incident on a specific model pathApp keeps hitting the same bad endpoint until server-side fix landsSame server-side fix applies, but a three-strike crash at launch triggers UpdateRollbackManager rollback before the app gets stuck
$10 of Claude spend accumulates per userPay-as-you-go or token buckets, visible to the userPre-query check at line 2272 switches to personal mode before the next message, not after a failure

A worked example

What appears in the logs on April 22

This is a real shape of the log output on a machine running Fazm 2.4.0, the day Opus 4.7 went GA. Lines are abbreviated for length, but the prefixes, the mode switch, and the emitModelsIfChanged path are verbatim.

~/Library/Logs/Fazm.log, 2026-04-22

The surface area

What is in the builtin path

Opus 4.7 GASonnet 4.6Haiku 4.5ACP 0.29.2Vertex AIclaude.ai OAuthMCP serversBundled API key$10 builtin capAuto-fallbackAuto-retryCrash-loop rollback

None of these are separate features. They are the surface of one router that already exists in the Fazm codebase. The engineering cost of adding the bidirectional failover in April 2026 was the April 5 changelog entry in 2.0.7, roughly 30 lines of Swift.

What a user does not see

The concrete list of non-events

Every item on this list is something a direct Claude consumer could have seen on a given day in April 2026. None of them appear on a Fazm user's screen as long as the router is healthy.

Off-screen, by design

  • A Connect Claude alert during the first 10 minutes of use
  • A "you need a Pro plan to use Claude Code" message
  • A stale model list after Opus 4.7 GA
  • A crash loop after a bad Claude path on launch
  • A raw Anthropic error string in the chat body
  • A silent empty response because personal plan denied the model

What this is not

Honest caveats

The router is not a silver bullet. If Anthropic's infrastructure has a regional outage, both backends go down together. If the bundled API key is revoked, builtin mode fails until the next app update ships a new key, and new users without a connected Claude account cannot start a chat during that window. If a user's personal Claude plan is paused, the model-access fallback lands them on builtin, but only until the $10 cap is reached a second time.

The honest claim is narrower: during the specific April 2026 news cycle, the bidirectional router absorbed the Claude Code Pro removal test, the Opus 4.7 GA transition, and the mid-month rate-limit phrasing drift without requiring users to change anything. The degradation admission was a server-side fix. The crash-loop guard is what caught a bad launch path before it became a pattern.

Want to see the router in practice?

Book a 20-minute walkthrough. We will open ChatProvider.swift on a shared screen and run a real query through the bidirectional failover.

Book a call

Frequently asked questions

What was the biggest Anthropic Claude AI news story in April 2026?

There was not one. It was a cluster. Opus 4.7 went generally available on April 22, 2026, at $5 input and $25 output per million tokens. Claude Design launched on April 17 as a research preview for Pro, Max, Team, and Enterprise, powered by Opus 4.7. Claude Mythos Preview and Project Glasswing landed on April 7 as a security-focused general-purpose model, and a possible Mythos breach inside a vendor environment was disclosed shortly after. On April 22, Anthropic quietly removed Claude Code from the $20 Pro plan for a test cohort of roughly 2 percent of new prosumer signups and then walked part of it back. On April 23, Anthropic admitted that three distinct changes in March and April had degraded Claude Code, Agent SDK, and Cowork quality, and said the issues were fixed. Any one of these is a headline. Together they are a cycle that anyone building on top of Claude had to absorb in real time.

How did Fazm users experience the Claude Code Pro removal test?

Most of them did not. Fazm's ChatProvider starts every new user in bridgeMode = "builtin", defined at Desktop/Sources/Providers/ChatProvider.swift line 439, which routes the conversation through a Fazm-managed Vertex AI Claude instance using a bundled Anthropic API key from KeyService. That path does not depend on the user having a Claude Pro subscription. It is only after the per-user built-in cost cap of $10 is reached, set at line 476 as `static let builtinCostCapUsd: Double = 10.0`, that ChatProvider calls switchBridgeMode(to: "personal") at line 2907 and starts talking to the user's own Claude account. The Pro removal test affected prosumer Anthropic subscribers. Fazm users in builtin mode were upstream of that entire decision.

Did Opus 4.7 show up in Fazm on April 22, 2026, without a new app release?

Yes. Available models populate dynamically from the ACP bridge, so a newly published model ID arrives via the models_available message and the Swift picker relabels it against a three-row family map under Desktop/Sources/FloatingControlBar/ShortcutSettings.swift. The 2.4.0 release notes, dated April 20, call this out as: available AI models now populate dynamically from the agent, so newly released Claude models appear without an app update. When Opus 4.7 went GA two days later, users picking "Smart" got it on the next turn.

What happens inside Fazm when Anthropic confirms a quality degradation bug like the April 23 announcement?

Nothing automatic at the code level: Anthropic's fix lands on their infrastructure, not Fazm's. What changes for the user is that the two backends Fazm can talk to, Vertex AI Claude on the builtin side and claude.ai OAuth on the personal side, are both served by Anthropic. Degradation that affects one route usually affects the other. The thing Fazm shipped specifically for this case is the crash-loop rollback in Desktop/Sources/FazmApp.swift line 138, which rolls back to the previous app build if three consecutive launches crash. If a bad Claude response path triggers a crash on startup three times in a row, UpdateRollbackManager restores the last good build before the user sees a fourth failed launch.

Why does Fazm have its own $10 built-in Claude budget at all?

Two reasons. First, onboarding: asking a new user to go through Anthropic OAuth, accept terms, and manage billing on their second minute with a desktop app is a quiet but real drop-off. Built-in mode makes the first chat work with zero configuration. Second, resilience: when Anthropic changes its plan structure, rate limit phrasing, or model availability, a user in builtin mode is not directly exposed. The $10 cap at ChatProvider.swift line 476 is small enough to stay inside the trial economics and large enough to cover real use. When it is hit, the code at line 2272 switches to personal mode before the next query, not after it fails.

What does the bidirectional part of the failover look like in code?

Three distinct call sites in ChatProvider.swift call switchBridgeMode, and they move the user in opposite directions depending on the error. Line 2907: builtin mode hit real credit exhaustion, switch to personal and show the Connect Claude alert. Line 2932: builtin mode got an auth error, switch to personal and trigger sign-in. Line 2951: personal mode got a model access error, fall back to builtin, auto-retry the failed query at lines 2968 to 2974. That last branch is the one added in Fazm 2.0.7 on April 5, 2026: the changelog entry reads "fixed chat failing silently when personal Claude account lacks access to the selected model, now auto-falls back to built-in account".

How does Fazm handle the OAuth flow for users who do connect their Claude account?

The sign-in sheet lives at Desktop/Sources/Chat/ClaudeAuthSheet.swift. When a user clicks Connect Claude in the floating bar or in Settings, ACPBridge opens an OAuth URL in Chrome (not the system default browser, which is often Arc or Safari without the claude.ai session), completes the token exchange, and publishes isClaudeConnected. If the bundled API key later hits an auth error inside builtin mode, ChatProvider.swift line 2932 sets isClaudeAuthRequired = true, the sheet opens again, and the pending query keeps retrying in the background after a fresh token is minted.

What should someone building their own consumer app on top of Claude take from April 2026?

One concrete thing: do not assume any single Anthropic endpoint is stable enough to be the only path. The cheapest hedge is a two-backend router with a pre-query cap check, a credit-exhaustion branch, an auth-error branch, and a model-access branch, each moving the user between the backends in the direction the error actually calls for. Fazm's version is ~80 lines of Swift spread across ChatProvider.swift between lines 2271 and 2974. That is the piece that kept the April 2026 news cycle off most user screens.

Did the Mythos Preview breach investigation affect Fazm?

No, as far as we can tell from our telemetry. Mythos Preview was rolled out to a small pool of partner companies to help them detect software vulnerabilities. Fazm does not use Mythos Preview: it routes between Sonnet 4.6 and Opus 4.x through ACP, and the builtin path talks to Claude on Vertex AI. The relevant concern for us was contagion risk in the broader Anthropic ecosystem, which is partly why we ship the crash-loop rollback guard at FazmApp.swift line 138 and partly why the privacy language in onboarding was tightened to say "local-first" on April 16 in version 2.3.2.

If something does go wrong during a news event, what does a Fazm user actually see?

One of three things. A Connect Claude alert, rendered when showCreditExhaustedAlert is set at ChatProvider.swift line 2908. An Upgrade Claude banner in the floating bar, rendered when showUpgradeClaudeButton is set at ChatQueryLifecycle.swift line 72. Or in the last-resort case, the fallback string at ChatQueryLifecycle.swift line 90: "Failed to get a response. Please try again." That last message in production is a P1 signal that a new Claude error mode slipped past the substring checks, and we add a new branch above line 67 when it happens.