# pi-remote iOS Native iOS app for the [pi-remote-control](https://git.vpsj.de/jay/pi-remote-control) sidecar. ## Requirements - Xcode 16.4+ - iOS 17.0+ device - pi-remote-control sidecar running (Phase 1) ## Building ```bash # Open in Xcode (first time: Xcode downloads device support files automatically) open piRemote.xcodeproj # Or via CLI (after first Xcode open with device connected): xcodebuild build -project piRemote.xcodeproj -scheme piRemote \ -destination "platform=iOS,name=" \ CODE_SIGNING_STYLE=Automatic DEVELOPMENT_TEAM=KNXX8R3648 ``` ## Project structure ``` Sources/ ├── App/ — @main entry, ContentView, Assets ├── Core/ │ ├── Network/ — WebSocketClient, FrameCodec, ResumeCursor, TLS pinning │ ├── Auth/ — Keychain, Pairing (QR exchange) │ ├── Sessions/ — SessionRegistry, SessionConnection, PreConnectPool │ ├── Push/ — APNs NotificationDelegate, DeviceTokenRegistrar │ └── Persistence/ — ScrollbackCache, Preferences └── UI/ ├── Terminal/ — SwiftTerm wrapper, themes, fonts ├── Input/ — ModifierBar, sticky Ctrl, paste sheet ├── Status/ — StatusBar (pi state) ├── Sessions/ — SessionSwitcher ├── Pairing/ — QR scanner flow └── Settings/ — Face-ID gate, sidecar info ``` ## Dependencies (via SPM) - [SwiftTerm](https://github.com/migueldeicaza/SwiftTerm) — terminal emulator - [Starscream](https://github.com/daltoniam/Starscream) — WebSocket client ## Apple Developer setup (one-time) 1. In [Apple Developer Portal](https://developer.apple.com/account): - Create App ID: `de.vpsj.pi-remote`, enable **Push Notifications** - Generate an **APNs Auth Key** (`.p8`) — *download once, keep safe* - Note your **Key ID** and **Team ID** (`KNXX8R3648`) 2. Copy `.p8` key to `~/.local/share/pi-remote/apns/AuthKey_.p8` 3. Update `[apns]` section in pi-remote-control config ## Status Phase 2 — in progress. | Task | Status | |---|---| | T-2.0 Xcode scaffold | ✅ done | | T-2.1 WebSocketClient + FrameCodec + ResumeCursor | ✅ done | | T-2.2 Pairing + Keychain + QRScanner | ✅ done | | T-2.3 TerminalView + ThemeStore + FontStore | ✅ done | | T-2.4 ModifierBar + ModifierState + PasteSheet | ✅ done | | T-2.5 SessionConnection (IC-2.1) + ScrollbackCache | ✅ done | | T-2.9 APNs NotificationDelegate + DeviceTokenRegistrar | ✅ done | | T-2.6 SessionRegistry + SessionSwitcher UI | ⛔ next | | T-2.7 PreConnectPool | ⛔ after T-2.6 | | T-2.8 StatusBar + Side-channel | ⛔ next | | T-2.10 Background lifecycle | ⛔ todo | | T-2.11 Face-ID gate + Settings | ⛔ next | | T-2.12 TestFlight pipeline | ⛔ todo | | T-2.13 MVP smoke test | ⛔ last | **App runs on device:** iOS 26, wireless, Xcode 16.4 Intel Mac. **111 unit tests** across FrameCodec, ResumeCursor, Pairing, Keychain, Theme, ModifierState, ScrollbackCache, DeviceTokenRegistrar. See `pi-remote-control/docs/PHASE-2-ios-mvp.md` for full spec.