A shared facade
Centralising Navidrome access avoids rebuilding the whole integration in every client. The BFF becomes an additional component to host, observe and maintain; clients depend on its availability.
Listening to my self-hosted music library through a coherent web interface and Android app. I designed and developed this personal project, from the server facade to both clients.
Study checked on . Role: personal design and development.
Navidrome already stores the music. The need is the listening experience: library, search, favourites, playlists and playback queue. The browser and Android need to share capabilities while Navidrome stays behind a server interface.
ASP.NET Core API, JavaScript web client, Flutter app, Subsonic integration and service tests. The work also includes authentication, media proxying and separating complementary data. Web and mobile code are published in two separate repositories.
Web and Flutter clients call a shared API. This facade, or BFF, adapts Navidrome’s Subsonic API and proxies audio streams and artwork. PostgreSQL stores complementary podcast data and audiobook playback positions.
Interface, player state and navigation.
Session, common contract and media proxy.
Music library on one side, complementary data on the other.
Centralising Navidrome access avoids rebuilding the whole integration in every client. The BFF becomes an additional component to host, observe and maintain; clients depend on its availability.
The mobile client tolerates missing collections and variations in Subsonic response shapes. Models and deserialisation helpers isolate these details from the interface. This tolerance needs precise examples in tests.
A server capability does not automatically imply a finished interface in every client. Music playback, podcasts, audiobooks and media integrations need separate checks and their own delivery status.
On 23 October 2026, the .NET service suite was run against the source project: 29 tests passed, no failures. It covers Subsonic request construction, response and error handling, and accepting or rejecting session tokens.
These tests verify covered behaviour in a development environment. They do not replace playback acceptance on devices, load testing or a security audit of the installation.
Observable result: two clients use the same API boundary. This personal project illustrates design and verification without attributing performance or commercial results to a client.
Describe your web or mobile clients, connected systems and available access. Initial reply within 48 business hours, quote after scoping.