Every roundup for April 11-12, 2026 lists weights. The provider matrix changed underneath and three lines of Swift are doing the work of 206.
Gemma 3, Llama 4 Maverick, Qwen 3, Codestral 2 Apache 2.0, OLMo 2 32B, GLM-5.1 quantizations. DeepSeek V3 training details, The AI Scientist-v2. MCP under Linux Foundation governance. Every link in the top-five SERP for this query ranks the same surface. What none of them covers is what shipped for Mac users on those exact two days: Fazm v2.2.0 added one setting on April 11 that routes the entire agent through ANTHROPIC_BASE_URL, and on April 12 deleted Vertex AI from the codebase in twelve commits. The provider matrix collapsed from three rails to two, and the third rail became a TextField.
The anchor fact
Three lines in one file
This is the entire custom-endpoint rail. The whole reason any of the April 11-12 open-source models can now drive a Mac through an accessibility-tree control surface is these three lines, read from one UserDefaults key, exported into the ACP bridge child process on spawn. Verify with grep -n ANTHROPIC_BASE_URL Desktop/Sources/Chat/ACPBridge.swift.
Any Claude-compatible endpoint, one accessibility-tree surface
After v2.2.0, the ANTHROPIC_BASE_URL override turns any URL that speaks Anthropic's Messages API into a routable model for the native Mac agent. Whatever you pick on the left, the tool surface on the right is identical.
Custom endpoint -> ACP bridge -> native macOS tools
What the April 11-12 SERP keeps ranking
Twelve names. Every link in the top-five results repeats some subset of them. Zero of those links tell a Mac user what to do next.
Before and after
The 206-line service-account path vs. the 3-line override
Before April 12, routing the agent through anything other than Anthropic direct required VertexTokenManager: service-account JSON parsing, JWT signing, token caching, refresh-on-401. After April 12, routing the agent through anything requires a TextField.
VertexTokenManager.swift (206 lines) vs. ACPBridge.swift:380-382 (3 lines)
A full provider module with Google OAuth 2.0 service-account flow, CryptoKit RSA JWT signing, token caching, region pinning, and refresh-on-401 retry. Second bridge mode in the ACPBridge enum, separate code path in ChatProvider, separate onboarding flow. Two hundred and six lines of Swift dedicated to reaching one provider.
- Service-account JSON file on disk or in keychain
- JWT assertion signed with CryptoKit RSA
- Token exchange against oauth2.googleapis.com
- Separate ChatProvider fallback branch (51 lines)
- Third variant in the bridge-mode enum
The deleted code
What VertexTokenManager actually did, and what replaced it
The full 206 lines of VertexTokenManager.swift are in the April 12 diff at commit f095d7b2. This is an abridged version showing the auth loop, with the replacement on the right side of the tab.
Provider matrix, one afternoon apart
Every row verifiable against the diff between commit 5c48de8e (the pre-removal state) and commit 02ccd919 (the first removal commit). Twelve commits land between them.
| Feature | Fazm before 2026-04-12 | Fazm after 2026-04-12 |
|---|---|---|
| Bundled Anthropic API key | Yes (free trial + paid) | Yes (free trial + paid) |
| Personal Claude Pro/Max subscription | Yes | Yes |
| Google Vertex AI rail | Yes (VertexTokenManager.swift, 206 lines) | Removed (commit f095d7b2, 2026-04-12) |
| Custom ANTHROPIC_BASE_URL override | No | Yes (Settings > Custom API Endpoint, v2.2.0) |
| Endpoint swap cost | Rebuild, re-auth, re-install | Toggle a TextField, restart the bridge |
| Provider auth modes to maintain | 3 (Anthropic key, Claude OAuth, Vertex SA JWT) | 2 (Anthropic key, Claude OAuth) + arbitrary URL |
The replacement side, zoomed in
The whole setting is in one settingsCard
If you want to verify what the UI actually renders, open Desktop/Sources/MainWindow/Pages/SettingsPage.swift and jump to line 906. It is a single settingsCard with a toggle, a conditional TextField, and a one-line helper that calls restartBridgeForEndpointChange on submit.
The old rail in two files
What got cut, verbatim
Tab between the two views. The left side is an abridged VertexTokenManager. The right side is the entire replacement in ACPBridge.swift. The git log line that ties the two together is git show f095d7b2 --stat.
provider rail collapse
// Desktop/Sources/Providers/VertexTokenManager.swift
// (Deleted in commit f095d7b2 on 2026-04-12 16:53:00-07:00, 206 lines)
class VertexTokenManager {
private let serviceAccountPath: URL
private var cachedToken: String?
private var cachedExpiry: Date?
func getAccessToken() async throws -> String {
if let token = cachedToken,
let expiry = cachedExpiry,
expiry.timeIntervalSinceNow > 60 {
return token
}
let json = try Data(contentsOf: serviceAccountPath)
let serviceAccount = try JSONDecoder()
.decode(ServiceAccount.self, from: json)
let jwt = try signJWT(
issuer: serviceAccount.clientEmail,
scope: "https://www.googleapis.com/auth/cloud-platform",
privateKeyPEM: serviceAccount.privateKey
)
var req = URLRequest(url: URL(string:
"https://oauth2.googleapis.com/token")!)
req.httpMethod = "POST"
req.httpBody = "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer"
.appending("&assertion=\(jwt)")
.data(using: .utf8)
let (data, _) = try await URLSession.shared.data(for: req)
let resp = try JSONDecoder().decode(TokenResponse.self, from: data)
self.cachedToken = resp.accessToken
self.cachedExpiry = Date()
.addingTimeInterval(TimeInterval(resp.expiresIn - 60))
return resp.accessToken
}
// + 160 more lines: CryptoKit RSA signing, retry-on-401,
// per-project quota handling, region pinning,
// service-account discovery, keychain fallback...
}The 48-hour ship log
Every commit between v2.2.0 and v2.2.1
Timestamps are Pacific unless marked UTC. The Vertex removal block is twelve commits in a forty-one-minute window on April 12 afternoon. Reproduce the list with git log --since="2026-04-11" --until="2026-04-12 23:59".
fazm commits, 2026-04-11 01:53 UTC through 2026-04-12 20:10 UTC
2026-04-11 01:53 UTC - v2.2.0 release commit (1a24eaa7)
Codemagic CI cuts v2.2.0. The release notes call out the custom API endpoint setting as the headline feature. Typing-indicator debounce and new-pop-out-chat shortcut ship in the same build.
2026-04-11 14:12 PT - DetachedChatWindow logging tweak (64f3aa9d)
Single commit on April 11 after the release. Adds a new message dump to the DetachedChatWindow logger so the pop-out window's message-sync issues are easier to debug. The foundation for the v2.2.1 fix the next day.
2026-04-12 12:14 PT - skip-button timer visibility fix (72cd5c31)
Timer state and conditional visibility on the onboarding skip button. Morning commit before the bigger afternoon block.
2026-04-12 12:15-12:16 PT - duplicate AI bubble fix (ab784283, 1884bf90)
Fixes duplicate AI responses in pop-out and floating bar during follow-ups. The fix narrows the AI-response subscription to search only newly added messages instead of the full history. v2.2.1's sole changelog line comes from this pair.
2026-04-12 16:52 PT - Vertex bridge mode removed (02ccd919)
The first commit in the twelve-commit Vertex removal block. ACPBridge.swift loses the .vertex case from the bridgeMode enum. Twelve lines removed, one inserted.
2026-04-12 16:52-16:53 PT - Vertex fallback stripped from ChatProvider (36c089d2)
Fifty-three lines of Vertex fallback logic in ChatProvider removed, two lines kept for the new shape. This is where the provider matrix goes from three to two.
2026-04-12 16:52 PT - onboarding bridge uses bundled Anthropic (0fc51f4b)
OnboardingChatView loses its Vertex branch. Six insertions, ten deletions. The first-run experience is now exclusively personal Claude or bundled Anthropic, with the custom-endpoint override available later in Settings.
2026-04-12 16:53 PT - VertexTokenManager deleted (f095d7b2)
The 206-line file disappears. git show reports `1 file changed, 206 deletions(-)`. This is the single line of git history that anchors this entire article.
2026-04-12 16:53-16:54 PT - doc and comment sweep (dbd83717, aa7a925b, 5c48de8e)
ACPBridge documentation updated to reflect supported modes. Migration comments updated to replace Vertex AI with bundled Anthropic. bridgeMode comments specify the new meaning of each variant. Zero behavior change, but the source tree stops lying about the shape.
2026-04-12 17:17 PT - builtinCostCapUsd raised (06b5f97c)
The bundled-Anthropic rail's cost cap is bumped to $10,000 to stop hitting artificial ceilings while the Vertex safety net is gone. Reverted to $10 later in the afternoon (77fbeb3d) once the real free-trial logic is re-wired.
2026-04-12 17:23-17:27 PT - paywall and Claude connection changes (e4742d6c, 00666dfd)
Auto-switch to personal Claude mode on connection is disabled. The paywall gate is updated to allow the builtin bridge mode. Both drop-through behaviors depend on the Vertex rail being gone.
2026-04-12 17:26 PT - log line cleanup (68459563)
ACP mode logging updated to remove references to Vertex AI and to rename old 'Omi' strings to 'Fazm'. Closes the twelve-commit block.
2026-04-12 20:10 UTC - v2.2.1 release (a3c9e674)
Codemagic CI cuts v2.2.1. The visible changelog entry is the duplicate-AI-bubble fix. The invisible one is that everything between 16:52 and 17:33 PT landed in this release.
The weight releases, re-framed
Which April 11-12 model fits which endpoint
Every box below is a model the SERP is ranking for this query, paired with the path a Mac user would actually take after turning the Custom API Endpoint toggle on. No benchmarks, no leaderboards. Just the URL shape and the adapter type.
Codestral 2 (Apache 2.0)
Strong tool-use traces in training. Serve via vLLM on a consumer GPU, front with LiteLLM's /v1/messages adapter, point Fazm at http://127.0.0.1:8766. Zero-cost route for heavy local automations.
Llama 4 Maverick
Best reasoning quality among the April 11-12 open weights. Typical route is OpenRouter or LiteLLM, since the 400B checkpoint is too big for a single local GPU. Endpoint behaves the same.
Qwen 3 family
Best multilingual behavior if your automations cross into non-English UI text. Available through most Claude-compatible proxies and on OpenRouter.
GLM-5.1 quantizations
Smallest footprint among the April community quants. Runs on llama.cpp-server + a Claude-compat shim. Good fit for air-gapped or battery-sensitive use.
Gemma 3 (relaxed license)
Google dropped the user-count clause on April 11. Commercial use is now unambiguous. Same routing path via Ollama + LiteLLM.
DeepSeek V3 hosted
Not April 11-12 per se, but the training-recipe supplement dropped during the window. If you prefer hosted, DeepSeek's own Anthropic-compatible endpoint plugs straight in.
OLMo 2 32B
Ai2's fully open release. Useful when you care about reproducible training data. Same endpoint path, same tool surface.
Wiring it up
Running Codestral 2 through Fazm, end to end
This is the exact terminal path from a cold machine to an accessibility-tree tool call against Safari, using Codestral 2 as the model and LiteLLM as the Claude-compatible bridge.
“The three-line override in ACPBridge.swift replaced a 206-line OAuth service-account path. Same functional coverage, fewer auth code paths to maintain, and now every Claude-compatible endpoint is a target.”
Fazm engineering log, 2026-04-12
Reproduce from the source tree
Every claim, verified against git
The following terminal session walks through the v2.2.0 release commit, the twelve-commit Vertex removal block, and the line count of the deleted file. No screenshots, no tooling beyond git.
What this page does not claim
Guardrails and known limits
ANTHROPIC_BASE_URL is a transport override, not a capability promise. If the endpoint you point at does not speak the full Messages API surface the ACP bridge expects, calls that use newer features (for example streaming tool-use deltas or long-context cache markers) will fail. These are the concrete constraints as of April 12, 2026.
Endpoint override: what is and is not portable
Want to watch ANTHROPIC_BASE_URL route your endpoint in a live Fazm session?
Book a 20-minute walkthrough. We tail /tmp/fazm-dev.log together, flip the Custom API Endpoint toggle, and run a macos-use tool call against a real macOS app through whichever Claude-compatible URL you bring.
Book a call →Frequently asked questions
What were the main AI model releases on April 11-12, 2026?
The 48-hour window saw Google relax Gemma 3's commercial license on April 11 (removing the prior user-count clause), continued uptake of Meta's Llama 4 and Llama 4 Maverick checkpoints, fresh Qwen 3 variants from Alibaba, Mistral's Codestral 2 under Apache 2.0, Ai2's OLMo 2 32B, and a GLM-5.1 community quantization wave on Hugging Face. On the paper side, DeepSeek V3's training-recipe supplement and The AI Scientist-v2 (workshop-level agentic tree search for scientific discovery) were the most-shared arXiv drops. On the tooling side, MCP (Model Context Protocol) moved under Linux Foundation governance, which matters more for consumer-grade desktop agents than any of the weight releases.
What actually changed for Mac users on April 11-12 that no roundup mentions?
Fazm shipped v2.2.0 on April 11 with a single new setting that accepts an HTTPS URL and, when set, routes all agent traffic through that endpoint by exporting ANTHROPIC_BASE_URL to the ACP bridge child process. Twenty-four hours later (April 12, afternoon Pacific), Fazm deleted Vertex AI entirely: VertexTokenManager.swift (206 lines) was removed in commit f095d7b2, Vertex fallback logic was stripped from ChatProvider.swift in commit 36c089d2 (51 of 53 lines gone), and the bridge-mode enum lost its Vertex variant in 02ccd919. The provider matrix collapsed from three rails (Claude Pro/Max + Vertex + bundled Anthropic) to two (personal Claude + bundled Anthropic), plus the user-configurable ANTHROPIC_BASE_URL override that replaces everything else. For any reader who wants to point a native Mac agent at Codestral 2 via a local claude-compatible proxy, or at Llama 4 Maverick through LiteLLM, this is the weekend the path became two UI clicks long.
Where exactly is the custom endpoint code in the Fazm source tree?
Three locations. The runtime injection lives at Desktop/Sources/Chat/ACPBridge.swift lines 379-382: `if let customEndpoint = defaults.string(forKey: "customApiEndpoint"), !customEndpoint.isEmpty { env["ANTHROPIC_BASE_URL"] = customEndpoint }`. The setting storage lives at Desktop/Sources/MainWindow/Pages/SettingsPage.swift line 840 (`@AppStorage("customApiEndpoint") private var customApiEndpoint: String = ""`). The UI toggle and TextField render at the same file lines 906-952. That is the entire contract. No DSL, no YAML, no per-provider adapter.
What did deleting Vertex AI actually remove?
Commit f095d7b2 (2026-04-12 16:53:00-07:00) deleted 206 lines of service-account OAuth plumbing in VertexTokenManager.swift: Google service-account JSON parsing, JWT assertion signing with CryptoKit, token exchange against https://oauth2.googleapis.com/token, token caching with expiry, and refresh-on-401 logic. Commit 36c089d2 (one minute earlier) stripped 51 of 53 lines of Vertex fallback from ChatProvider. Commit 02ccd919 (a minute before that) removed the Vertex branch from ACPBridge's bridge-mode enum, which used to choose between `.anthropic`, `.vertex`, and `.claudePro`. The afternoon of April 12 is twelve commits long in the fazm repo and removes every trace of Vertex.
How does this let me run the new April 11-12 open-source models through Fazm?
Any runtime that exposes Anthropic's Messages API shape becomes a drop-in target. The known-working adapters as of April 12 are (1) LiteLLM's `/v1/messages` bridge, which fronts OpenAI, Gemini, Ollama, vLLM, and local servers under a single Claude-compatible URL, (2) claude_code_proxy and similar open-source translation layers, (3) Cloudflare AI Gateway with transformation rules, and (4) any corporate proxy that speaks the Messages API (e.g. GitHub Copilot Enterprise's internal bridge, several internal platform teams' homebrew gateways). Flip on the Custom API Endpoint toggle in Settings, paste the URL, and restart the bridge (the Settings toggle calls `chatProvider?.restartBridgeForEndpointChange()` on save). Fazm's tool surface (accessibility tree, not screenshots) is routed through the new endpoint unchanged.
Is this screenshot-based computer use?
No. Fazm's desktop control path is mcp-server-macos-use, a native Swift/ObjC binary bundled in the app that calls AXUIElementCreateApplication and AXUIElementCopyAttributeValue directly. The tool surface any model sees is a structured accessibility tree (roles, labels, bounds) formatted as text, not a pixel buffer. Swapping the model via ANTHROPIC_BASE_URL does not change the tool surface. You are not retraining against a new screenshot distribution every time a new weight drops.
What was in Fazm v2.2.0 specifically, and when was it cut?
v2.2.0 was released on 2026-04-11 (commit 1a24eaa7, 'Release changelog for v2.2.0', 2026-04-11 01:53:32 UTC). The release notes in CHANGELOG.json lines 37-49 call out: custom API endpoint setting for proxies and corporate gateways (the headline feature), global shortcut Command-Shift-N to open a new pop-out chat window, paywall copy that highlights full desktop control, a 600ms debounce on the typing indicator to stop flicker during retries, founder-chat crash-loop fix on repeated rate-limit failures, and fixes for pop-out windows not restoring after update and suggested replies leaking across chat sessions. v2.2.1 followed on April 12 with a single targeted fix for duplicate AI bubbles in the pop-out window during follow-up questions.
What is the Agent Client Protocol and why does the endpoint change matter for it?
ACP (@agentclientprotocol/claude-agent-acp) is the wire protocol the Fazm Mac app uses to talk to its acp-bridge child process, which in turn talks to Claude (or any endpoint ANTHROPIC_BASE_URL points at). On April 11-12 Fazm was running ACP 0.25.0 (per v2.1.2 notes on April 7); the SDK got bumped later in the month. The important property for this article is that ACP is the reason the endpoint switch is cheap: all model traffic goes through one child process, and that child process reads ANTHROPIC_BASE_URL from its environment at spawn. Restart the bridge, the new endpoint is active. No app rebuild, no re-auth flow.
Can I verify every claim on this page from the local source tree?
Yes. Four files, no marketing. /Users/matthewdi/fazm/Desktop/Sources/Chat/ACPBridge.swift lines 379-382 (the env injection). /Users/matthewdi/fazm/Desktop/Sources/MainWindow/Pages/SettingsPage.swift lines 840 and 906-952 (the @AppStorage key and the UI). /Users/matthewdi/fazm/CHANGELOG.json lines 37-49 (v2.2.0 release notes with the April 11 date). git log --all --since='2026-04-11' --until='2026-04-12 23:59' in the fazm repo, which shows the v2.2.0 release commit, the twelve Vertex-removal commits clustered at 16:52-16:53 PT on April 12, and the v2.2.1 changelog commit at 20:10 UTC on April 12.
Why did Fazm remove Vertex AI when Google Cloud customers still need it?
Because the custom-endpoint override covers that use case in fewer lines. Anyone who was hitting Claude via Google Vertex AI's Anthropic models can set ANTHROPIC_BASE_URL to their Vertex proxy (or to an internal LiteLLM instance that speaks to Vertex) and keep working. The cost of maintaining a first-class Vertex rail was two files and an auth path that was unique to Google (service-account JWTs, per-project quotas, region pinning). The cost of maintaining ANTHROPIC_BASE_URL is three lines in ACPBridge.swift and a UserDefaults key. The simplification also makes the consumer story legible: there are two built-in routes (your Claude Pro/Max subscription or Fazm's bundled key) and one override for everything else.
Which of the April 11-12 releases is the best fit to route through Fazm?
For desktop-automation tool calls specifically, Codestral 2 (Apache 2.0) is strong because it was trained heavily on tool-use traces and runs well on consumer GPUs via vLLM or llama.cpp-server; a local server wrapped by LiteLLM's Claude-compatible endpoint gives you a zero-cost route. Llama 4 Maverick is the better fit if you want reasoning quality close to Claude Sonnet. Qwen 3 has the best multilingual behavior if your automations cross into non-English UI text. GLM-5.1 quantizations are the smallest footprint. Regardless of which you pick, the Fazm-side change is the same: paste the endpoint URL into Settings > Custom API Endpoint, restart the bridge, watch /tmp/fazm-dev.log for the 'anthropic_base_url set' entry in the bridge spawn env.
What happens if the custom endpoint goes down?
ACPBridge surfaces the connection error through the normal error path the UI uses for Anthropic outages (the same path that handles rate limits and credit exhaustion since v2.1.2). There is no silent fallback to the built-in key; the user sees the error and can either toggle Custom API Endpoint off, which drops ANTHROPIC_BASE_URL from the bridge env on its next spawn, or they can fix the endpoint and hit Send again. The April 12 Vertex removal is what makes this behavior deterministic: there is no third rail to half-silently fall through.
Comments (••)
Leave a comment to see what others are saying.Public and anonymous. No signup.