feat(meeting-detector): per-app ignore list for meeting detection#3882
feat(meeting-detector): per-app ignore list for meeting detection#3882louis030195 wants to merge 1 commit into
Conversation
Adds a dedicated `ignoredMeetingApps` setting so a user can exclude
specific apps from automatic meeting detection without turning detection
off entirely. Kept separate from `ignored_windows` by design: the
detector enumerates processes directly and never goes through the capture
filter, and "don't treat this app as a meeting" is a different intent
from "don't record this app".
- config: RecordingSettings.ignored_meeting_apps (+ Default, tauri.ts)
- engine: meeting_app_is_ignored helper + retain-filter in
run_meeting_detection_loop, applied before the AX scan so an ignored
app costs nothing past process enumeration; threaded through
start_meeting_watcher and both call sites
- matching: case-insensitive substring on the running app name AND the
matched detection profile's identifiers, so an entry works as the app
("Discord") or the service ("meet.google.com")
- cli: --ignored-meeting-apps (mirrors --ignored-windows)
- app: "ignore apps" button beside the meeting-detection toggle opens a
MeetingAppsPicker that auto-populates from the user's recent apps +
curated meeting apps (with icons), click-to-toggle or type a custom
service
- tests: 5 unit tests for meeting_app_is_ignored
Also syncs src-tauri/Cargo.lock internal crate versions (0.4.7 -> 0.4.8).
Closes #3847
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Meeting-detection evalSource:
flap = Ending → Active oscillations inside one meeting. controls-flap = controls reappeared; audio-flap = output audio kept it alive. High controls-flap = brittle scan; high audio-flap = legitimate but watch for drift. See Assertion details |
|
@Anshgrover23 @divanshu-go could you help test this one when you get a chance? 🙏 Quick test (app): Settings → recording → next to the Automatic meeting detection toggle there's a new ignore apps button (with a count). Open it, add an app — it auto-populates from your recent apps + known meeting apps, or you can type a custom service like The #3847 case: add Webex, keep it open for chat (no call), and confirm the phantom 5s meetings stop while Webex still gets captured normally. CLI: It's a separate list from |
|
@louis030195 superseded by #3886 can we close this one? |
Adds a WebDriver spec that mirrors the user-visible flow for the per-app meeting-detection ignore list (screenpipe#3882, addressing screenpipe#3847): - Settings > Recording: 'ignore apps' button opens the picker - Toggling Webex flips data-added on the row and surfaces a count badge - Closing + reopening the picker keeps Webex selected (settings store round-trip — same persistence guarantee the user relied on in the bug report). Wires up data-testids on the open button, count badge, dialog root, and each picker row/toggle so the spec doesn't depend on visible copy. Engine-side correctness (the actual detector skipping ignored apps) is already covered by the meeting_app_is_ignored_* unit tests in crates/screenpipe-engine/src/meeting_detector.rs — this spec only pins the UI contract.
) * feat(meeting-detector): per-app ignore list for meeting detection Adds a dedicated `ignoredMeetingApps` setting so a user can exclude specific apps from automatic meeting detection without turning detection off entirely. Kept separate from `ignored_windows` by design: the detector enumerates processes directly and never goes through the capture filter, and "don't treat this app as a meeting" is a different intent from "don't record this app". - config: RecordingSettings.ignored_meeting_apps (+ Default, tauri.ts) - engine: meeting_app_is_ignored helper + retain-filter in run_meeting_detection_loop, applied before the AX scan so an ignored app costs nothing past process enumeration; threaded through start_meeting_watcher and both call sites - matching: case-insensitive substring on the running app name AND the matched detection profile's identifiers, so an entry works as the app ("Discord") or the service ("meet.google.com") - cli: --ignored-meeting-apps (mirrors --ignored-windows) - app: "ignore apps" button beside the meeting-detection toggle opens a MeetingAppsPicker that auto-populates from the user's recent apps + curated meeting apps (with icons), click-to-toggle or type a custom service - tests: 5 unit tests for meeting_app_is_ignored Also syncs src-tauri/Cargo.lock internal crate versions (0.4.7 -> 0.4.8). Closes #3847 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(meeting-apps-picker): stop hover-flicker on ignore button Row component was defined inside MeetingAppsPicker body, so its component identity changed on every parent render. React tore down + remounted the entire row subtree (including the hover-styled Button) each render, which flickered the :hover background on/off while the cursor sat still on the ignore button. Hoist Row out as a top-level React.memo'd component and pass added + onToggle as explicit props instead of closing over them. Stable identity = no remount = no flicker. * test(e2e): cover meeting-apps ignore picker (open / toggle / persist) Adds a WebDriver spec that mirrors the user-visible flow for the per-app meeting-detection ignore list (#3882, addressing #3847): - Settings > Recording: 'ignore apps' button opens the picker - Toggling Webex flips data-added on the row and surfaces a count badge - Closing + reopening the picker keeps Webex selected (settings store round-trip — same persistence guarantee the user relied on in the bug report). Wires up data-testids on the open button, count badge, dialog root, and each picker row/toggle so the spec doesn't depend on visible copy. Engine-side correctness (the actual detector skipping ignored apps) is already covered by the meeting_app_is_ignored_* unit tests in crates/screenpipe-engine/src/meeting_detector.rs — this spec only pins the UI contract. --------- Co-authored-by: Louis Beaumont <louis@screenpi.pe> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
what
Adds a dedicated ignore list for automatic meeting detection. Apps you add here never auto-start a meeting / live notes — detection stays on for everything else.
Closes #3847.
Today the only control is the all-or-nothing Automatic meeting detection toggle. If one app trips the detector spuriously (an always-open Webex used only for chat, a Discord call, a personal WhatsApp call) the only fix is to turn detection off entirely and split meetings by hand. This adds a surgical alternative: silence the noisy app, keep Zoom / Meet / Teams working.
why a separate list (not
ignored_windows)#3847 notes the meeting detector ignores the
ignored_windowslist — that's by design: the detector enumerates processes directly and never goes through the capture filter. Rather than overloadignored_windows(which scopes screen/audio capture), this adds a purpose-builtignoredMeetingAppslist. The two are conceptually different — "don't record this app" vs "don't treat this app as a meeting" — and a user often wants one without the other (keep capturing Webex chat, just stop the phantom meetings).ui
A small ignore apps button sits next to the Automatic meeting detection toggle (with a count of what's ignored). It opens a picker that auto-populates from the apps you actually use (last 7 days, from the local DB) plus a curated set of known meeting apps — each with its real icon. Click to toggle; or type any custom service (e.g.
meet.google.com).how it works
Matching is case-insensitive substring against, in order:
Discord,zoom.us,Google Chrome), andmeet.google.comsilences Meet-in-a-browser).The filter runs in
run_meeting_detection_loopright after candidate apps are discovered and before the accessibility-tree scan, so an ignored app costs nothing past process enumeration. Applies uniformly to native, browser, and DB-hint matches. Empty list = detect everything (unchanged behavior).surface
ignoredMeetingApps: string[]onRecordingSettings(persisted instore.bin, exported totauri.ts).MeetingAppsPickermodal under the Automatic meeting detection toggle.--ignored-meeting-apps <app>...onscreenpipe record, mirroring--ignored-windows.files
crates/screenpipe-config/src/recording.rs— new field + defaultcrates/screenpipe-engine/src/recording_config.rs— thread throughRecordingConfigcrates/screenpipe-engine/src/meeting_detector.rs—meeting_app_is_ignoredhelper, loop param, retain-filter + 5 unit testscrates/screenpipe-engine/src/meeting_watcher.rs+ both call sites (bin/screenpipe-engine.rs,src-tauri/.../capture_session.rs)crates/screenpipe-engine/src/cli/mod.rs—--ignored-meeting-appsapps/screenpipe-app-tauri/components/settings/meeting-apps-picker.tsx— new picker modalapps/screenpipe-app-tauri/components/settings/recording-settings.tsx— button + wiringapps/screenpipe-app-tauri/lib/hooks/use-settings.tsx,lib/utils/tauri.ts— default + bindingtesting
cargo check -p screenpipe-config -p screenpipe-engine— clean;screenpipe-appcompiles (viabindings:generate)meeting_app_is_ignored(app-name match, profile/browser match, case-insensitivity, blank/unrelated no-match, empty list) — passbun run build(next build) passes@ericrevans — this is your #3847. If you have a minute, would love a review/test on the Webex case (add Webex in the new ignore apps picker and confirm the phantom meetings stop while Webex chat keeps recording). No pressure if you're busy.
🤖 Generated with Claude Code