AppInputSourceSwitcher is designed for one narrow task without broad macOS permissions. Security claims apply to source built from this repository and can be checked with the included scripts.
The app requests no TCC permission. In particular, it does not request:
- Accessibility;
- Input Monitoring;
- Screen Recording;
- Automation;
- Full Disk Access.
The release app is always assembled with App Sandbox enabled and no additional sandbox capabilities. There is no unsandboxed build target in this repository.
The static audit rejects source references to networking, telemetry, updater, Accessibility, event-tap, clipboard, Keychain, Apple Events, subprocess, LaunchAgent, dynamic-code, browser-inspection, and screen-capture APIs.
Two narrow APIs are permitted:
SMAppService.mainAppfor opt-in Launch at Login;IsSecureEventInputEnabled()as a read-only boolean used to suppress the single delayed retry while secure input is active.
The app reads:
- the frontmost application's bundle identifier;
- enabled keyboard input-source metadata.
It stores one JSON configuration file inside its sandbox container. The file contains only input-source identifiers, bundle identifiers, rules, and timing settings.
Unified log records contain bundle identifiers, input-source identifiers, outcomes, and durations. The app has no API access to keystrokes, clipboard contents, window titles, URLs, message bodies, or document contents.
The app has no network entitlement or networking code, no telemetry, no updater, and no external Swift package dependencies. Its executable should link only Apple system frameworks and the Swift runtime.
Run:
make audit
make test
make app
make verifymake verify fails if the app is not sandboxed, has unexpected entitlements,
links a non-system library, or embeds common network, telemetry, or updater
markers.
- Static pattern checks are defense in depth, not a formal proof.
- Local builds are ad-hoc signed. They are not notarized and provide no publisher identity.
- Bundle identifiers in logs are metadata about application activation. Do not attach raw logs to a public issue without reviewing them.
- Launch at Login is controlled by macOS. The app does not bypass a
requiresApprovalstate.
Do not include private configuration files, raw unified logs, usernames, hostnames, or absolute home-directory paths in a public issue. Use GitHub's private security-advisory flow when available.