feat(imports): connect meeting history via OAuth and CLI - #6949
Conversation
Add a Nango Zoom OAuth flow on the meeting-import screen so Zoom can Connect & import like Granola, fetching cloud recordings, transcripts, and summaries through POST /zoom/import-meetings. Co-authored-by: John Jeong <ComputelessComputer@users.noreply.github.com>
✅ Deploy Preview for anarlog canceled.
|
Add Nango OAuth Connect & import for the remaining transcript sources, using the same desktop sync path as Zoom. Fathom, Webex, Google Meet, and Teams get dedicated import routes; Notion meeting notes reuse the existing Notion connection with a newer API version. Co-authored-by: John Jeong <ComputelessComputer@users.noreply.github.com>
Plaud is the only CLI-only source. Connect & import now resolves `plaud`, runs login when needed, then lists recordings and pulls transcript/summary stdout into the existing import parser. No agent loop. Co-authored-by: John Jeong <ComputelessComputer@users.noreply.github.com>
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 2 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 373bbd5. Configure here.
| headers, | ||
| ); | ||
| await cancelNangoConnectionIfRequested(signal); | ||
| return waitForNangoConnection(provider.name, integrationId, headers, signal); |
There was a problem hiding this comment.
Failed OAuth still waits five minutes
Medium Severity
connectNangoImport always polls Nango after openIntegrationUrl, but that helper swallows failures (toast only, no throw). If session creation or the browser open fails, the UI still waits until the five-minute timeout instead of stopping on the error already shown.
Reviewed by Cursor Bugbot for commit 373bbd5. Configure here.
| } | ||
| tokio::time::sleep(Duration::from_millis(100)).await; | ||
| } | ||
| } |
There was a problem hiding this comment.
Plaud login URL wait is too short
Medium Severity
Plaud login is spawned with piped stdio and CI=1 so the CLI should print a URL instead of opening a browser, but the URL is only waited on for five seconds. If the line is delayed or stdout-buffered, authorizationUrl stays empty, the desktop app never opens the link, and login waits until it times out.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 373bbd5. Configure here.


Zoom, Fathom, Notion AI Meeting Notes, Webex, Microsoft Teams, and Google Meet now use Connect & import via Nango OAuth. Plaud, the only CLI-only source, now uses the same button by running the official
plaudCLI locally — no agent loop.What changed
POST /zoom/import-meetings— Zoom cloud recordings, optional AI summaries, VTT transcripts (~6 months)POST /fathom/import-meetings— Fathom meetings plus per-recording transcript/summaryPOST /notion/import-meetings— Notion AI meeting notes (reuses the existing Notion connection; uses Notion-Version2026-03-11for this path only)POST /webex/import-meetings— Webex meeting transcripts (VTT)POST /google-meet/import-meetings— Google Meet conference records and transcript entries (~30 day retention)POST /microsoft-teams/import-meetings— Teams calendar online meetings and VTT transcriptsplaudon PATH (and common Node.js bin folders), runsplaud loginwhen needed, thenplaud files/file/transcript/summary. Output is parsed deterministically into the existing import JSON. Requires@plaud-ai/cli(npm install -g @plaud-ai/cli).Nango session creation and the OAuth import routes are Pro-gated, like other Nango integrations. Plaud stays local (CLI tokens in
~/.plaud).Scopes / ops notes
user:read:user cloud_recording:read:list_user_recordings meeting:read:summary(user-managed OAuth app)public_api(Nangofathom; OAuth apps cannot inline transcript/summary on list)spark:people_read meeting:schedules_read meeting:transcripts_readhttps://www.googleapis.com/auth/meetings.space.readonlyoffline_access User.Read Calendars.Read OnlineMeetings.Read OnlineMeetingTranscript.Read.All(work/school accounts;OnlineMeetingTranscript.Read.Allneeds admin consent)plaudbinary; does not shell out to arbitrary commands.Testing
cargo test -p meeting-import --libcargo clippy -p meeting-import --locked -- -D warningscargo test -p api-nango --libcargo clippy -p meeting-import -p api-meeting-import -p api-notion -p api-nango --locked -- -D warningscargo test -p api gen_openapi_jsonandopenapi::tests::nango_meeting_import_paths_are_protectedpnpm -F desktop typecheckandpnpm -F desktop test(3222 passed)pnpm exec oxlint --quiet --format=github apps/desktop/src/pnpm -F web typecheckandpnpm -F desktop i18n:checkcargo clippy -p tauri-plugin-importerwas skipped here (this pod has GTK runtime but notgdk-3.0.pc/ gtk-dev headers). CI macOS/Linux desktop jobs have those libs.