Skip to content

Cull operational/diagnostic events from desktop analytics (~9% of desktop-era volume) #7148

@mdmohsin7

Description

@mdmohsin7

Context

Original scope was just the Update Check Started/Not Found/Failed triplet with a ~22% of desktop / ~$140/month claim sourced from short PostHog/Mixpanel windows. Pulled the full 2-year Mixpanel raw-event export (92,242,888 events, May 2024 → May 2026) and re-counted against the actual bundle. Numbers below replace the originals.

The corrected picture: the Update Check triplet is real but smaller than claimed, and it's only one of ~10 operational/diagnostic events firing at high cadence from desktop. Total cull is ~8.66% of the April-2026 desktop-era month, not 22%.

Two scopes shown — most of these events shipped recently on desktop, so lifetime % undersells the current noise; April 2026 is what "going forward" would look like.

Counts (from the export bundle)

Event Lifetime %92M April 2026 %20M Code reasoning
Update Check Started 584,698 0.63% 427,441 2.08% Sparkle SUScheduledCheckInterval=600 → fires every 10 min while app is running. Operational. Update Available / Update Installed carry the actual signal.
Update Not Found 467,464 0.51% 338,031 1.65% Pairs with each Started call. Same.
Update Check Failed 89,299 0.10% 68,841 0.34% Sparkle network failures. Sentry territory.
App Became Active 377,493 0.41% 259,817 1.27% NSApplication.didBecomeActiveNotification — fires on every cmd-tab back. Pure focus noise.
App Resigned Active 354,490 0.38% 245,560 1.20% NSApplication.willResignActiveNotification — every cmd-tab away. Same.
Display Info 85,896 0.09% 60,725 0.30% Screen-dimensions diagnostic. No product signal.
Launch At Login Status 85,238 0.09% 60,634 0.30% Polled config-state read, not a user action.
Settings State 226,471 0.25% 171,557 0.84% Periodic 3-boolean settings snapshot. State, not action.
App Startup Timing 69,739 0.08% 49,187 0.24% Cold-start timing diagnostic. Belongs in perf telemetry, not analytics.
Notification Settings Checked 133,324 0.14% 93,035 0.45% Gated on change in AppState.swift, but still fires often. State, not action.

Keep: All Settings State (29,355 / 21,622) — code comment says "fired on app launch, at most once per day". Bounded, gives a daily snapshot worth having.

Totals

Scope Total events Cull volume % cull
Lifetime (2 yr) 92,242,888 ~2,473,612 2.68%
April 2026 alone 20,514,441 ~1,775,267 8.66%

April 2026 is the desktop-on-Mixpanel month before the Apr 29 PostHog cutover (PR #7086). It's the most representative window for "what desktop noise looks like at steady state."

Recommended cull list

  1. Update Check Started, Update Not Found, Update Check Failed — drop all three. Keep Update Available / Update Installed only. Originating call sites: desktop/Desktop/Sources/UpdaterViewModel.swift:47,88,129AnalyticsManager.updateCheck*PostHogManager.swift:611-639.
  2. App Became Active, App Resigned Active — drop entirely; not actionable. Call sites: desktop/Desktop/Sources/OmiApp.swift:1254,1260PostHogManager.swift:335,339.
  3. Display Info, Launch At Login Status, Settings State — drop, or fold into the existing daily All Settings State snapshot. Call sites: OmiApp.swift:439, AnalyticsManager.swift:956, AnalyticsManager.swift:719.
  4. App Startup Timing — move to perf telemetry (Sentry) instead of PostHog analytics. Call site: AnalyticsManager.swift:268.
  5. Notification Settings Checked — keep only the change-detected case; AppState.swift:805-820 already gates it. The 93k/month is presumably already real changes, but worth a property-distribution check before deciding.

What we'd lose

  • Per-poll telemetry on the updater, focus changes, settings reads, screen geometry. All recoverable from local logs / Sentry / server-side state if ever needed.

Owner

Desktop. ~30 lines deleted across PostHogManager.swift, AnalyticsManager.swift, UpdaterViewModel.swift, OmiApp.swift. Single PR.

Methodology

Counts come from data.mixpanel.com/api/2.0/export for project 3314908 (Based Hardware), windowed 2024-05-01 → 2026-05-05, exported via scripts/migration/mixpanel_export.sh (175 daily/monthly chunks, 0 failures, 4.18 GB gz, 92,242,888 lines). Per-event counts via zgrep -c '\"event\":\"<NAME>\"' chunks/*.jsonl.gz.

Refs

Metadata

Metadata

Assignees

No one assigned

    Labels

    chorep3Priority: Backlog (score <14)

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions