# Jarvis (iOS) A SwiftUI iOS client for a self-hosted RSS **news-correlation** platform. It shows stories ranked by a server-computed **signal score**, caches full articles for offline reading, and receives live updates over WebSocket. > This repo is the **iOS app only**. The backend (RSS ingest, clustering, scoring, > REST + WebSocket) is a separate service — see [`docs/backend/`](docs/backend/) for the > build/handoff spec and [`API/contract.md`](API/contract.md) for the wire contract. ## Architecture - **REST on launch → WebSocket for live updates.** The server computes signal scores; the app only renders them. - **Offline-first** via SwiftData (`CachedStory`, `CachedArticle`). - **No auth** — local network / self-hosted (reach it over LAN or Tailscale). - Data flows through `StoryStore` / dedicated view-models; views never call the API directly. ``` Jarvis/ Models/ Codable + SwiftData models Networking/ APIClient (REST), WebSocketManager Store/ StoryStore, ServerSettings Connectivity/ ConnectivitySettings, ConnectivityManager (LAN ⇄ Tailscale) Views/ Home/ Story/ Reader/ Feeds/ Connectivity/ Shared/ ``` ## Requirements - Xcode 16+ (developed on Xcode 26), iOS 17.0+ deployment target (SwiftData). - [`XcodeGen`](https://github.com/yonaskolb/XcodeGen) — the `.xcodeproj` is generated from [`project.yml`](project.yml) and is **not** committed. ## Build & run ```bash brew install xcodegen # once xcodegen generate # produces Jarvis.xcodeproj open Jarvis.xcodeproj # ⌘R in Xcode, or: xcodebuild -project Jarvis.xcodeproj -scheme Jarvis \ -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 17' build ``` ## Connecting to a backend On first launch, enter the server as `host:port` (the app prepends `http://` and `ws://`), e.g. `10.10.1.70:8098`. Remote access via Tailscale is configured in the in-app **Connectivity → Remote Access** card; the app auto-selects the LAN address when it's reachable and the Tailscale address when away. ## CI GitHub Actions builds a matrix of macOS runners × Debug/Release on every push and PR — see [`.github/workflows/ci.yml`](.github/workflows/ci.yml). ## Status Frontend complete and verified against a live backend (signal feed, story detail, article reader, feed manager, connectivity). Open work is tracked in [Issues](../../issues) / [`docs/BACKLOG.md`](docs/BACKLOG.md).