Libra CodeHub

CedarCopilot/cedar-mail

Branch: staging

feat(desktop): put meeting recording behind a build flag, off by default

merged#2611CedarCopilot

CedarCopilot wants to merge 1 commit into staging from fix/skip-agent-runs-for-warmup-traffic

Live on prod, no production signal yetTimeline and evidence
  1. Opened
    Aug 27, 2026, 9:36 PM
  2. Merged
    Aug 27, 2026, 9:48 PM
  3. Live on prod
    Aug 27, 2026, 9:48 PM
  4. Observed 3 days
    Aug 27, 2026, 9:48 PM
  5. Pipelines steady after this deploy
    Aug 27, 2026, 9:48 PM
  6. Aug 27, 2026, 10:08 PM
  7. Unobserved

    Live on prod, no production signal yet

    Aug 30, 2026, 9:22 PM

Behaviors Libra is checking

Desktop builds leave meeting recording off unless CEDAR_RECORDING=1 is set at build time, while the opt-in build keeps the recording stack enabled.Inconclusivelow confidence

OTEL fallback found no prod spans matching apps/desktop build (electron.vite.config.ts) since deploy.

prod, checked Aug 30, 2026, 3:44 PM
Recall recording controls safely return when the SDK or active meeting window is unavailable instead of dereferencing a missing SDK or issuing invalid window calls.Inconclusivelow confidence

OTEL fallback found no prod spans matching recallService.startRecording/stopRecording/pauseRecording/resumeRecording since deploy.

prod, checked Aug 30, 2026, 3:44 PM
When CEDAR_RECORDING=1 is used, the desktop package includes the Recall SDK and retains the GStreamer afterPack, split-ASAR, and signIgnore handling required for meeting recording.Inconclusivelow confidence

OTEL fallback found no prod spans matching electron-builder CEDAR_RECORDING=1 mac packaging since deploy.

prod, checked Aug 30, 2026, 7:22 PM
Recording-disabled desktop artifacts omit @recallai/desktop-sdk and its roughly 335 MB GStreamer.framework, reducing the default package size and removing the native SDK bundle.Inconclusivelow confidence

OTEL fallback found no prod spans matching electron-builder files packaging since deploy.

prod, checked Aug 30, 2026, 8:22 PM
A recording-disabled desktop app does not initialize the calendar service, so calendar-driven meeting auto-join is disabled.Inconclusivelow confidence

OTEL fallback found no prod spans matching Electron app.whenReady calendarService.init since deploy.

prod, checked Aug 30, 2026, 9:22 PM
A recording-disabled app does not register capture IPC handlers, so renderer requests cannot invoke Recall capture operations.Inconclusivelow confidence

Verification reached its budget before a verdict.

prod, checked Aug 28, 2026, 10:04 AM

Libra has verdicts on 0 of 11 tracked behaviors on prod; 11 are still being checked. Libra checks hourly for 3 days after each deploy.

What

The Mac app is meant to be the web app in a native shell. Meeting recording , the detection popup, the in-call UI, calendar auto-join, and the ⌘⇧A/S/D flag shortcuts , is now inert unless CEDAR_RECORDING=1 at build time. Nothing is deleted; the flag turns all of it back on.

Why this also unblocks releasing

The desktop app itself was never broken , it builds and runs today. The release pipeline is what's been failing since April (last published build is v0.1.27, 2026-04-01, while package.json had drifted to 0.1.32).

Two causes, both traceable to @recallai/desktop-sdk:

  1. Notarization returns HTTP 401 Invalid credentials , the APPLE_APP_SPECIFIC_PASSWORD secret is expired. Not fixed by this PR; it needs rotating at appleid.apple.com by whichever Apple ID sits in APPLE_ID (must be a member of team 2QR5XNJVRF).
  2. sign-gstreamer.cjs failed to sign all 102 GStreamer dylibs (no identity found) because its identity lookup misses CI's temp keychain. Even with valid credentials, notarization would likely reject those unsigned nested binaries.

The SDK bundles a ~335MB GStreamer.framework , the thing afterPack has to hand-sign, and the reason mergeASARs had to be disabled. With the flag clear it's excluded from the bundle entirely, so the standard signing path handles the whole app and both workarounds drop out.

How

  • __RECORDING_ENABLED__ build-time define, in both main and preload
  • services/recallSdk.ts (new) loads the SDK lazily , a top-level import would crash a disabled build on launch, since the package isn't in the bundle
  • Startup, IPC registration, and the global shortcuts all gate on the flag
  • Preload does the heavy lifting: the renderer decides whether recording exists purely by probing electronAPI.meetingRecorder and .callUI, so withholding those two keys disables every recording surface in the web app , with zero changes to apps/mail
  • electron-builder excludes @recallai/** and drops the afterPack / mergeASARs / signIgnore workarounds when the flag is clear

Verification

CheckResult
Disabled build@recallai absent from bundle; preload 5.95 kB → 0.91 kB
Disabled runtimeRuns, loads the web app; zero recall/calendar/popup log lines; no native binary spawned; tray, menu, deep links, updater unaffected
CEDAR_RECORDING=1Bundle size matches the previous build; require sits inside a function body, confirmed lazy
tsc --noEmit / oxlint --deny-warningsBoth clean

⚠️ Before merging

  • This PR is a single commit touching only apps/desktop , no other work rides along.
  • Merging to staging fires Desktop Release, which builds and publishes a v0.1.33-staging prerelease. It will still fail at notarization until the Apple credential is rotated.
  • Version bumped 0.1.32 → 0.1.33 so desktop-version-check passes.

Greptile Summary

The PR makes desktop meeting recording opt-in at build time and removes the Recall SDK and its native-signing workarounds from default packages.

  • Defines one recording flag for the Electron main and preload builds.
  • Gates recording startup, IPC handlers, global shortcuts, and renderer bridge capabilities.
  • Loads the Recall SDK lazily so disabled packages can omit it safely.
  • Conditionally applies Recall-specific packaging and signing settings.
  • Bumps the desktop package version to 0.1.33.

Confidence Score: 5/5

The PR appears safe to merge, with recording-disabled and recording-enabled paths consistently gated across packaging, startup, IPC, and preload boundaries.

Current renderer callers safely treat recording capabilities as optional, disabled builds omit both bridge methods and handlers, and no changed-code-triggered blocking or independently actionable issue remains.

Important Files Changed

FilenameOverview
apps/desktop/electron-builder.config.jsConditi
Show production surfaces and changed-file mapping

Production surfaces

Libra has not measured any production surfaces for this change yet.

Changed files → surfaces

  • apps/desktop/electron-builder.config.jsno production surface mapped
  • apps/desktop/electron.vite.config.tsno production surface mapped
  • apps/desktop/package.jsonno production surface mapped
  • apps/desktop/src/env.d.tsno production surface mapped
  • apps/desktop/src/main/index.tsno production surface mapped
  • apps/desktop/src/main/ipc/handlers/captureHandlers.tsno production surface mapped
  • apps/desktop/src/main/ipc/registerIPC.tsno production surface mapped
  • apps/desktop/src/main/services/recallSdk.tsno production surface mapped
  • apps/desktop/src/main/services/recallService.tsno production surface mapped
  • apps/desktop/src/preload/index.tsno production surface mapped