← Back to PRs

#12157: feat(macos): add Granola-style meeting notes with live transcription

by npow open 2026-02-08 22:53 View on GitHub →
app: macos stale
## Summary Adds a full meeting notes feature to the macOS menu bar app, inspired by [Granola](https://granola.so): - **Live transcription** during meetings using WhisperKit (local, on-device) or Apple Speech - **Auto-start/stop** meeting notes when joining/leaving calls (mic activity detection via CoreAudio polling) - **Calendar integration** — auto-start for scheduled meetings with 2+ attendees - **Markdown storage** with optional Google Drive sync - **Standalone Meeting Notes window** for browsing past meetings (extracted from Settings) - **Menu bar recording indicator** — red dot on critter icon + separate timer status item with stop/open controls - **Ad-hoc detection** — polls `kAudioDevicePropertyDeviceIsRunningSomewhere` across all input devices; uses pause-probe to distinguish own transcriber from meeting app mic usage ### Key files | File | Purpose | |------|---------| | `MeetingDetector.swift` | Calendar monitoring, mic polling, auto-start/stop logic | | `MeetingSession.swift` | Session model with segments, duration, speaker attribution | | `MeetingStore.swift` | Markdown persistence + Google Drive sync | | `MeetingTranscriber.swift` | Apple Speech engine (SFSpeechRecognizer + ScreenCaptureKit) | | `WhisperTranscriber.swift` | WhisperKit local engine with model management | | `MeetingSettings.swift` | Settings tab for engine selection, model downloads, sync config | | `MeetingNotesWindow.swift` | Standalone past-meetings browser (HSplitView) | | `MeetingMenuItems.swift` | Menu bar start/stop/past-meetings buttons | | `MeetingRecordingStatusItem.swift` | Live timer NSStatusItem with stop/open menu | ## AI-assisted - [x] AI-assisted (Claude Code) - [x] Lightly tested — verified on macOS with Google Meet calls - [x] I understand what the code does ## Test plan - [x] Enable "Meeting Notes" in Settings → Meetings - [x] Join a Google Meet / Zoom / FaceTime call — meeting notes should auto-start within ~2s - [x] Verify live transcription appears (WhisperKit processes 5s chunks) - [x] Leave the call — recording should auto-stop within ~20s (2 consecutive idle probes) - [x] Check menu bar: red dot on critter icon during recording, timer status item with stop/open - [x] Open "Past Meetings" from menu bar or Settings — standalone window with transcript browser - [x] Delete meetings via multi-select + Delete key - [x] Switch transcription engine in Settings (Whisper ↔ Apple Speech) 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- greptile_comment --> <h2>Greptile Overview</h2> <h3>Greptile Summary</h3> This PR introduces a macOS “Meeting Notes” feature: calendar + microphone-based meeting detection, live transcription via WhisperKit or Apple Speech, markdown persistence with optional Google Drive sync, a standalone past-meetings browser window, and new menu bar/status-item UI to control/indicate recording. Key new components include `MeetingDetector` (auto start/stop orchestration), `MeetingSession` (segment model), `MeetingStore` (markdown save/load + sync), `MeetingTranscriber`/`WhisperTranscriber` (engines), and associated settings/menu/window/status-item views. Existing UI is updated to show a recording indicator on the critter icon and to surface meeting controls when enabled. <h3>Confidence Score: 3/5</h3> - This PR is close, but has correctness issues that should be fixed before merge. - Score reduced due to a failing/incorrect unit test expectation, and meeting persistence issues where metadata can be silently lost or misparsed from frontmatter (titles containing ':'). There is also a lifecycle issue where the status-item watcher can spawn duplicate polling tasks if started multiple times. - apps/macos/Sources/OpenClaw/MeetingStore.swift, apps/macos/Tests/OpenClawIPCTests/MeetingSessionTests.swift, apps/macos/Sources/OpenClaw/MeetingRecordingStatusItem.swift <!-- greptile_other_comments_section --> <sub>(2/5) Greptile learns from your feedback when you react with thumbs up/down!</sub> <!-- /greptile_comment -->

Most Similar PRs