Skip to content

feat(macos): merge the native Mac app into v2.2 - #103

Merged
bisonbet merged 33 commits into
v2.2from
native-macos
Jul 22, 2026
Merged

feat(macos): merge the native Mac app into v2.2#103
bisonbet merged 33 commits into
v2.2from
native-macos

Conversation

@bisonbet

Copy link
Copy Markdown
Owner

Summary

  • adds the first-class native macOS app target while retaining green iOS and Mac Catalyst products
  • implements native microphone and ScreenCaptureKit recording, input selection and reconnect recovery, background processing, file import/export, sharing, and Mac window conventions
  • preserves the existing Catalyst data container, recordings, transcripts, summaries, documents, and settings during the native-app transition
  • repairs native Settings destinations and sheet layouts, adds the Mac-only Ternary Bonsai 27B MLX option, retains model reasoning internally while removing it from user-facing summaries, and modernizes transcript/summary archive browsing
  • prepares the beta as version 2.2 build 9

Why

The Catalyst application carries platform-specific recording, navigation, windowing, and lifecycle limitations that prevent a consistently native Mac experience. This branch moves those paths to native macOS implementations while keeping shared data and cross-platform behavior intact.

The latest archive changes also remove the pushed-list disclosure pattern that could wedge the Mac responder chain. The Mac landing pages now show the three newest summaries or transcripts and expand older, non-empty month sections inline.

Impact

Mac users receive a native application with Mac-appropriate windows, sheets, device handling, long-running processing, and local MLX inference. Existing Catalyst data remains available under the same bundle container. iOS and Mac Catalyst continue to compile from the shared codebase during the beta/cutover period.

Validation

  • native macOS Debug build: passed
  • Mac Catalyst Debug build: passed
  • iOS Simulator Debug compatibility build: passed
  • Swift syntax parsing and git diff --check: passed
  • populated Catalyst-to-native data-continuity check: passed; see docs/macos-phase-4.1-data-continuity-report.md
  • manual summary and transcript archive expansion check: passed without the prior freeze
  • remote branch SHA verified at 1a952f3fa196142a71e9095ccddfceb6f5cd867b

Remaining beta QA

This is intentionally a draft for Phase 4.2 TestFlight/real-world soak. Outstanding signed-app checks include microphone changes during recording, long hidden-window transcription and summarization, archive bookmark restoration after relaunch, and the full Settings destination walkthrough.

bisonbet and others added 30 commits July 18, 2026 18:01
Carried over from working tree when branching native-macos off v2.2.
Not part of the macOS migration work; preserved here so migration
commits stay clean. Cherry-pick to v2.2 if needed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Agent-executable plan: phases 0-4 with per-task verification loops,
exit criteria, and the categorized 74-site Catalyst-conditional punch
list. Phase 0 (cross-platform groundwork) starts on this branch.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Delete the SFSafariViewController wrapper and the sheet/onChange
Catalyst fallback dance at all three call sites. Help and console
links now open via the openURL environment on every platform,
removing six targetEnvironment(macCatalyst) conditionals.

Verified: iOS Simulator and Mac Catalyst builds green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replace the UIDocumentPickerViewController wrappers with cross-platform
SwiftUI: audio/transcript import now uses .fileImporter (with
security-scoped access held for the whole import), archive/audio export
uses .fileMover (same move-from-staging semantics as forExporting:).
Deletes DocumentPickerCoordinator.swift and DocumentExportPicker.swift.

Behavior note: fileImporter returns security-scoped URLs instead of
asCopy:true local copies; access is wrapped at the call site so the
import managers are unchanged. Manual QA: audio import, transcript
import, archive-to-iCloud export on both iOS and Catalyst.

Verified: iOS Simulator and Mac Catalyst builds green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New Platform/PlatformApp.swift provides PlatformApp (open/canOpen,
isActive/isInBackground/isProtectedDataAvailable), PlatformLifecycle
(notification names), and PlatformBackgroundTask (begin/end/remaining)
as cross-platform facades. UIKit-backed on iOS/Catalyst; native macOS
implementations land in Phase 2 (NSWorkspace, ProcessInfo activities,
NSApplication notifications).

Migrated call sites in SummaryManager, EnhancedTranscriptionManager,
BackgroundProcessingManager, WyomingWhisperClient, OnDeviceLLMEngine,
MLXSwiftEngine, SummariesView, SystemIntegrationManager, SettingsView,
BisonNotesAIApp, AudioRecorderViewModel(+Background/+Interruptions).
Left as-is by design: AppDelegate/app-entry delegate adaptor,
WatchConnectivityManager (iOS-only), and the four window-scene share
sheet sites (port in Phase 2.5).

Verified: iOS Simulator + Mac Catalyst builds green, unit tests pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
v2.2's 8c5a2a6 carries the same accessibility WIP already preserved
here as 294b723. Conflicts were the Phase 0.2 picker refactor vs the
old picker code (kept the fileImporter version) and the generated
SwiftLint baseline (took v2.2's). Net tree change vs previous HEAD:
SwiftLintBaseline.json only.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adds a native macOS app target 'BisonNotes AI macOS' (same bundle ID,
same synced source group, same SPM deps + llama.xcframework, Catalyst
entitlements) plus a shared scheme. Fences iOS-only APIs behind
#if os(iOS) / canImport(UIKit) and extends the Platform shim layer so
the shared SwiftUI/Core Data codebase compiles natively.

Platform layer additions:
- PlatformApp: NSWorkspace open, NSApplication lifecycle notifications,
  PlatformDevice (isRunningOnMac, vendorIdentifier), PlatformPasteboard,
  PlatformAlert (NSAlert/UIAlertController), PlatformBackgroundTask macOS no-ops
- PlatformColors: UIKit system color names -> AppKit dynamic colors
- PlatformViewShims: toolbar placements, nav-bar/keyboard modifiers,
  fullScreenCover->sheet, page/wheel picker styles

Stubbed for Phase 2 (marked TODO(macos-phase2)): AVAudioSession stack
(Core Audio, §2.2/2.3), PDF/RTF export and share sheet (§2.5).
AppDelegate split into AppDelegateCore + UIKit/AppKit adaptor subclasses.

Verified green: macOS native, iOS Simulator, and Mac Catalyst builds.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Ignore ScreenCaptureKit tracks that contain only digital silence, mix directly from the PCM microphone scratch recording, and apply safe two-source gain staging.

Co-authored-by: OpenAI Codex <codex@openai.com>
Replace Mac background-task placeholders with ProcessInfo activities, remove iOS expiration and scheduler ceremony from Mac builds, and advance the migration plan through Phase 2.4.

Co-authored-by: OpenAI Codex <codex@openai.com>
Generate native RTF and paginated PDF summaries with AppKit and Core Text, present summary and diagnostic files through NSSharingServicePicker, and advance the migration plan through Phase 2.5.

Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Use a single native scroll owner for transcript segments and add explicit Done and Escape dismissal for summaries opened from the transcript window.

Co-authored-by: OpenAI Codex <codex@openai.com>
Record native Share extension, WidgetKit, and App Intent parity; link the two deferred extension follow-ups and retain signed shortcut runtime QA.

Co-authored-by: OpenAI Codex <codex@openai.com>
Regenerate the baseline from the full current source tree so the normal lint gate reports only new violations after the Phase 2 and Phase 3 file growth.

Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
bisonbet and others added 3 commits July 20, 2026 21:57
Expose the 27B MLX model only in the native macOS catalog and document its storage and memory requirements.

Co-authored-by: OpenAI Codex <codex@openai.com>
Use a single native Settings navigation hierarchy with Mac-specific layouts for MLX and acknowledgements, while preserving iOS and Catalyst presentation behavior.

Keep Bonsai 27B thinking enabled with a hidden reasoning budget, strip reasoning before parsing, and cover summary, task, reminder, and title extraction with focused tests.

Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
@bisonbet
bisonbet marked this pull request as ready for review July 22, 2026 01:14
@bisonbet

Copy link
Copy Markdown
Owner Author

@copilot can you review this PR?

@bisonbet
bisonbet merged commit 30ff728 into v2.2 Jul 22, 2026
1 check passed
@bisonbet
bisonbet deleted the native-macos branch July 22, 2026 01:30
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.

1 participant