PermissionPilot is a drop-in SwiftUI onboarding + permissions flow for
non–App Store macOS apps. It detects, prompts, deep-links, and onboards across
16 macOS permissions — with zero third-party dependencies (Apple
frameworks only).
Highlights
- 🧭 First-run wizard (welcome → permissions → done) with live re-check + auto-advance.
- ✅ Drop-in rows / checklist / grid that flip to ✓ and report "N of M enabled."
- 🔗 Deep-links to the exact Privacy pane; handles signing/relaunch/Sequoia gotchas.
- 🧩 Composable —
PermissionPilotCore(engine),PermissionPilotUI(components),PermissionPilot(full wizard).
Permissions (3 tiers)
- Prompt-based: Camera, Microphone, Location, Contacts, Calendars, Reminders, Photos, Speech Recognition, Bluetooth, Notifications, + system-prompt panes (Accessibility, Screen Recording, Input Monitoring).
- Deep-link-only: Full Disk Access, Automation, Local Network.
Install
.package(url: "https://github.com/arpitagarwal1301/PermissionPilot.git", from: "0.1.0")Requirements
- macOS 12+, Swift 5.9+ / Xcode 15+
- A non-sandboxed app (TCC deep-links are disallowed under the App Sandbox / Mac App Store).
Before you ship
- Info.plist usage strings are required for every prompt-based permission — a missing key crashes the app on first request. Calendars/Reminders need both the macOS 14+ and 12–13 keys.
- Code-signing & TCC: grants are tied to your code signature + bundle ID. Sign with a stable identity (Developer ID + notarization for distribution) and keep the bundle ID constant.
Demo
No prebuilt binary — the demo is built and signed locally so it gets its own TCC
identity:
Example/build-demo-app.sh --openSee the README for the full per-permission reference and gotchas.