Skip to content

Apple Silicon on macOS 26 or later only; 0.16.9 - #24

Merged
belugaming merged 8 commits into
mainfrom
claude/admiring-lovelace-9rinej
Oct 9, 2026
Merged

belugaming merged 8 commits into
mainfrom
claude/admiring-lovelace-9rinej

Conversation

@belugaming

Copy link
Copy Markdown
Owner

The app now needs an Apple Silicon Mac running macOS 26 or later. The local engines (MLX) need Apple Silicon anyway, and every Apple Silicon Mac can run macOS 26.

Build and release

  • project.yml:
    • The deployment target and LSMinimumSystemVersion are now 26.0.
    • ARCHS: arm64 is set in every configuration, so no build carries an Intel slice.
  • CI builds and tests only on macOS 27 with Xcode 27; the macOS 15 / Xcode 26.2 job is removed.
  • The release builds one DMG, ClassNote-<version>-arm64.dmg. The x86_64 build and the macOS 15 runner it needed are removed.
  • The README states the new requirements and the single DMG.

Code that only older systems or Intel Macs needed

  • AppleSpeechSTT+Legacy.swift is deleted (328 lines). It was the SFSpeechRecognizer path for macOS 14–25. Apple's on-device speech now always uses SpeechAnalyzer, which macOS 26 and later already used.
  • Apple Translation no longer has macOS 15 and 26 availability checks:
    • An installed language pair always gets a TranslationSession(installedSource:target:) directly.
    • The bridge view is still used for pairs that have not been downloaded yet, because it is what shows the system's download prompt.
  • BottomFollow no longer needs its macOS 14 fallback. On every supported system, scrolling up stops the live transcript and Ask AI answers from following the end.
  • PythonProvisioner no longer refuses Intel Macs, and its now-unused message is removed.

Version 0.16.9 (build 27).

🤖 Generated with Claude Code

https://claude.ai/code/session_01UP49VoRGBw2wv1CEAroky7


Generated by Claude Code

claude added 8 commits October 9, 2026 05:05
…oming in

The live window scrolled to its end on every new word, and the Q&A on every
token of an answer, several times a second, so scrolling up was undone at
once and the page looked like it could not be scrolled. Both now follow the
end only while the reader is at it: scrolling up stops following, getting
back to the end resumes it, and asking a question follows the answer. macOS
14 cannot read a scroll view's position, so it follows as before.

The live window's sentences are Equatable on what they show, so a word
added to the line still being spoken no longer redraws every sentence on
screen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UP49VoRGBw2wv1CEAroky7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UP49VoRGBw2wv1CEAroky7
On macOS 27 a ProMotion panel does not settle on one refresh rate while a
SwiftUI view scrolls: it flips between 120 Hz and 60 Hz, each frame stays
on screen for an unpredictable time, and every page judders, plain text
included (FB24091347, Developer Forums thread 840214). The only confirmed
workaround is setting the whole display to 60 Hz.

An app can say which rate it wants: a display link with a preferred
frame-rate range is that request. One now runs from the first scroll event
until shortly after the last, momentum included, asking for 120 Hz, and
pauses when the page stops. `defaults write com.beluga.classnote
scrollFrameRate -int 60` asks for a steady 60 Hz instead and `0` turns it
off, from the next launch, so the two can be compared without a new build.

Version 0.16.6 (build 24).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UP49VoRGBw2wv1CEAroky7
…ter rows; 0.16.8

Formulas. MarkdownView drew every formula as two live MTMathUILabels (one
in a horizontal scroll view) that parsed their LaTeX on every update and
ran the whole typesetter on every size query, so a paragraph of notes with
formulas built a dozen AppKit views and typeset each formula several times
as it scrolled into view. MarkdownView 3.0.0 is now a copy in
Packages/MarkdownView with that one part changed: a formula is typeset
once with SwiftMath's MTMathImage, cached, and drawn as an image, scaled
to fit when wider than its line. PATCHES.md says what changed and how to
update the copy. A test renders x² through the app's Markdown view and
checks from the pixels that it is drawn, typeset and the right way up.

Refresh rate. The scrolling request asks for the most the window's screen
can show (144 Hz on such a monitor, not 120) and asks nothing of a 60 Hz
screen, which has no other rate to settle on.

Transcript. Sentences are grouped once per change to the transcript, not
on every redraw (a streamed token included), and a row draws its rounded
background only while it is highlighted or under the pointer instead of a
clear one behind every row.

Session list and dates. Date formatters are made once per template and
language rather than one per row, and the list groups sessions by day once
per redraw instead of once per day.

Version 0.16.8 (build 26).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UP49VoRGBw2wv1CEAroky7
The branch still carried #21's commits, which main has as a squash; this
keeps the branch's files exactly as they were.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UP49VoRGBw2wv1CEAroky7
MarkdownView already declares it (Image++.swift), so a second one in
SwiftMathView.swift did not compile.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UP49VoRGBw2wv1CEAroky7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UP49VoRGBw2wv1CEAroky7
The app now needs an Apple Silicon Mac on macOS 26: the local engines
(MLX) need Apple Silicon anyway, and every Apple Silicon Mac can run
macOS 26. project.yml raises the deployment target and the minimum system
version to 26.0 and builds arm64 only, in every configuration.

CI builds and tests on macOS 27 with Xcode 27 alone; the macOS 15 /
Xcode 26.2 job is gone. The release builds one DMG, for Apple Silicon;
the Intel build, and the macOS 15 runner it needed, are gone.

What only older systems or Intel Macs needed goes with them:
- The SFSpeechRecognizer path for macOS 14-25 (AppleSpeechSTT+Legacy);
  Apple's on-device speech always uses SpeechAnalyzer now.
- The macOS 15 and 26 availability checks around Apple Translation: an
  installed language pair always gets a session directly, and the bridge
  view is there for pairs still to be downloaded.
- The macOS 14 fallback in BottomFollow, so a reader scrolling up always
  stops the live transcript and answers from following the end.
- The Python provisioner's Intel refusal and its message.

README states the new requirements and the single DMG.

Version 0.16.9 (build 27).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UP49VoRGBw2wv1CEAroky7
@belugaming
belugaming merged commit ad1fed0 into main Oct 9, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants