IMG_5236.MOV
Secure, local-first terminal access from iPhone to Mac.
APTerminal is a two-app system:
- A macOS companion app that owns and manages terminal sessions.
- An iPhone app that discovers the Mac on the local network or connects through the supported private-overlay path and interacts with those sessions securely.
Use an iPhone to:
- See multiple terminal sessions running on a Mac
- Switch between them quickly
- Type and interact with them with low latency
- Keep the security model tight enough that this does not turn into an unsafe remote shell product
V1 includes:
- PTY-managed shell sessions created by the Mac app
- Local network discovery with Bonjour
- Private internet access through Tailscale or another private overlay
- Encrypted device-to-device connection
- QR-based pairing
- Face ID / passcode lock on iPhone
- Session list and active terminal interaction
- Copy/paste and basic terminal controls
V1 excludes:
- Public raw internet exposure of the host listener
- Cloud relay
- Automatic control of arbitrary Terminal or iTerm windows
- Broad macOS permissions such as Accessibility and Screen Recording
apps/mac-companion/macOS appapps/ios-client/iPhone appshared/protocol/shared message and protocol definitionsdocs/architecture, security, and delivery planning
From the repo root:
make generate
make test
make build-mac
make package-mac-app
make build-iosThe Xcode project is generated and is not intended to be hand-edited or committed as source of truth.
After cloning the repo, run make generate before opening the project in Xcode.
make generate
make test
make package-mac-appThen:
- Open
dist/APTerminal.appon the Mac. - Build and run
iOSClientfrom Xcode on a real iPhone. - Pair with the QR/bootstrap payload from the Mac app.
Build a normal macOS app bundle without opening Xcode:
make package-mac-appThat creates:
dist/APTerminal.appYou can open that app from Finder. The macOS app is the host controller:
- when
APTerminal.appis open, you can start or stop the host from the app Securityshows the pairing payload, connection mode, endpoint, and recent audit eventsSessionsshows managed sessions and any separately enabled external previews once a paired device has preview privilegeDevicesis where preview privilege is granted or revoked per paired iPhone- quitting the app stops the host
- Local-first
- Secure-by-default
- Minimal permissions
- No APTerminal cloud relay in V1
- No public raw listener exposure
- PTY-native instead of pixel-streaming
The current codebase already includes:
- managed PTY sessions on macOS
- LAN and private-overlay connection modes
- encrypted device-to-device transport after
hello - trusted-device pairing, reconnect authentication, and revocation
- preview privilege controls for managed previews and external Terminal/iTerm previews
The remaining work is mainly:
- real-device Mac and iPhone validation
- release hardening and operational testing
- any future optional work beyond the current private-overlay model
Core docs: