The gateway sends threadId "" on host notifications; tapping one now opens the feed instead of a thread that does not exist. Co-Authored-By: Claude Opus 5.5 <[email protected]>
WristCode watch app
SwiftUI, watch only, Swift 6 with strict concurrency, and no dependencies. It talks to the gateway
over HTTPS + JSON as described in docs/api.md; WristCode/API/Models.swift
mirrors gateway/src/contract.ts.
Build and test
cd watch
xcodegen generate # the .xcodeproj is generated and gitignored
xcodebuild -scheme WristCode -destination 'platform=watchOS Simulator,name=Apple Watch Series 12 (46mm)' build
xcodebuild -scheme WristCode -destination 'platform=watchOS Simulator,name=Apple Watch Series 12 (46mm)' test
Demo mode
DemoGateway serves fixture data shaped like the docs/api.md examples, and it reacts to writes:
Allow moves a thread to working, a reply restarts a finished thread. The SwiftUI previews use it,
the pairing screen has a "Try the demo" button, and launch arguments open a screen directly:
xcrun simctl launch <udid> org.gbrown.wristcode -demo # feed
xcrun simctl launch <udid> org.gbrown.wristcode -demo -thread littleman/t-next # thread
xcrun simctl launch <udid> org.gbrown.wristcode -demo -screen new # new thread
screenshots/ holds the screens captured this way.
Layout
| Path | Job |
|---|---|
WristCodeApp.swift |
App entry, root navigation, WKApplicationDelegate for APNs registration |
AppModel.swift |
Paired, demo or unpaired; navigation path; the feed; 401 sends you back to pairing |
API/GatewayClient.swift |
GatewayAPI protocol and the URLSession client |
API/Models.swift |
Codable mirror of the contract |
Auth/DeviceStore.swift |
Device token and gateway URL in the Keychain |
Demo/DemoGateway.swift |
In-memory gateway with fixtures |
Views/ |
Pair, Feed, Thread, New thread, and the mock B theme |
Notifications/NotificationHandler.swift |
Categories approval, finished, failed, input, host and their actions |