mainfeat(desktop): put meeting recording behind a build flag, off by default
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 global flag
shortcuts — is now inert unless CEDAR_RECORDING=1 at build time. Nothing is
deleted; the flag turns all of it back on.
This is also what unblocks releasing. @recallai/desktop-sdk bundles a ~335MB
GStreamer.framework whose nested Mach-O binaries afterPack has to hand-sign,
and which forces mergeASARs off. With the flag clear the package is excluded
from the bundle entirely, so the standard signing path handles the whole app
and those two workarounds drop out.
The SDK therefore must never be imported at module scope — a top-level import
would crash a disabled build on launch. services/recallSdk.ts loads it lazily
instead, and every caller already sits behind the flag.
The preload change does the rest of the work: 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 no changes to apps/mail.
Verified: disabled build drops @recallai from the bundle and takes preload from
5.95kB to 0.91kB; the app runs with no recall/calendar/popup activity and no
native binary spawned, while tray, menu, deep links and the updater are
unaffected. CEDAR_RECORDING=1 reproduces the previous bundle byte-for-byte in
size, with the require inside a function body. tsc and oxlint clean.
Co-Authored-By: Claude Opus 5 (1M context) <<email>>Aug 27, 2026, 9:35 PMpreloadfeat(desktop): put meeting recording behind a build flag, off by default
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 global flag
shortcuts — is now inert unless CEDAR_RECORDING=1 at build time. Nothing is
deleted; the flag turns all of it back on.
This is also what unblocks releasing. @recallai/desktop-sdk bundles a ~335MB
GStreamer.framework whose nested Mach-O binaries afterPack has to hand-sign,
and which forces mergeASARs off. With the flag clear the package is excluded
from the bundle entirely, so the standard signing path handles the whole app
and those two workarounds drop out.
The SDK therefore must never be imported at module scope — a top-level import
would crash a disabled build on launch. services/recallSdk.ts loads it lazily
instead, and every caller already sits behind the flag.
The preload change does the rest of the work: 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 no changes to apps/mail.
Verified: disabled build drops @recallai from the bundle and takes preload from
5.95kB to 0.91kB; the app runs with no recall/calendar/popup activity and no
native binary spawned, while tray, menu, deep links and the updater are
unaffected. CEDAR_RECORDING=1 reproduces the previous bundle byte-for-byte in
size, with the require inside a function body. tsc and oxlint clean.
Co-Authored-By: Claude Opus 5 (1M context) <<email>>Aug 27, 2026, 9:35 PMenv.d.tsfeat(desktop): put meeting recording behind a build flag, off by default
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 global flag
shortcuts — is now inert unless CEDAR_RECORDING=1 at build time. Nothing is
deleted; the flag turns all of it back on.
This is also what unblocks releasing. @recallai/desktop-sdk bundles a ~335MB
GStreamer.framework whose nested Mach-O binaries afterPack has to hand-sign,
and which forces mergeASARs off. With the flag clear the package is excluded
from the bundle entirely, so the standard signing path handles the whole app
and those two workarounds drop out.
The SDK therefore must never be imported at module scope — a top-level import
would crash a disabled build on launch. services/recallSdk.ts loads it lazily
instead, and every caller already sits behind the flag.
The preload change does the rest of the work: 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 no changes to apps/mail.
Verified: disabled build drops @recallai from the bundle and takes preload from
5.95kB to 0.91kB; the app runs with no recall/calendar/popup activity and no
native binary spawned, while tray, menu, deep links and the updater are
unaffected. CEDAR_RECORDING=1 reproduces the previous bundle byte-for-byte in
size, with the require inside a function body. tsc and oxlint clean.
Co-Authored-By: Claude Opus 5 (1M context) <<email>>Aug 27, 2026, 9:35 PM