A fully Apple-native OpenChat client built with SwiftUI. It connects directly to the existing OpenChat/Noos backend at https://chat.globalbr.ai; it does not embed the website and does not use React Native.
- Sign in with Apple using
AuthenticationServices - Native Noos email/password fallback UI for development and existing accounts
- Session storage in the iOS Keychain
- Conversation list with native navigation and pull-to-refresh
- Message history and native chat composer
- Live messages over Socket.IO using WebSocket transport only
- REST send fallback when the live connection is unavailable
- Light/dark mode, Dynamic Type, iPad layout, and Mac Catalyst support
Requirements: Xcode 16+, XcodeGen, and an Apple development team for device builds.
brew install xcodegen
./scripts/generate.sh
open OpenChatNative.xcodeprojSelect the OpenChatNative scheme and an iPhone simulator. Simulator builds do not require code signing. Sign in with Apple on a physical device requires the com.jacobcole.openchat App ID capability already used by the Expo client.
The networking, session, persistence, and model layers also build as a Swift package. A lightweight contract check runs on machines with Command Line Tools only; the Xcode scheme additionally runs the Apple-platform unit-test bundle:
./scripts/verify.shThe Xcode project is generated from project.yml and committed so the app can be opened immediately. Regenerate after changing targets, build settings, packages, or resources.
OpenChatNative/
App/ SwiftUI app entry point
Features/Auth/ Apple and Noos login
Features/Conversations/
Features/Chat/
Models/ API wire models + display helpers
Networking/ URLSession REST + native Socket.IO adapter
Persistence/ Keychain session storage
Session/ App-wide authentication and realtime state
UI/ Reusable native components
The socket is explicitly configured for WebSocket transport because Cloudflare breaks OpenChat's polling fallback. The dependency is pinned to Socket.IO-Client-Swift 16.1.1, an established release compatible with the server's Socket.IO v4 protocol.
On 2026-08-23, a production smoke test confirmed that Noos issues a valid access token but chat.globalbr.ai rejects that fresh token with HTTP 401. The app safely clears the rejected session and returns to login; Sign in with Apple uses an OpenChat-minted token and is not affected. The shared-JWT deployment drift is tracked separately in the canonical OpenChat tracker and must be fixed before the Noos email path is considered production-ready.
Tracked by OpenChat-dbr in the canonical OpenChat beads database.
