Skip to content

feat(cli): add --disable-meeting-detector to skip v2 meeting watcher#3387

Merged
louis030195 merged 1 commit into
screenpipe:mainfrom
rhodium-inc:pr/disable-meeting-detector
May 14, 2026
Merged

feat(cli): add --disable-meeting-detector to skip v2 meeting watcher#3387
louis030195 merged 1 commit into
screenpipe:mainfrom
rhodium-inc:pr/disable-meeting-detector

Conversation

@rhodium-inc
Copy link
Copy Markdown
Contributor

Summary

Add an opt-in --disable-meeting-detector CLI flag (and matching disableMeetingDetector settings field) that skips the v2 meeting detector's UI scanner.

Motivation

The v2 meeting detector walks every running process's accessibility tree every 5 seconds to detect Zoom/Teams/Meet call control elements. Great for users who want automatic meeting tracking.

For tools that don't consume meeting state (task-mining tools, headless analysis pipelines, agents that only care about accessibility_text and ui_events), the scanner is pure overhead — the 5s process enumeration + AX tree walk shows up as visible CPU bursts on lower-tier machines.

Related user friction: Discord reports (e.g. bluetooth headsets being forced into HFP mode by always-on mic capture) show that users sometimes want to opt out of the meeting-detection stack altogether. This flag offers that opt-out path.

Behavior

  • Default: false — no change for existing users
  • When set:
    • MeetingDetector is never instantiated (the existing disable_audio branch is extended)
    • The watcher is never spawned (gated by if let Some(meeting_detector))
    • Startup log prints: meeting detector disabled via --disable-meeting-detector
    • The audio pipeline's in_meeting override flag stays false

Implementation

  • `screenpipe-config`: `RecordingSettings.disable_meeting_detector` (persisted to settings.json via `disableMeetingDetector`)
  • `screenpipe-engine/cli`: `--disable-meeting-detector` flag on `record` subcommand
  • `screenpipe-engine/recording_config`: `RecordingConfig` propagation
  • `screenpipe-engine/bin`: extend the existing meeting_detector init branch with an `else if config.disable_meeting_detector` case. The watcher start path is already gated by `if let Some(meeting_detector)` so no change is needed there.

Validation

  • `cargo build --release --target x86_64-pc-windows-msvc --workspace --exclude screenpipe-rfdetr-mlx` passes on Windows
  • `screenpipe record --help` shows the new flag
  • Run with `--disable-meeting-detector --disable-audio` confirmed:
    • Startup log prints `meeting detector disabled via --disable-meeting-detector`
    • No `meeting scanner: pid=...` log lines (the 5s scanner is silent)

Context

Companion PR to #3385 (--disable-snapshot-compaction). Both are small, isolated CLI flags for task-mining / headless-recording use cases. Submitted separately to keep review easy.

@louis030195
Copy link
Copy Markdown
Collaborator

@rhodium-inc why not just disabling audio? also can u resolve conflicts

@rhodium-inc
Copy link
Copy Markdown
Contributor Author

Hi @louis030195 — thanks for the quick look!

--disable-audio would also turn meeting detection off, but the use cases here are ones where users want audio capture/transcription on while skipping the meeting metadata layer:

  • Task-mining / activity analytics: we use accessibility_text + ui_events + audio transcripts to reconstruct work sessions, but we don't consume meetings / in_meeting state. The 5s process-enum + per-process AX walk is pure overhead for that workload, and it shows up as visible CPU bursts on lower-tier hardware.
  • Headless / agent recording: same pattern — full event stream wanted, meeting watcher unwanted.
  • Audio-on but meeting-detection-off: a slice that already gets asked for in Discord (e.g. bluetooth users wanting to keep audio while reducing always-on detection state).

So it's the audio-on / meetings-off complement to --disable-audio's audio-off path. Same shape as #3385 (also "I want most of the pipeline, but not this one heavy worker"), and the implementation just extends the existing disable_audio → meeting_detector = None branch with an else if disable_meeting_detector.

Rebasing onto main now to clear the conflict (#3385 touched the same RecordArgs / RecordingSettings / RecordingConfig structs).

Add an opt-in flag to skip the v2 meeting detector's UI scanner, which
walks every running process's accessibility tree every 5 seconds to
detect Zoom/Teams/Meet call control elements.

For tools that don't consume meeting state (task-mining, headless
analysis, agents that only care about `accessibility_text` and
`ui_events`), the scanner is pure overhead. Discord users have already
reported related friction (e.g. bluetooth headsets being forced into
HFP mode by always-on mic capture); offering a single flag that lets
users opt out of the meeting-detection stack helps that audience too.

The flag is opt-in (default false). When set, `MeetingDetector` is
never instantiated and the watcher is never spawned, so the audio
pipeline's `in_meeting` override flag stays false.

Implementation:
- screenpipe-config: RecordingSettings.disable_meeting_detector (persisted)
- screenpipe-engine/cli: --disable-meeting-detector
- screenpipe-engine/recording_config: RecordingConfig propagation
- screenpipe-engine/bin: extend the meeting_detector init branch so that
  it returns None when disable_meeting_detector is set; the watcher
  start path is already gated by `if let Some(meeting_detector)`

Validated by:
- cargo build --release --target x86_64-pc-windows-msvc --workspace --exclude screenpipe-rfdetr-mlx
- screenpipe record --help shows the new flag
- Run with --disable-meeting-detector --disable-audio confirmed:
  - Startup log prints \"meeting detector disabled via --disable-meeting-detector\"
  - No \"meeting scanner: pid=...\" log lines (the 5s scanner is silent)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@rhodium-inc rhodium-inc force-pushed the pr/disable-meeting-detector branch from 76c65f6 to e09f371 Compare May 14, 2026 02:47
@louis030195 louis030195 merged commit 6f70a69 into screenpipe:main May 14, 2026
4 of 10 checks passed
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.

2 participants