Cloud upload v1 shipped (2026-03-18): single file upload via toolbar + right-click context menu on local tracks. The v1 UploadService tracks state globally (idle/uploading/success/error) but there's no per-track visual indicator of upload status.
We already have per-track download state indicators on track rows (downloaded/downloading/error icons, managed by DownloadManager and Track.downloadState). The user wants symmetrical upload indicators — so a track row shows whether it's been uploaded to the cloud, is currently uploading, or failed.
Per-track upload state model: Currently UploadService is fire-and-forget — it doesn't associate uploads with Track objects. We need a way to track "this local Track has been uploaded to cloud" or "is currently uploading". Options:
uploadState to the Track SwiftData model (mirrors downloadState)Visual indicators on track rows: The row already shows download state icons. How should upload state appear?
Interaction between upload and download states: A track could theoretically be both "downloaded from cloud" AND "uploaded to cloud" (if you download a cloud track, it becomes local, then re-upload). How to handle overlapping states?
Multi-file queue implications: If we later add batch upload (#1 from pre-brief), per-track state becomes essential for showing queue progress. Shape this with batch in mind.
Sources/Models/Track.swift — has downloadState enum and propertySources/Views/TrackRow.swift — renders download state indicatorsSources/Views/PlaylistView.swift — context menu with "Upload to Cloud"Sources/Services/UploadService.swift — current global state, no per-track trackingSources/Services/DownloadManager.swift — per-track download state pattern to mirrorSee briefs/cloud-upload-v2-prebrief.md for the full list of deferred upload items and suggested grouping.