Skip to content

Explain blocked browser-profile access; hide Chrome for Testing - #16

Merged
jnahian merged 3 commits into
mainfrom
fix/browser-profile-access
Sep 27, 2026
Merged

jnahian merged 3 commits into
mainfrom
fix/browser-profile-access

Conversation

@jnahian

@jnahian jnahian commented Sep 27, 2026

Copy link
Copy Markdown
Owner

Why

The rule editor showed no Profile dropdown for Google Chrome, and Settings → Browsers listed no profiles for any browser. Chrome's Local State parsed fine from Terminal, but a normal app (tested with a throwaway signed bundle launched via open) gets Operation not permitted reading it, Firefox's profiles.ini, or Edge's Local State. There is no prompt, and nothing is logged. Only Full Disk Access unblocks it, and the profile readers silently turned the denial into "no profiles".

What

  • Full Disk Access notice. BrowserDiscovery.isProfileAccessBlocked opens each installed Chromium/Firefox profile file and reports a block only on EPERM. A missing file (ENOENT, never launched) doesn't count. FileHandle's Cocoa error code turned out to be unreliable here (513, not 257), hence plain open(2). AppState.profileAccessBlocked refreshes with the browser list.
  • A shared FullDiskAccessNotice ("Open System Settings…" deep link + "Check Again") appears in Settings → Browsers, in the rule editor in place of the Profile picker, and on the onboarding default-browser step.
  • Hide Google Chrome for Testing (com.google.chrome.for.testing, installed by Playwright/Puppeteer) from browser discovery. It sat next to real Chrome and has no profile support.
  • Changelog entries under Unreleased, plus a troubleshooting entry on the docs site.

Not changed (follow-up)

Dispatcher checks that a Firefox profile exists by reading profiles.ini. With access blocked, every Firefox profile rule degrades to the fallback with the reason "profile no longer exists". Trusting the rule instead risks Firefox's profile manager eating the link, so this needs a decision.

Testing

  • swift build and swift test pass. cd web && npm test passes.
  • Blocked-read detection checked from a launchd context: Chrome Local State → blocked, readable context → not blocked, missing file → not blocked.
  • The notices weren't checked in a running app. That needs a bundled build with Full Disk Access off.

🤖 Generated with Claude Code

https://claude.ai/code/session_019Y9gVVaoGd4dCz42XkXkpP

jnahian and others added 2 commits September 27, 2026 10:55
Playwright and Puppeteer install an automation-only Chrome build that
registers as an https handler, so it showed up next to real Google Chrome
in rules, the picker, and Settings → Browsers. It has no profile support,
and picking it by mistake looked like the Profile dropdown was broken.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019Y9gVVaoGd4dCz42XkXkpP
On recent macOS, reading another browser's Local State or profiles.ini is
refused with EPERM unless Junction has Full Disk Access. There is no
permission prompt for it, and the profile readers failed quietly to an
empty list, so the rule editor's Profile dropdown and Settings → Browsers
simply showed no profiles.

BrowserDiscovery.isProfileAccessBlocked tells a denied read (EPERM) apart
from a missing file (ENOENT). AppState refreshes it with the browser list,
and a shared notice with an "Open System Settings…" button and a
"Check Again" button now appears in Settings → Browsers, in the rule editor
in place of the Profile picker, and on the onboarding default-browser step.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019Y9gVVaoGd4dCz42XkXkpP
@vercel

vercel Bot commented Sep 27, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
junction Ready Ready Preview Sep 27, 2026 5:09am UTC

First launch, Privacy, and the profile action now say that listing browser
profiles needs Full Disk Access, what Junction reads with it, and what
still works without it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019Y9gVVaoGd4dCz42XkXkpP
@jnahian
jnahian added this pull request to stack #19 September 27, 2026 05:53
@jnahian jnahian self-assigned this Sep 27, 2026
@jnahian
jnahian merged commit 1f7ae2b into main Sep 27, 2026
6 checks passed
@jnahian
jnahian deleted the fix/browser-profile-access branch September 27, 2026 05:59

This branch was successfully deployed

1 active deployment
Preview — c9d8a17d Deployed Sep 27, 2026 by vercel[bot]
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