Repository navigation
Apple Silicon on macOS 26 or later only; 0.16.9 - #24
Merged
Merged
Conversation
…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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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:LSMinimumSystemVersionare now 26.0.ARCHS: arm64is set in every configuration, so no build carries an Intel slice.ClassNote-<version>-arm64.dmg. The x86_64 build and the macOS 15 runner it needed are removed.Code that only older systems or Intel Macs needed
AppleSpeechSTT+Legacy.swiftis deleted (328 lines). It was theSFSpeechRecognizerpath for macOS 14–25. Apple's on-device speech now always usesSpeechAnalyzer, which macOS 26 and later already used.TranslationSession(installedSource:target:)directly.BottomFollowno longer needs its macOS 14 fallback. On every supported system, scrolling up stops the live transcript and Ask AI answers from following the end.PythonProvisionerno 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