An Android music client for OpenSubsonic / Navidrome — built for music lovers, Last.fm nerds, and anyone who wanted Apple Music's look on their own server.
Dynamic album-art color theming, liquid-glass mini player, and deep Last.fm integration.
- Every screen adapts its color scheme to the current album art via the Palette API
- Smooth animated transitions between color palettes when the song changes
- Toggle between dynamic color and a fixed accent color (8 presets)
- Full Light / Dark / System theme support
- Streams directly from your OpenSubsonic/Navidrome server — no downloads, no caching
- Media3/ExoPlayer backend with lock-screen controls and persistent notification
- Configurable streaming quality (Original / 320 / 256 / 192 / 128 kbps)
- AutoDJ: automatically queues similar tracks when the queue runs out
- Sleep timer with countdown display
- Play, shuffle, repeat, skip, seek, play-next, add-to-queue
- Fullscreen player with blurred album art background and glass card UI
- Liquid-glass mini player with real-time haze/blur effect
- Album art cross-fade animation on track change
- Lyrics display (OpenSubsonic structured lyrics)
- Audio format / bitrate quality badge (FLAC, MP3, etc.)
- "Share Now Playing" card (generated image with album art)
- Sleep timer with live countdown
- Fully configurable sections with drag-to-reorder, enable/disable, custom titles
- Album sections: Recently Added, Random, Top Rated, By Genre, By Year, Most Played
- Artist sections with optional genre filter and sort options
- Last.fm Top Artists and Top Albums — cross-referenced with your library for cover art and navigation, configurable time range
- Top Tracks from Last.fm with play count display
- Latest Podcast Episodes section
- Personal play counts on album and artist pages
- Top 10 most-played tracks per artist — pulled from your own scrobble history, tappable to play
- Top Albums, Top Artists, Top Tracks on the home screen — all time, last year, last month, last week
- Loved track indicators (❤️) in album track lists
- Love / unlove tracks directly from the fullscreen player
- Scrobbling via the Subsonic
scrobbleendpoint - Simple login: just username + password — no API key required
- Artist detail pages: biography, genre chips, external links (Last.fm, Wikipedia, RateYourMusic), album grid
- Album detail: compact header, full track list with duration and loved indicators
- Sort and search in Artists, Albums, and Playlists lists
- Multiple view modes for Albums and Artists: 2-column grid, 3-column grid, list view
- Playlists, starred tracks, search
- Subscribe to any podcast via RSS feed URL
- Import/export subscriptions via OPML file
- Episode list with artwork, date, and duration
- Stream episodes directly — no downloads needed
- Latest episodes as an activatable Home section
- Browse and play internet radio stations from your Navidrome server
- Now-playing widget with album art, track info, play/pause and skip controls
Neiro Desktop is the companion desktop client (Linux / macOS / Windows) — same server, same Last.fm account, same playlists.
- QR Sync — scan a QR code from the desktop app to transfer your server credentials to the phone instantly
- Rockbox Device Sync — sync your library to any mounted DAP with configurable folder templates, server-side transcoding, and M3U playlist export
- Built with Compose Multiplatform, VLC (vlcj), and the same dynamic color theming
- Go to Releases and download the latest APK
- Enable Install from unknown sources on your Android device
- Install and open Neiro
- In Settings, enter your Navidrome/Subsonic server URL, username and password
Requires Android 8.0 (API 26) or higher.
git clone https://github.com/FabianZettl/Neiro.git
cd Neiro
./gradlew assembleDebug
# APK: app/build/outputs/apk/debug/app-debug.apkRequires Android SDK with min SDK 26, target SDK 35.
New features
- Artist pages: Top 10 most-played tracks from your personal Last.fm scrobbles — tap to play immediately
- Album and Artist list screens: toggle between 2-column grid, 3-column grid, and list view
- Settings: About section with version number, GitHub link, and privacy note
- Simplified Last.fm login — username + password only, no API key needed
Performance
- Home screen now loads progressively — sections appear as they finish instead of waiting for all
- Shimmer skeleton placeholders shown while each section loads
- Memory caches for albums, artists, songs, Last.fm data, and podcast feeds (5–30 min TTL)
- Track matching capped at 5 concurrent requests to avoid overwhelming the server
- Podcast feeds cached 20 minutes (was re-fetched on every tab switch)
Bug fixes
- Last.fm home sections were not loading after the login simplification (wrong credential check)
- Notification tap now correctly opens the app
- Now-playing indicator with animated equalizer bars in album track list
- Artist top tracks now uses
artist.getTopTracks+ per-tracktrack.getInfo— works reliably even for artists you've only played a few times - "About" and "Links" headings on artist pages were unreadable in dark mode
New features
- Podcast support: subscribe via RSS URL, import via OPML, episode streaming, Latest Episodes home section
- Internet Radio: browse and play stations from your Navidrome server
- Sleep timer with live countdown in the player
- Sort + search in Albums, Artists, and Playlists library screens
- AutoDJ: auto-queues similar tracks when queue ends
- Audio quality badges in the fullscreen player (format + bitrate)
- "Share Now Playing" card from the player overflow menu
- Home screen widget (album art, track, play/pause, skip)
- Genre tags and multi-genre filtering on albums
- Multiple column list layout option for library screens
Improvements
- Last.fm stats driven by sort type — no separate picker
- Seekbar fix via
timeOffsetparameter for transcoded streams - Animated song crossfade in fullscreen player
- Lyrics support (OpenSubsonic structured lyrics)
- Home sections: drag-to-reorder, enable/disable, add custom sections
Bug fixes
- Fixed crash when playing songs (widget update on main thread)
- Fixed navigation back from Now Playing screen
- Fixed palette extraction using wrong fallback colors in light mode
- Drawer always uses dark theme to prevent white-on-white rendering
Removed
- Chromecast support (removed for stability; may return in a future release)
- Initial public pre-release
- Dynamic album-art color theming with animated transitions
- Fullscreen player with blurred background and glass card
- Liquid-glass mini player (haze/blur overlay)
- Home screen with configurable, reorderable sections
- Last.fm integration: top charts, play counts, loved tracks, love/unlove
- Library: artists, albums, playlists, starred, search
- Album detail: compact Apple Music-style header
- Artist detail: biography, stats, external links
- OpenSubsonic MD5 auth, streaming quality selector
- Light / Dark / System theme + accent color selector
- Queue: play-next and add-to-queue from album track list
| Language | Kotlin |
| UI | Jetpack Compose + Material 3 |
| Player | AndroidX Media3 / ExoPlayer |
| Networking | Retrofit 2 + OkHttp 3 |
| Images | Coil |
| Color Theming | AndroidX Palette API |
| Blur / Glass | haze by chrisbanes |
| DI | Hilt |
| Storage | DataStore Preferences |
| Navigation | Compose Navigation |
- No tablet / landscape layout optimisation
- No ReplayGain support yet
- Podcast playback does not save resume position yet
- No podcast search/discovery (subscribe by URL or OPML only)
Every line of code in this project was written by Claude Code (Anthropic). I have no formal coding background.
What I bring to the table: a clear vision of what the app should do and feel like, hours of hands-on bug testing on a real device, strong opinions about UI quality, and an ongoing effort to keep the codebase clean and well-structured rather than just "working".
I define the features, review the logic, catch the bugs, and push back when something feels wrong — Claude writes the implementation. The result is an app I'm genuinely proud of and use every day.
MIT





