-
Notifications
You must be signed in to change notification settings - Fork 2
feat: integrate Recall SDK for meeting detection and recording #65
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Conversation
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
Contributor
Author
This stack of pull requests is managed by Graphite. Learn more about stacking. |
68ae01b to
5ffb727
Compare
10 tasks
5ffb727 to
b5f4955
Compare
f7f85a9 to
ef6bc29
Compare
ef6bc29 to
21f1235
Compare
Add Recall.ai Desktop SDK integration for automatic detection and recording of Zoom, Teams, and Google Meet meetings with real-time status updates and management UI. Features: - Automatic meeting detection (Zoom/Teams/Google Meet) - Recording lifecycle with status updates (recording → uploading → processing) - Notetaker UI for viewing and managing recordings - PostHog backend integration for storage and backup - IPC handlers for renderer/main process communication Security: - Proper URL hostname validation (prevents substring injection) - UUID validation for recording IDs (prevents path traversal) - Title-based detection only as fallback with warning logs Architecture: - Recall SDK runs in main process with event listeners - PostHog API client for CRUD operations on recordings - Zustand store for UI state management - Status updates via IPC from main to renderer Configuration: - Vite: externalize Recall SDK (prevent bundling) - Forge: unpack Recall SDK from asar archive - Initialize SDK automatically on authentication This PR implements Phase 1B of the desktop recordings feature, providing the foundation for future transcript streaming and note-taking capabilities.
21f1235 to
6625edc
Compare
This was referenced Oct 29, 2025
jonathanlab
approved these changes
Oct 29, 2025
Contributor
jonathanlab
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great stuff, I like the IDB usage 🚢
Contributor
Author
Merge activity
|
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.

Notetaker: Meeting Recording & Transcription
Automatic recording and transcription for Google Meet, Zoom, Teams, and Slack.
Architecture
Key decision: Zustand is the single source of truth. Main process only coordinates.
Why Zustand for state management:
flowchart TB subgraph Main["Main Process (recallRecording.ts)"] Recall[Recall SDK] Flag[isRecording flag] Map[windowToRecordingMap] end subgraph Renderer["Renderer (recordingService.ts)"] Zustand[Zustand Store] Batch[Batch Upload<br/>10 segments or 10s] end Recall -->|meeting-detected| Flag Flag -->|if false| Recall Recall -->|IPC: events| Zustand Zustand -->|persist| IDB[(IndexedDB)] Zustand -->|subscribe| UI[React UI] Batch -->|segments| API[PostHog API] Zustand -.->|triggers| Batch style Zustand fill:#4CAF50 style Flag fill:#FFC107Data flows:
isRecording→ Creates recording in API → Sends IPC → Zustand stores → UI updatesState:
isRecording(deduplication),windowToRecordingMap(Recall SDK only provides windowId, we need to map it to our recordingId)Current Limitations
isRecordingflag prevents concurrent recordings (by design for v1)What to Review
Core files:
src/main/services/recallRecording.ts- Recall SDK integration, event forwardingsrc/renderer/services/recordingService.ts- IPC handlers, batch uploads, crash recoverysrc/renderer/stores/activeRecordingStore.ts- Recording state managementWatch for:
Schemas.DesktopRecordingfrom generated API (not custom interfaces)isRecordingboolean check (no IPC)Special thanks to @rafaeelaudibert on his tip to keep all Recall's state outside of React. ❤️