## 1. Project scaffold - [x] 1.1 Create Xcode SwiftUI App under `studydeck-ios/` (iOS 17+, iPad-oriented target, bundle display name StudyDeck) - [x] 1.2 Add Info.plist keys: `NSLocalNetworkUsageDescription`, Bonjour services if used; configure Documents file sharing if desired - [x] 1.3 Scaffold module folders: `App/`, `Features/{Import,Explorer,Lesson,Study,Settings}/`, `Domain/`, `Services/{LanImportServer,Playback}/` - [x] 1.4 Wire `StudyDeckApp` with `ModelContainer` for SwiftData and root `NavigationSplitView` shell with four sidebar destinations ## 2. SwiftData models and file library - [x] 2.1 Implement SwiftData models: `CatalogEntry`, `Session`, `Album`, `AppSettings` per design entity draft - [x] 2.2 Implement `FileLibrary` helpers: Documents/`library/` root, path normalize, escape checks, unique dest naming - [x] 2.3 Implement extension → `ResourceKind` classifier aligned with desktop - [x] 2.4 Implement list/create/rename/move/delete APIs that update disk + SwiftData consistently - [x] 2.5 Seed empty library on first launch; add optional “purge orphan catalog rows” utility ## 3. Domain logic port - [x] 3.1 Port selection → StudyMode resolution (`resolveSelection` semantics) into Swift - [x] 3.2 Port album draft helpers (playlist / combo) into Swift - [x] 3.3 Port album item → session/lesson mapping helpers - [x] 3.4 Define shared enums/labels for StudyMode, AlbumMode, Orientation ## 4. LAN import server - [x] 4.1 Implement foreground HTTP listener (bind + start/stop API) with ephemeral port or fixed default port - [x] 4.2 No upload token/password; accept writes while running; surface trusted-LAN-only messaging - [x] 4.3 Serve embedded upload HTML (`GET /`) supporting multi-file selection only (no webkitdirectory / zip) - [x] 4.4 Implement `POST /upload` multipart writer into `library/` (flat basename) + CatalogEntry registration - [x] 4.5 ~~Optional: `POST /upload-zip`~~ removed — organize in Explorer after flat upload - [x] 4.6 Discover LAN IPv4; show URL + QR on Import; optional Bonjour advertiser - [x] 4.7 Stop/pause server on `scenePhase` background; reflect status in UI ## 5. Import UI - [x] 5.1 Build Import screen: LAN server toggle, connection card (URL/QR), status; no token UI - [x] 5.2 Add secondary Files/`fileImporter` import into same library pipeline - [x] 5.3 Show last import summary / errors (count, skipped other kinds) ## 6. Explorer / Lesson UI - [x] 6.1 Explorer directory browser with kind badges and multi-select - [x] 6.2 Folder mutations UI (new folder, rename, move, delete) with confirmation - [x] 6.3 Selection detail + Start lesson action using resolver - [x] 6.4 Album draft tabs (playlist/combo) save/delete flows - [x] 6.5 Lesson list: sessions history, resume active, delete session ## 7. Study playback - [x] 7.1 AVKit video/audio players bound to session resource file URLs - [x] 7.2 PDFKit view with page binding - [x] 7.3 Split layout for `video_pdf` / `pdf_audio` with orientation + adjustable ratio - [x] 7.4 Persist progress (mediaTime, pdfPage, splitRatio, orientation) on background / leave / throttle - [x] 7.5 Restore progress when opening an existing session - [x] 7.6 Single-resource modes (`single_video` / `single_audio` / `single_pdf`) polish ## 8. Settings and hardening - [x] 8.1 Settings: show library path, storage footprint, clear library (danger), about - [x] 8.2 Manual smoke checklist: LAN upload from Mac browser, Files import, start lesson, resume after kill - [x] 8.3 Document run instructions in `studydeck-ios/README.md` (open Xcode, Local Network permission, LAN import steps)