Shipping log · 2026-04-26 14:12 PT to 2026-04-27 15:25 PT

The past 25 hours of one MIT-licensed Mac AI agent, told in 13 commits.

Most articles about open source AI in the past day, 2026 are foundation model news. This one is the public git log of one consumer-facing repo, github.com/mediar-ai/fazm, between two release tags. Two numbered macOS releases, eleven commits in between, and two more bug fixes already on disk in main with their entries written into the unreleased section of CHANGELOG.json. Every line below maps to a public commit hash you can verify in under a minute.

M
Matthew Diakonov
11 min read

Anchor fact, verifiable in 30 seconds

The v2.5.0 release tag landed at 11:55:30 PT. Three hours, thirty minutes, and seventeen seconds later the unreleased changelog already had two new bullets in it.

Commit 555a27a6 (Release 2.5.0) is dated 2026-04-27 11:55:30 -0700. Commit 80764379 (Document pop-out debounce and paywall stale-response fixes in changelog) is dated 2026-04-27 15:25:47 -0700. Both are reachable from origin/main on the public repo. Run git log --pretty="%h %ci %s" to read the timeline yourself.

What every other roundup of the past day says

Read three different recaps of the April 26-27, 2026 window and you land on roughly the same list. Continued momentum on the early-April foundation model wave: Llama 4 Scout (April 2), Qwen 3 72B (April 5), Codestral 2 (April 8). OpenAI Codex Labs partner expansion. A handful of Hugging Face trending shifts. Maybe a vllm or llama.cpp point release if the writer is paying attention. None of those are shipping events that happened in the actual past 25 hours.

What is missing from those recaps is the smaller, faster layer of open source AI: consumer-facing apps you can install, that ship on an app cadence rather than a research cadence. The one I have full commit visibility into is Fazm, an MIT-licensed Mac AI agent that reads the focused window through the macOS accessibility tree instead of through screenshots, and ships as a signed, notarized DMG. In the past 25 hours, that repo did 13 commits and two numbered releases. Here they are, in order.

The shipping day, as a sequence of who-talks-to-what

Maintainergit mainCHANGELOGRelease tagApr 26 14:12 - release 2.4.2 committag v2.4.2-macos pushed10 fixes land overnight + morning11:41 - write 2.5.0 bullets to unreleased11:55 - release 2.5.0 committag v2.5.0-macos pushedunreleased emptied, releases prepended15:24 - paywall fix + debounce land15:25 - write 2 bullets back into unreleased

The 13 commits, in order

Every entry below is a real commit on origin/main. Hashes are full seven-character prefixes; full SHAs and diffs are public. Times are commit date, US Pacific.

1

2026-04-26 14:12:38 PT - bdf57afd: Release 2.4.2

The v2.4.2 patch tag closes the v2.4 line. Stripe cancel redirect, workspace picker label, Custom API Endpoint help text, Opus model migration. Four bullets, all bug-fix-flavored. Patch bump because nothing visible-to-user changed in product surface area, only behavior.

2

2026-04-26 16:02:02 PT - be29a3c7: SQL tool description for observer_activity

Documentation-only commit on the SQL tool's prompt description. Calls out the observer_activity schema notes so the agent's SQL tool knows the column shapes. Lands the same hour as a docs sweep, not part of a release.

3

2026-04-27 03:22:27 PT - 32c22764: Remove Help Center link from Settings

First commit of the new day. The Help Center surface was generating support tickets that bypassed the in-app feedback loop. The link is removed from the Settings page so users go through the in-app feedback path instead. Lands at 3:22 AM Pacific.

4

2026-04-27 08:32:10 PT - 9230188d: Pre-fill Stripe checkout email

27 lines to Backend/src/routes/stripe.rs. The Stripe customer creation now pulls the user's Firebase email and passes it as the customer_email field on the Checkout Session, so a paying user does not have to retype their email at the paywall.

5

2026-04-27 09:50:12 PT - 6f5b5d02: Promo code support in Stripe checkout

3 lines to the same stripe.rs file. allow_promotion_codes flips from false to true on the Checkout Session. Pairs with the referral surface added in v2.4.0 so that referred users actually see the redemption box at checkout.

6

2026-04-27 11:40:15 PT - 8ba4fd42: Add browser overlay assets to bundle

codemagic.yaml change. The browser-control overlay's asset files were missing from the production app bundle in v2.4.x, so the overlay never rendered when Fazm controlled a browser tab. The asset path is added to the bundling step.

7

2026-04-27 11:41:09 PT - 6a251a0c: Document restored browser overlay

CHANGELOG.json edit. The bullet 'Restored the browser overlay that signals when Fazm is controlling a browser tab' is added to the unreleased array in preparation for the v2.5.0 cut.

8

2026-04-27 11:48:16 PT - 2328dfb6: Persist stranded and timed-out chat messages

55 lines to Providers/ChatProvider.swift. The bug: a chat message that timed out or hit a streaming error would not be persisted to the local message DB, so on app restart the user saw a hole in their chat history where the failed exchange used to be. Fix: the error path now writes the message before the early return.

9

2026-04-27 11:48:45 PT - 81fdb5be: Prevent duplicate error suffix

9 lines to FloatingControlBar/ChatQueryLifecycle.swift. ChatProvider's catch block already appends a warning suffix to the message and persists it; the in-state appender did the same, doubling up the warning text. Fix: only append the suffix if it is not already at the end of the current text.

10

2026-04-27 11:55:30 PT - 555a27a6: Release 2.5.0

The release tag. CHANGELOG.json's unreleased array is emptied and prepended as a new releases entry with version 2.5.0, date 2026-04-27, and the six bullets accumulated since v2.4.2. 21 hours and 43 minutes after the previous tag.

git show 555a27a6 --stat reports a single file changed: CHANGELOG.json, with 13 insertions and 3 deletions. The diff is the smallest possible: take the current unreleased array, prepend a new entry to releases, leave unreleased empty.
11

2026-04-27 15:24:01 PT - 10d20c98: Clear AI message on paywall

Three hours and twenty-eight and a half minutes after v2.5.0 ships, the first post-release fix lands. ChatQueryLifecycle.swift adds 6 lines: when the paywall blocks a message, set state.currentAIMessage to nil so the previous AI response stops looking like the answer to the new question.

12

2026-04-27 15:24:15 PT - 0d213118: Debounce duplicate pop-out chats

14 seconds later. FloatingControlBarWindow.swift adds a lastPopOutNewChatTime TimeInterval and a 1-second guard on popOutNewChat() so that two cmd-shift-N presses inside the debounce window do not produce two pop-out windows with the same chat history snapshot.

13

2026-04-27 15:25:47 PT - 80764379: Document the two fixes in unreleased

Three hours, thirty minutes, and seventeen seconds after the v2.5.0 tag, CHANGELOG.json's unreleased array is no longer empty. Two bullets are added: 'Fixed duplicate pop-out chat windows when the global shortcut fires twice in quick succession' and 'Fixed stale prior AI response showing under a paywall-blocked chat message'. The shipping log keeps moving.

v2.4.2 versus v2.5.0, by the release commit

The two release commits are the same shape (a single edit to CHANGELOG.json) but they describe different bodies of work. v2.4.2 is a four-bullet patch that closes the v2.4 line; v2.5.0 is a six-bullet minor that earns its bump on the restored browser control overlay. Side by side:

FeatureFazm v2.4.2Fazm v2.5.0
Tag commitbdf57afd555a27a6
Tag timestamp2026-04-26 14:12:38 -07002026-04-27 11:55:30 -0700
Bullets in CHANGELOG46
Headline changeSmart (Opus) preference persists after updateRestored browser-control overlay
Files touched (release commit)CHANGELOG.jsonCHANGELOG.json
Backend (Rust) commits in release02 (Stripe)
Pre-release commits (since prior tag)n/a10
Hours since prior numbered releasesince v2.4.1 on Apr 2221h 43m

What is in the unreleased array right now

The Keep-a-Changelog convention treats the top of the file as a staging area for commits that have landed in main but not yet shipped in a tagged release. As of commit 80764379 at 2026-04-27 15:25:47 PT, the array has two entries. Reproduced verbatim below from the on-disk file:

// CHANGELOG.json after commit 80764379, top of file
{
  "unreleased": [
    "Fixed duplicate pop-out chat windows when the global shortcut fires twice in quick succession",
    "Fixed stale prior AI response showing under a paywall-blocked chat message"
  ],
  "releases": [
    {
      "version": "2.5.0",
      "date": "2026-04-27",
      "changes": [
        "Restored the browser overlay that signals when Fazm is controlling a browser tab",
        "Fixed duplicate error text appearing at the end of AI responses",
        "Fixed timed-out and error messages not persisting after app restart",
        "Added promo code support to the subscription checkout",
        "Checkout now pre-fills your email address",
        "Removed the Help Center link from Settings"
      ]
    },
    {
      "version": "2.4.2",
      "date": "2026-04-26",
      "changes": [
        "Fixed Smart (Opus) model preference not persisting after app update - now correctly maps stored \"opus\" to the new ACP model ID",
        "Improved workspace directory picker: Open button now reads Select for clarity",
        "Updated Custom API Endpoint help text to mention local LLM bridges as an example",
        "Fixed Stripe checkout cancellation redirect - returning to the app after cancelling a subscription checkout no longer shows an error page"
      ]
    }
  ]
}

Both entries map to commits that exist in main today. The first entry is commit 0d213118; the second is commit 10d20c98. They will ship in v2.5.1 or v2.6.0 depending on what else lands first. Reading the unreleased section is how you can tell, ahead of any release notes blog post, what the maintainer thinks is wrong with the latest tagged version.

3h 30m 17s

Fixed duplicate pop-out chat windows when the global shortcut fires twice in quick succession. Fixed stale prior AI response showing under a paywall-blocked chat message.

CHANGELOG.json unreleased array, after commit 80764379

The actual diffs (the part you cannot read in any other recap)

Each of the two post-release fixes is small enough to fit on this page. Here is the paywall stale-response fix, commit 10d20c98:

commit 10d20c98 - Clear AI message to prevent stale response on paywall

// ChatQueryLifecycle.swift, before commit 10d20c98
} else if provider.showPaywall {
    return
}
-150% fewer lines

And here is the pop-out shortcut debounce fix, commit 0d213118. The debounce key is the wall-clock uptime, which avoids the cross-suspend skew you would get with a Date-based timestamp:

commit 0d213118 - Fix duplicate pop-out chats by debouncing global shortcut

// FloatingControlBarWindow.swift, before commit 0d213118
func popOutNewChat() {
    guard let provider = chatProvider else { return }

    log("FloatingControlBarManager: Creating new pop-out chat window via global shortcut")
    AnalyticsManager.shared.floatingBarChatPoppedOut(historyCount: 0)
    // ... creates a new pop-out window
}
-137% fewer lines

Why this matters more than another model headline

Foundation model releases get the press because they are loud, and the loud part is appropriate; a new generation of weights is actually a step change. But the part of open source AI that gets installed on actual computers and used by actual people is the outer ring: the apps, the local inference engines, the IDE plugins, the desktop agents. That ring ships on a dramatically shorter cadence and almost no one writes about it.

Two numbered releases inside one repo in a single day, plus two already-fixed bugs sitting in the unreleased section, is what one small slice of that outer ring actually looks like. The reason it can move at this speed is partly that the underlying model API populates dynamically (commit f9b8b2a in v2.4.0 made the available model list pull from the agent at runtime, so a new Claude or Sonnet variant ships without an app update) and partly that the Mac-side automation reads structure from accessibility APIs instead of pixels, so a Swift bug is the dominant kind of bug to fix, not a vision pipeline regression.

If you want to follow what is actually shipping in open source AI in any given day in 2026, watch the changelogs and unreleased sections of small repos. The signal-to-noise is significantly better than the hot-take feed. github.com/mediar-ai/fazm is one example. There are many.

Want to see how a Mac AI agent built on accessibility APIs actually works?

Book a 20-minute call. We will walk through the focused-window read path, the unreleased section of the changelog, and how to evaluate small open source AI projects on shipping cadence rather than star count.

Frequently asked questions

What actually shipped in open source AI in the past day, 2026?

Most aggregators for the April 26-27, 2026 window will name the same large-vendor stories: ongoing fallout from the early-April Llama 4, Qwen 3, and Codestral 2 releases, OpenAI Codex Labs partner expansion, and the steady churn on Hugging Face trending. None of those are software releases on April 26 or April 27 specifically. The actual release on April 26 in this corner of the open source ecosystem is Fazm v2.4.2 (commit bdf57afd at 14:12:38 -0700), an MIT-licensed consumer Mac AI agent. The actual release on April 27 is Fazm v2.5.0 (commit 555a27a6 at 11:55:30 -0700). Two numbered tags, 21 hours and 43 minutes apart, in the same repo.

Where can I verify the past 25 hours of commits myself?

Clone github.com/mediar-ai/fazm and run: git log --pretty='%h %ci %s' --since='2026-04-26 12:00' --until='2026-04-28 00:00'. You should see exactly 13 lines, starting with bdf57afd Release 2.4.2 at 14:12:38 -0700 on April 26 and ending with 80764379 Document pop-out debounce and paywall stale-response fixes in changelog at 15:25:47 -0700 on April 27. Every claim on this page maps to one of those 13 commit hashes.

Why is the unreleased changelog the most interesting part?

Because it is the part of a release log that is usually invisible. The v2.5.0 tag landed at 11:55:30 PT on April 27. By 15:25:47 PT the same day, three hours and thirty minutes and seventeen seconds later, commit 80764379 had added two new bullet points to the unreleased array in CHANGELOG.json: a fix for duplicate pop-out chat windows when the global shortcut fires twice in quick succession, and a fix for a stale prior AI response showing under a paywall-blocked chat message. Both fixes already exist in main as commits 0d213118 and 10d20c98. They will ship in v2.5.1 or v2.6.0, but they are real, reviewable, and on disk right now.

What was actually fixed in those two post-release commits?

Commit 10d20c98 (Clear AI message to prevent stale response on paywall) added 6 lines to ChatQueryLifecycle.swift. The bug: when a paywall-blocked chat message went through the post-send slice search, it set currentAIMessage to a stale prior AI response, making the new question look like it had received the old answer. Fix: set state.currentAIMessage = nil before the early return. Commit 0d213118 (Fix duplicate pop-out chats by debouncing global shortcut) added 14 lines to FloatingControlBarWindow.swift. The bug: the cmd-shift-N global shortcut for new pop-out chat could fire twice in quick succession (key repeat or impatient retap), creating two windows with the same chatHistory snapshot. Fix: a 1.0 second debounce keyed off ProcessInfo.processInfo.systemUptime.

What did Fazm v2.5.0 actually contain?

Six bullets in CHANGELOG.json under the 2.5.0 entry. (1) Restored the browser overlay that signals when Fazm is controlling a browser tab (ships via codemagic.yaml asset bundling, commit 8ba4fd42 at 11:40:15 PT). (2) Fixed duplicate error text appearing at the end of AI responses (commit 81fdb5be at 11:48:45 PT, 9 lines added to ChatQueryLifecycle.swift). (3) Fixed timed-out and error messages not persisting after app restart (commit 2328dfb6 at 11:48:16 PT, 55 lines to ChatProvider.swift). (4) Added promo code support to the subscription checkout (commit 6f5b5d02 at 09:50:12 PT, 3 lines to Backend/src/routes/stripe.rs). (5) Checkout now pre-fills your email address (commit 9230188d at 08:32:10 PT, 27 lines to stripe.rs). (6) Removed the Help Center link from Settings (commit 32c22764 at 03:22:27 PT). The release tag itself is commit 555a27a6 at 11:55:30 PT.

How does this 25-hour cadence compare to other open source AI releases?

The big-vendor open source releases in April 2026 ship on a slower cadence: Llama 4 Scout was a single drop on April 2, Qwen 3 72B on April 5, Codestral 2 on April 8. Inference engines (vllm, llama.cpp, mlx) ship on the order of a tagged release every few days to once a week. Consumer Mac AI app cadence is its own animal: Fazm tagged seven numbered macOS releases between April 11 (v2.2.0) and April 27 (v2.5.0), an average of roughly 2.3 days per release. The April 26 -> April 27 turn is a typical interval for this repo, not an unusual one, which is the point. The shipping log is real because it keeps happening.

What does this have to do with accessibility APIs and screen context?

Indirectly, a lot. Fazm reads the active app on your Mac through the macOS accessibility tree (AXUIElement, kAXFocusedWindowAttribute, role and label introspection) instead of through screenshots. That choice is what lets a single small team ship structural fixes (a paywall state desync, a pop-out chat debounce, a system prompt feature block) at an app-shipping cadence rather than a vision-pipeline-tuning cadence. The reason there are 13 commits in this 25-hour window and not 3 is that none of them required retraining or re-tuning a screen-grab model. They are Swift bugs in Swift files, fixed and tagged the same day.

Why did v2.4.2 ship on April 26 only one day before v2.5.0?

v2.4.2 was a four-bullet patch that focused on the Smart (Opus) model preference correctly persisting after the v2.4.0 ACP migration, the workspace directory picker label change from Open to Select, the Custom API Endpoint help text being clearer about local LLM bridges, and a Stripe checkout cancellation redirect fix. It is a stability release in the v2.4 line. v2.5.0 is the next minor version because it ships the restored browser overlay (a visible UI affordance, not a back-end fix). The release rule on this repo is that minor bumps gate on visible product changes; patch versions gate on bug fixes only.

Is the unreleased section in CHANGELOG.json a Fazm convention or something general?

It is a Fazm convention but it tracks the Keep a Changelog idea (keepachangelog.com) of an Unreleased section at the top of the file that holds changes which have landed in main but have not yet shipped in a tagged release. The mechanical implementation here: CHANGELOG.json is an object with an unreleased array (strings) and a releases array (objects with version, date, changes). The Unreleased -> tagged release transition is just a copy: the unreleased array is emptied, a new releases entry is prepended with the same strings as its changes field. You can see that exact transition in commit 555a27a6 itself.

What should I take away from one project's 25-hour shipping log?

Two things. First, the open source AI story most aggregators tell is dominated by foundation-model labs because those releases are loud and have press attached. The on-the-ground story of consumer-facing AI software is quieter and more frequent. Second, the unreleased section of a real changelog is a stronger signal than the latest release tag, because it shows what the maintainer thinks is wrong right now, not what they thought was wrong on release day. If you are evaluating an open source AI project, read CHANGELOG.json before you read the README; if there is no Unreleased section, ask why.