Files
jarvis/README.md
Kutesir bd632a1592
Some checks are pending
CI / Build · Debug (push) Waiting to run
CI / Build · Release (push) Waiting to run
rename: Jarvis -> Jervis target, scheme, and folder throughout
The bundle-ID and display-name renames weren't enough — the actual
Xcode target/product name was still "Jarvis", which drives CFBundleName,
Xcode's Organizer archive list, the .xcodeproj filename, and the scheme
name. Renamed all the way through:

- project.yml: top-level name, target key, PRODUCT_NAME, source/info paths
- Jarvis/ -> Jervis/ (source folder, git-tracked as renames, no content
  diffs on the moved files)
- .gitignore, CI workflows, README, CONTRIBUTING: Jarvis.xcodeproj /
  scheme Jarvis -> Jervis.xcodeproj / scheme Jervis

Verified: xcodebuild -scheme Jervis succeeds, produces Jervis.app,
CFBundleName/CFBundleExecutable/CFBundleDisplayName all read "Jervis".
CFBundleIdentifier intentionally stays com.kisani.jarvis (per prior
decision — bundle ID isn't user-facing anywhere including Organizer).

Swift type names (JarvisApp, JarvisWordmark, etc.) and the Gitea repo
name/URL are unchanged — pure internal source identifiers, not user or
developer-facing product identity.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-13 03:49:31 +03:00

2.4 KiB
Raw Blame History

Jervis (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/ for the build/handoff spec and 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.
Jervis/
  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 — the .xcodeproj is generated from project.yml and is not committed.

Build & run

brew install xcodegen          # once
xcodegen generate              # produces Jervis.xcodeproj
open Jervis.xcodeproj          # ⌘R in Xcode, or:

xcodebuild -project Jervis.xcodeproj -scheme Jervis \
  -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.

Status

Frontend complete and verified against a live backend (signal feed, story detail, article reader, feed manager, connectivity). Open work is tracked in Issues / docs/BACKLOG.md.