Skip to content

FabianZettl/Neiro

Repository files navigation

Neiro icon

Neiro (音色)

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.

Latest release Android 8.0+ Jetpack Compose


📸 Screenshots

Now Playing Home Screen Album Detail Album Detail (Light) Customize Home


✨ Features

🎨 Dynamic Color Theming

  • 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

🎵 Playback

  • 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

🪟 Now Playing

  • 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

🏠 Home Screen

  • 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

📊 Last.fm Integration

  • 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 scrobble endpoint
  • Simple login: just username + password — no API key required

📚 Library

  • 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

🎙️ Podcasts

  • 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

📻 Internet Radio

  • Browse and play internet radio stations from your Navidrome server

🖼 Home Screen Widget

  • Now-playing widget with album art, track info, play/pause and skip controls

🖥️ Desktop App

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

📦 Installation

  1. Go to Releases and download the latest APK
  2. Enable Install from unknown sources on your Android device
  3. Install and open Neiro
  4. In Settings, enter your Navidrome/Subsonic server URL, username and password

Requires Android 8.0 (API 26) or higher.


🔧 Build from Source

git clone https://github.com/FabianZettl/Neiro.git
cd Neiro
./gradlew assembleDebug
# APK: app/build/outputs/apk/debug/app-debug.apk

Requires Android SDK with min SDK 26, target SDK 35.


📋 Changelog

v0.3.0-alpha (2026-06-12)

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-track track.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

v0.2.0-alpha (2026-06-11)

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 timeOffset parameter 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)

v0.1.0-alpha (2026-06-09)

  • 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

🛠️ Tech Stack

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

⚠️ Known Limitations (alpha)

  • 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)

🤖 AI Transparency

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.


📄 License

MIT

About

Android music streaming app for OpenSubsonic/Navidrome — dynamic album-art theming, Last.fm integration, liquid-glass mini player

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages