Skip to content

feat(meeting-detector): per-app ignore list for meeting detection#3882

Closed
louis030195 wants to merge 1 commit into
mainfrom
claude/heuristic-hofstadter-a61a6c
Closed

feat(meeting-detector): per-app ignore list for meeting detection#3882
louis030195 wants to merge 1 commit into
mainfrom
claude/heuristic-hofstadter-a61a6c

Conversation

@louis030195

Copy link
Copy Markdown
Collaborator

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_windows list — that's by design: the detector enumerates processes directly and never goes through the capture filter. Rather than overload ignored_windows (which scopes screen/audio capture), this adds a purpose-built ignoredMeetingApps list. 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).

ignore apps button next to the toggle

meeting apps ignore picker

how it works

Matching is case-insensitive substring against, in order:

  1. the running app's name / process (what you see — Discord, zoom.us, Google Chrome), and
  2. the matched detection profile's identifiers — native names + browser URL patterns — so a service entry also covers browser meetings (meet.google.com silences Meet-in-a-browser).

The filter runs in run_meeting_detection_loop right 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

  • Setting: ignoredMeetingApps: string[] on RecordingSettings (persisted in store.bin, exported to tauri.ts).
  • UI: button + MeetingAppsPicker modal under the Automatic meeting detection toggle.
  • CLI: --ignored-meeting-apps <app>... on screenpipe record, mirroring --ignored-windows.

files

  • crates/screenpipe-config/src/recording.rs — new field + default
  • crates/screenpipe-engine/src/recording_config.rs — thread through RecordingConfig
  • crates/screenpipe-engine/src/meeting_detector.rsmeeting_app_is_ignored helper, loop param, retain-filter + 5 unit tests
  • crates/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-apps
  • apps/screenpipe-app-tauri/components/settings/meeting-apps-picker.tsx — new picker modal
  • apps/screenpipe-app-tauri/components/settings/recording-settings.tsx — button + wiring
  • apps/screenpipe-app-tauri/lib/hooks/use-settings.tsx, lib/utils/tauri.ts — default + binding

testing

  • cargo check -p screenpipe-config -p screenpipe-engine — clean; screenpipe-app compiles (via bindings:generate)
  • 5 new unit tests for meeting_app_is_ignored (app-name match, profile/browser match, case-insensitivity, blank/unrelated no-match, empty list) — pass
  • bun run build (next build) passes
  • Images above are HTML mockups of the exact UI (dark theme); behavior verified by build + unit tests

@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

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>
@github-actions

github-actions Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Meeting-detection eval

Source: crates/screenpipe-meeting-eval/evals/scenarios/ · replays scripted scan traces through prod advance_state.

scenario meetings final flap (controls/audio) end latency (s) status
arc_meet_toolbar_autohide 1 Idle 8 / 0 305 xfail: 1 miss
browser_tab_switch_with_audio 1 Idle 0 / 24 305 ok
confirming_drops_no_meeting 0 Idle 0 / 0 n/a ok
native_zoom_minimized_with_audio 1 Idle 0 / 24 35 ok
zoom_native_clean_call 1 Idle 0 / 0 35 ok

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 crates/screenpipe-meeting-eval/evals/README.md for the methodology and per-scenario rationale.

Assertion details

[xfail] arc_meet_toolbar_autohide:
  flap_count: max 3 got 8

@louis030195

Copy link
Copy Markdown
Collaborator Author

@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 meet.google.com. Then confirm that app no longer auto-starts a meeting / live note, while Zoom/Meet/etc. still do.

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: screenpipe record --ignored-meeting-apps discord --ignored-meeting-apps webex

It's a separate list from ignored_windows by design. Thanks!

@Anshgrover23

Anshgrover23 commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

@louis030195 superseded by #3886 can we close this one?

Anshgrover23 added a commit to Anshgrover23/screenpipe that referenced this pull request Jun 6, 2026
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.
louis030195 pushed a commit that referenced this pull request Jun 8, 2026
)

* 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>
@louis030195 louis030195 closed this Jun 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] Meeting detector ignores ignored_windows list - Webex background window triggers phantom meetings

2 participants