Files
wristcode/watch

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