{/* Hero */}
Music
Search the library, play songs, and manage playlists.
{/* Search */}
{ setQuery(e.target.value); if (slskMode) exitSlsk() }}
className="w-full pl-12 pr-4 py-3 rounded-lg border border-border bg-background focus:outline-none focus:ring-2 focus:ring-purple-500"
placeholder="Search songs, artists, albums..."
autoFocus
/>
{/* Soulseek mode toggle */}
{slskMode && (
Soulseek
Searching peer-to-peer network
)}
{/* Navidrome Results */}
{!slskMode && (
<>
{searching && (
)}
{searchError && (
)}
{!searching && songs.length > 0 && (
{songs.map((song, i) => (
))}
)}
{!searching && debouncedQuery.length >= 2 && songs.length === 0 && !searchError && (
No results for “{debouncedQuery}” in the library
)}
{query.length > 0 && query.length < 2 && (
Type at least 2 characters to search
)}
{/* MusicBrainz Discovery */}
{debouncedQuery.length >= 2 && (
)}
>
)}
{/* Soulseek Results */}
{slskMode && (
<>
{slskSearching && slskResults.length === 0 && (
Searching peer-to-peer network...
)}
{slskResults.length > 0 && (
{slskSearching && (
Still searching...
)}
{slskResults.map((file) => {
const sizeMB = (file.size / 1024 / 1024).toFixed(1)
const key = `${file.bestPeer.username}:${file.filename}`
return (
{file.displayName}
{sizeMB} MB
{file.bitRate > 0 && ` · ${file.bitRate} kbps`}
{' · '}{file.bestPeer.username}
{file.peerCount > 1 && (
{file.peerCount}
)}
)
})}
)}
{!slskSearching && slskResults.length === 0 && slskSearchId && (
No results found on Soulseek
)}
>
)}
{/* Playlists - shown when not searching */}
{!slskMode && !debouncedQuery && (
Playlists
{playlistsLoading ? (
) : playlists.length === 0 ? (
No playlists yet
) : (
{playlists.map((p) => {
// Check how many songs in this playlist are already offline
const allOffline = expandedPlaylist === p.id && playlistSongs.length > 0 &&
playlistSongs.every((s) => offlineIds.has(s.id))
return (
{/* Download entire playlist */}
{expandedPlaylist === p.id && playlistSongs.length > 0 && (
)}
{expandedPlaylist === p.id && (
{playlistSongsLoading ? (
) : playlistSongs.length === 0 ? (
Empty playlist
) : (
{playlistSongs.map((song, i) => (
))}
)}
)}
)})}
)}
)}
{/* Info */}
How does this work?
This searches your Navidrome music library. Songs play directly in the browser through a
persistent audio player. Can't find what you're looking for? Search Soulseek to find
and download music from the peer-to-peer network.