#12157: feat(macos): add Granola-style meeting notes with live transcription
app: macos
stale
Cluster:
Voice Transcription Enhancements
## 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
#9703: feat(macos): Voice settings restructure + Whisper transcription sup...
by nsd97 · 2026-02-05
76.8%
#11965: feat(ui): add speech-to-text dictation to web chat via Deepgram Flux
by billgetman · 2026-02-08
70.7%
#19828: feat: reply notifications for macOS and web UI
by fal3 · 2026-02-18
70.4%
#20155: feat(telegram): add tg-network-guard transcript status + reply flow
by artemgetmann · 2026-02-18
69.8%
#15909: Guard notifications on macOS; fix focus issue and build fixes
by jasonkneen · 2026-02-14
69.6%
#10898: fix(mac): adopt canonical session key and add reset triggers
by Nachx639 · 2026-02-07
68.7%
#9456: feat(mac): add enhanced Siri neural voice support for Talk mode
by teknomage8 · 2026-02-05
68.6%
#20475: fix(macos): resolve 120%+ CPU regression and gateway stability
by teknomage8 · 2026-02-19
68.2%
#21566: feat(voice-call): bridge call transcripts to main agent session
by MegaPhoenix92 · 2026-02-20
68.2%
#3474: fix(macos): menu bar activity badge not showing during agent work
by elektricM · 2026-01-28
68.1%