Skip to content

feat(app): surface installed-but-uncaptured apps in privacy filters#3866

Merged
louis030195 merged 2 commits into
mainfrom
claude/bold-kilby-370e5d
Jun 5, 2026
Merged

feat(app): surface installed-but-uncaptured apps in privacy filters#3866
louis030195 merged 2 commits into
mainfrom
claude/bold-kilby-370e5d

Conversation

@louis030195

Copy link
Copy Markdown
Collaborator

What

The privacy app filters (Ignored Apps / Included Apps) only autocompleted apps that already had frames in the database, so you couldn't add a rule for an app until it had been recorded at least once. That's backwards for the common privacy case: you want to block an app (a password manager, a banking app) before it is ever captured, not after.

This merges installed applications that have no captures yet into the filter options (and the browse picker), each with its real app icon and an "installed · not captured yet" hint. The icon already resolves by name through the existing /app-icon host, so an uncaptured app still renders with its real icon.

Ignored Apps filter listing installed-but-uncaptured apps with icons

(Mockup of the dropdown. App names are generic product examples, no real user data.)

How

Backend (tauri app server, the same host that already serves /app-icon):

  • icons.rs: list_installed_apps() per OS. macOS scans the standard /Applications directories, Windows scans Start Menu .lnk shortcuts, Linux parses .desktop Name= entries. Read only, best effort, returns an empty list on any failure.
  • server.rs: cached GET /installed-apps (60s server side) returning the deduped, sorted name list.

Frontend:

  • use-installed-apps.tsx: small hook that fetches the list. Degrades to captured-only behavior if the route is missing (older backend) or unreachable, so nothing breaks.
  • privacy-section.tsx: merges installed-but-uncaptured apps into createWindowOptions for both the Ignored and Included filters (deduped against captured apps).
  • window-picker.tsx: surfaces the same apps as app-only rows in the browse dialog.

Testing

  • bun run build passes (types valid, static export clean).
  • New e2e spec privacy-installed-apps.spec.ts mocks /installed-apps and asserts an uncaptured app shows up as a typeable option carrying the not-captured treatment. I'm running it locally against a fresh --features e2e debug build and will post the result in a comment. It also runs in CI.

Notes

  • Production serves /installed-apps on 11435, next to /app-icon. Nothing changes for users who never open privacy settings.
  • The schema-regen and screenshot are intentionally kept out of the feature commit.

🤖 Generated with Claude Code

Louis Beaumont and others added 2 commits June 5, 2026 12:02
The Ignored/Included app filters only autocompleted apps that already had
frames in the DB, so you couldn't add a rule for an app until it had been
recorded at least once. Now installed apps that have no captures yet are
merged into the filter options (and the browse picker), each with its real
app icon and an "installed · not captured yet" hint.

- icons.rs: list_installed_apps() per OS (macOS /Applications scan, Windows
  Start Menu .lnk, Linux .desktop), read-only and best-effort.
- server.rs: cached GET /installed-apps on the tauri app server, next to
  /app-icon (same host that already resolves icons by name).
- useInstalledApps() hook + merge in createWindowOptions and WindowPicker.
- e2e: privacy-installed-apps.spec.ts mocks the endpoint and asserts an
  uncaptured app shows up with the not-captured treatment.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@louis030195

Copy link
Copy Markdown
Collaborator Author

e2e: passing ✅

Ran the new spec against a fresh --features e2e debug build (WebKit / macOS):

» e2e/specs/privacy-installed-apps.spec.ts
Privacy: installed-but-not-captured app filters
   ✓ lists an installed app that has no captures yet, with the not-captured hint

1 passing (9.3s)

The spec mocks GET /installed-apps with a synthetic app name that could never be a real capture, opens the Ignored Apps filter, types it, and asserts it renders as a real option carrying the "not captured yet" treatment. That proves installed-but-uncaptured apps now surface (not just apps with frames in the DB), and it's independent of host state so it stays stable in CI.

@louis030195 louis030195 merged commit 3ee780c into main Jun 5, 2026
21 of 24 checks passed
louis030195 pushed a commit that referenced this pull request Jun 5, 2026
The "Generate E2E Coverage Report" step validates that every *.spec.ts in
e2e/specs has an entry in coverage-map.json. Two recently-added specs were
missing entries, so the step failed once the test run itself started
passing:

- privacy-installed-apps.spec.ts (PR #3866)
- zz-app-entitlement-gate.spec.ts (PR #3846)

Add manifest entries for both and regenerate COVERAGE.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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.

1 participant