SwiftWing is a native iOS 26 book spine scanner app. Point your camera at a bookshelf, tap the shutter, and AI identifies and catalogs your books in real time.
Epics 1-5 are complete. Epic 6 (App Store Launch) is in progress.
| Epic | Focus | Status |
|---|---|---|
| 1 | Foundation & Walking Skeleton | Complete (A 95/100) |
| 2 | Camera | Complete (A 98/100) |
| 3 | Library UI | Complete (A 97/100) |
| 4 | Talaria AI Integration | Complete (A 99/100) |
| 5 | Refactoring (MVVM + Actor) | Complete |
| 6 | App Store Launch | In Progress |
The app is production-ready with a working end-to-end flow: Capture → Upload → SSE Stream → Review Queue → Library
open swiftwing.xcodeprojxcodebuild -project swiftwing.xcodeproj -scheme swiftwing \
-sdk iphonesimulator \
-destination 'platform=iOS Simulator,name=iPhone 17 Pro Max' \
build 2>&1 | xcsiftExpected: errors: 0, warnings: 0
Press Cmd+R in Xcode. Use the iPhone 17 Pro Max simulator.
SwiftUI Views → @Observable ViewModels → Actor Services → SwiftData
Key files:
| File | Role |
|---|---|
swiftwing/RootView.swift |
Tab container (Camera / Library) |
swiftwing/CameraView.swift |
Camera UI (~250 lines) |
swiftwing/CameraViewModel.swift |
Camera business logic (~550 lines) |
swiftwing/Services/TalariaService.swift |
Network + SSE actor (~680 lines) |
swiftwing/ReviewQueueView.swift |
Book review/approve UI (~575 lines) |
swiftwing/LibraryView.swift |
Library grid |
swiftwing/Models/Book.swift |
SwiftData model |
Concurrency: Swift 6.2 strict concurrency. Actors for all mutable shared state. No DispatchQueue with async/await.
Persistence: SwiftData with @Attribute(.unique) on ISBN to prevent duplicates.
- Language: Swift 6.2
- UI: SwiftUI (iOS 26.0+ only)
- Persistence: SwiftData
- Camera: AVFoundation
- Networking: URLSession + Server-Sent Events
- AI Backend: Talaria (
https://api.oooefam.net) - No external dependencies
| File | Purpose |
|---|---|
CLAUDE.md |
Full project guide for AI assistance (build commands, architecture, patterns) |
AGENTS.md |
Agent-optimized reference |
PRD.md |
Product requirements |
docs/ |
Architecture, testing, and operations docs |
.archive/ |
Completed epic summaries, one-time analyses, historical planning |
- Always pipe xcodebuild through xcsift — never call xcodebuild directly
- 0 errors AND 0 warnings required — warnings are treated as errors
- See
.claude/rules/build-workflow.mdfor details
The app uploads book spine images to the Talaria backend and streams results via SSE.
Endpoints:
POST /v3/jobs/scans— upload image, returns{ jobId, sseUrl }GET {sseUrl}— SSE stream (progress, result, complete, error events)DELETE /v3/jobs/scans/{jobId}/cleanup— cleanup after completion
SSE deduplication is critical: Talaria sends books via both .result events and inline in the .complete event. The deduplication guard in CameraViewModel is mission-critical, not defensive.
See CLAUDE.md for the full Talaria integration reference.
60% Swiss Utility + 40% Liquid Glass.
- Black base (
#0D0D0D) for OLED .ultraThinMaterialoverlays for depth- International Orange (
#FF4F00) accent - JetBrains Mono for data/IDs, SF Pro for UI
- Spring animations, 12px rounded corners
- Xcode: 26+ (iOS 26 SDK)
- macOS: Sequoia 15+
- Swift: 6.2
- Simulator: iPhone 17 Pro Max
- CLI tool:
xcsift(required for all builds)
Bundle ID: com.ooheynerds.swiftwing
Min Deployment: iOS 26.0
Last Updated: 2026-02-19