• Group toggles — iPhone / Watch / Companion / Audio, all persistent
via @AppStorage so your filter state survives app restarts
• Level toggles — ERROR / WARN / INFO / DEBUG in a single scrollable
row next to the group toggles, color coded red/yellow/cyan/gray
• Delta timestamps — each row shows +42ms between it and the previous
entry, so you can see timing without mental math
• Pause/Resume — bottom bar button snapshots the current log so you
can read it without it scrolling, while still capturing in background
• Auto background/foreground markers — ── Background ── / ──
Foreground ── lines are auto-inserted by NotificationCenter, making
crash correlation much easier
• PiP button in toolbar sets logger.isPiP = true, which MainTabView’s
.onChange picks up and activates the existing floating PiP window
MainTabView.swift — minimal changes:
• Added .onChange(of: debugLogger.isPiP) to sync the console’s PiP
button to the existing debugPipMode state
• Updated debugLogRow to show level dot + marker support, consistent
with the full console
Two fixes:
Snap-back on seek end: Previously isScrubbing = false was set
immediately after seekToPercent(pct). AVPlayer.seek is asynchronous —
currentTime doesn’t update instantly. So displayProgress switched from
scrubPosition back to the old playbackTime / playbackDuration for up
to 250ms until the timer polled again, causing a visible snap-back.
Now scrubPosition is held at pct and isScrubbing clears after a 150ms
delay — enough time for AVPlayer to confirm the seek position before
the bar resumes tracking currentTime.
Stale timer poller removed: playbackTime and playbackDuration were
@State vars updated by a Timer.publish every 0.25s. Since currentTime
and duration are already @Published on AudioPlayer, the timer was just
adding lag and a secondary update cycle. They’re now computed
properties reading directly from audioPlayer.currentTime and
audioPlayer.duration — updates arrive instantly via SwiftUI’s
observation, same as the full Now Playing view.
Features:
- Dual-AVPlayer Smart DJ crossfade with LUFS normalization
- Mitsuha-style FFT visualizer (real-time + offline pre-computed)
- Companion API integration (Smart DJ, tag editing, vis frames)
- Offline-first SyncEngine with delta sync and album detail pre-caching
- Audio pre-fetcher for gapless queue playback
- Optimistic action queue (star/unstar with background retry)
- ShazamKit recognition with MusicKit preview playback
- Radio streaming with HLS/PLS/M3U support and buffer seek
- Watch app with Crown Sequencer and Ultra speaker support
- Batch metadata editing with album_artist fix for split albums
- Cache-first UI pattern across all views
- NWPathMonitor offline detection with reactive song greying