54 lines
2.3 KiB
Markdown
54 lines
2.3 KiB
Markdown
|
|
# Jarvis — Claude Code Handoff
|
||
|
|
|
||
|
|
## What this is
|
||
|
|
Jarvis is an iOS app (SwiftUI + SwiftData) that connects to a self-hosted RSS
|
||
|
|
correlation platform. It displays news stories ranked by signal score, caches
|
||
|
|
full article content for offline reading, and receives live updates over WebSocket.
|
||
|
|
|
||
|
|
## Architecture
|
||
|
|
- REST on launch → WebSocket for live updates
|
||
|
|
- Server computes signal scores — app only renders them
|
||
|
|
- Full offline support via SwiftData cache
|
||
|
|
- No auth — local network / self-hosted only
|
||
|
|
|
||
|
|
## Files produced so far
|
||
|
|
- `API/contract.md` — full REST + WebSocket API spec
|
||
|
|
- `Jarvis/Models/Models.swift` — all Codable structs + SwiftData models
|
||
|
|
- `Jarvis/Networking/APIClient.swift` — REST layer (actor-based)
|
||
|
|
- `Jarvis/Networking/WebSocketManager.swift` — WS connection + reconnect backoff
|
||
|
|
- `Jarvis/Store/StoryStore.swift` — central ObservableObject, drives all views
|
||
|
|
- `Jarvis/Store/ServerSettings.swift` — persists server host to UserDefaults
|
||
|
|
- `Jarvis/JarvisApp.swift` — app entry point, SwiftData container
|
||
|
|
- `Jarvis/Views/RootTabView.swift` — tab navigation
|
||
|
|
- `Jarvis/Views/Onboarding/OnboardingView.swift` — server setup screen
|
||
|
|
|
||
|
|
## Views still needed
|
||
|
|
- `SignalFeedView` — home screen, story list sorted by signal score
|
||
|
|
- `StoryDetailView` — cluster detail, timeline, consensus/conflict
|
||
|
|
- `ArticleReaderView` — full article, cached badge, more from cluster
|
||
|
|
- `FeedManagerView` — feed list, health states, add/delete
|
||
|
|
- `LatestView`, `SavedView`, `SearchView` — secondary tabs
|
||
|
|
|
||
|
|
## Design tokens
|
||
|
|
- Primary accent: `KisaniOrange` = #FF5C00 (add to Assets.xcassets)
|
||
|
|
- Background: pure black #000000
|
||
|
|
- Surface: #111111, #1A1A1A
|
||
|
|
- All views: `.preferredColorScheme(.dark)`
|
||
|
|
|
||
|
|
## Key decisions already made
|
||
|
|
- Story = user-facing product object (never expose Cluster to UI)
|
||
|
|
- Pipeline: Article → Cluster → Story
|
||
|
|
- Signal score is server-computed, breakdown exposed as `scoreBreakdown`
|
||
|
|
- WebSocket pushes lightweight events (storyId + score only), app refetches full object via REST
|
||
|
|
- WS reconnect: exponential backoff 1s → 2s → 4s → max 60s
|
||
|
|
- Pagination: cursor-based via `nextCursor`
|
||
|
|
|
||
|
|
## To start in Claude Code
|
||
|
|
```bash
|
||
|
|
cd jarvis
|
||
|
|
# Create new Xcode project named Jarvis, iOS target
|
||
|
|
# Drag all .swift files into the project
|
||
|
|
# Add KisaniOrange (#FF5C00) to Assets.xcassets as a Color Set
|
||
|
|
# Set minimum deployment target to iOS 17 (SwiftData requirement)
|
||
|
|
```
|