Coda

Changelog

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

v1.0.0August 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