SwiftUI client for a self-hosted RSS news-correlation platform: signal feed, story detail, article reader, feed manager, and LAN⇄Tailscale connectivity. Project generated from project.yml via XcodeGen. Includes CI build matrix (macOS 14/15 × Debug/Release), issue templates, backlog, and API/backend handoff docs. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2.3 KiB
2.3 KiB
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 specJarvis/Models/Models.swift— all Codable structs + SwiftData modelsJarvis/Networking/APIClient.swift— REST layer (actor-based)Jarvis/Networking/WebSocketManager.swift— WS connection + reconnect backoffJarvis/Store/StoryStore.swift— central ObservableObject, drives all viewsJarvis/Store/ServerSettings.swift— persists server host to UserDefaultsJarvis/JarvisApp.swift— app entry point, SwiftData containerJarvis/Views/RootTabView.swift— tab navigationJarvis/Views/Onboarding/OnboardingView.swift— server setup screen
Views still needed
SignalFeedView— home screen, story list sorted by signal scoreStoryDetailView— cluster detail, timeline, consensus/conflictArticleReaderView— full article, cached badge, more from clusterFeedManagerView— feed list, health states, add/deleteLatestView,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
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)