Coda

Changelog

A history of notable changes, fixes, and features in Coda.

v1.4.0September 2026

Features

  • iPod Classic layout with a fully functional click wheel — scroll, click, and center Select with haptics
  • Period-accurate wide iPod screen with menu-driven navigation
  • Music, Artists, Albums, and Playlists library browsing
  • Now Playing with click-wheel scrubbing and volume control
  • Search, Reorder Mode, and more inside the iPod UI
  • 8 device finishes — Classic White, Classic Black, Aluminum, and the four Mini colors (Settings > Appearance)

Fixes

  • Real battery level and charging indicator on the iPod status bar
  • Fixed missing artwork on the iPod Now Playing screen for cached and offline tracks
  • Redesigned lyrics view with an always-visible controls row underneath
  • Moved shuffle and repeat onto the top status bar instead of duplicated player controls
  • Now Playing chrome (progress bar, lyrics, toggle) now matches the selected device finish
  • Fixed ExpoFontLoader and battery native-module crashes on launch
v1.3.0September 2026

Features

  • Batch Download All — grab an entire playlist or Navidrome album at once
  • Playlist detail: tap the cloud icon in the header to download every non-cached Navidrome track
  • Navidrome album browse view: Download All button under the breadcrumb
  • Library multi-select can batch-download selected tracks together
  • Live progress bar, per-track spinners/progress, and cancel for ongoing batches
  • Failed downloads are reported and retried in one tap from the playlist banner
  • Already-offline tracks are skipped automatically; resume re-downloads only what is missing
v1.2.0September 2026

Features

  • New iPad layout with sidebar navigation replacing the bottom tab bar
  • Responsive layout with device-adaptive touch targets and content width
  • Safe-area (home indicator / notch) fixes for tablet views
  • iPhone experience unchanged
v1.1.0September 2026

Features

  • Support multiple saved Navidrome server configurations — switch between servers without re-entering credentials
  • Each server's library, playlists, downloads, and playback state are fully isolated
  • New server management UI in Settings — add, edit, delete, and switch servers
  • Connection test before saving to verify server accessibility
  • Transparent migration from single-server — existing users are unaffected
v1.0.0September 2026

Playback Engine

  • Fixed overlapping audio on rapid track switching — only one player is active at a time
  • Fixed stale progress bar after switching tracks
  • Fixed track and playback position not persisting across app restarts
  • Fixed Navidrome cached tracks failing to restore on launch
  • Made position saves asynchronous to prevent UI thread blocking

Swipe Gestures

  • Rebuilt SwipeableRow on react-native-gesture-handler + react-native-reanimated for 60fps UI-thread animations
  • Fixed swipe-to-reveal accidentally triggering row play actions
  • Added horizontal/vertical gesture disambiguation to prevent conflicts with FlatList scrolling

Lyrics

  • Fixed multi-timestamp LRC lines displaying raw timestamp text
  • Fixed lyrics sync drift after tap-to-seek
  • Reduced highlight delay from 300ms to 200ms for tighter sync
  • Added support for LRC files with optional fractional seconds

Security

  • Encrypted Navidrome and Last.fm credentials with AES-256-GCM in settings JSON
  • Moved encryption key to expo-secure-store (iOS Keychain / Android Keystore)
  • Auto-migrated legacy plaintext credentials from AsyncStorage to SecureStore
  • Replaced Math.random() with CSPRNG for salt generation
  • Added file path sanitization for server-provided IDs in offline cache
  • Removed unused RECORD_AUDIO permission on Android

Performance

  • Split isPlaying into isolated context — eliminates 10x/sec re-renders of all useAudio() consumers
  • Split sleep timer into isolated context to prevent 1x/sec re-renders
  • Deferred synchronous filesystem cache scan until after UI is interactive
  • Migrated all image components to expo-image with memory-disk caching
  • Added FlatList virtualization tuning for large libraries
  • Memoized smart playlist evaluation to avoid O(n) library scans per render

Features

  • 5-band native equalizer with 6 presets (Flat, Bass Boost, Treble, Vocal, Rock, Pop)
  • Smart playlists with rule-based filtering (play count, favorites, artist, album, source)
  • Last.fm scrobbling and now-playing updates
  • Synced lyrics via LRCLIB with tap-to-seek and fallback to plain text
  • Crossfade and seamless/gapless playback modes
  • Sleep timer with 30-second fade-out
  • Playback speed control (0.5x–2.0x)
  • Offline download and caching for Navidrome tracks and artwork
  • 4 themes — Dark, Light, Midnight, Ocean
  • File import via document picker for local audio
  • Background audio with lock screen and Control Center controls
  • Batch operations — multi-select for favoriting, playlist add, download, delete
  • Shuffle with Fisher-Yates algorithm
  • Centralized file storage in Coda/ folder, visible in iOS Files app
  • Clear Cache and Clear Data settings with confirmation dialogs