For Navidrome · web and Android

Your library, mixed like a DJ.

Kultr is a modern, minimalist client for Navidrome. It mirrors your whole library locally, crossfades on two real decks, and beat-matches one track into the next.

No account, no tracking Open source, Apache 2.0 Self-host in a minute

Now playing
Re-entry
Nocturne Machine — Low Orbit
0:14 0:30
Up next
 

A working demo. Wait for the blend or press next — this whole page takes its colour from the cover, the way the app does.

A look at it

Glass, and whatever colour the music is.

The albums grid in Kultr, with a sidebar and a player bar in glass. An album page, tinted amber by its cover, with the track playing. The full-screen player's InjeKt tab: BPM, key, energy, intro and outro for both tracks. Appearance settings: panel opacity, grid size, six playhead styles and count time down. Settings for choosing and ordering the home page shelves. The home page, greeting with Good evening above the Played the most and Recently added shelves. The albums grid in the light theme. The sign-in screen, with fields for the server, username and password.

Your library, mirrored locally. Browsing is instant because nothing is fetched to draw it.

What it does

Fast because it’s local.
Smooth because it’s two decks.

Kultr keeps a copy of your library on the device, so no page waits on the server to draw. And every track plays on one of two decks, so a transition is a real overlap, not a volume trick.

Your whole library, mirrored

One button copies every artist, album, track, playlist and genre to the device. Browsing, sorting and searching are then instant, and keep working with the server switched off. After that, a check pulls in only what moved — on start-up, hourly, or when you ask.

Instant searchWorks offlineIncremental

Crossfade that isn’t a trick

Two players genuinely overlap, for up to 20 seconds, in four fade shapes. Or switch it off for gapless: the next track starts the instant this one ends.

InjeKt

Beat-matched, key-aware transitions, planned from each track’s tempo, key, energy and structure.

Offline, with real filenames

A sync button on every page. Downloads go into the browser, or a folder you pick, named Artist - Album - Track.

As many servers as you like

Give each one a name, switch between them, and turn one off without deleting it.

Colour from the cover

The surfaces, the highlights and the backdrop all retint from whatever is playing. Then make it yours: light or dark, three corner styles, six playheads, an accent blended with the artwork’s, and a box for your own CSS.

And everything you’d expect

10-band equaliserReplayGainSynced lyricsScrobblingSleep timerInternet radioListening statsChromecast & AirPlayKeyboard shortcutsRatingsPlaylists

InjeKt

It doesn’t lay one track over the next. It injects it.

Kultr decodes each track once and measures it: tempo and beat grid, musical key, loudness and brightness, and where the intro ends and the outro begins. When one track is about to hand over, it plans the transition from those numbers — and shows you the plan.

Aurora I · 126 BPM · 8A Vanta II · 118 BPM · 8A

Beat-matched at 122 BPM — this track down 3.2%, the next up 3.3%

An InjeKt transition, from Aurora I into Vanta II Aurora I, at 126 BPM, drifts down to 122 over its last eight bars before the blend. Vanta II enters on its first real downbeat, skipping its intro, sped up from 118 to 122 BPM. Through the blend the bar lines of both tracks line up, and halfway through the bass hands over from the old track to the new one. Afterwards Vanta II eases back to its own tempo. Tempo drift · 8 bars Blend · 7.2 s OutgoingAurora I126 BPM · 8A IncomingVanta II118 BPM · 8A Bass swap Intro skipped Tempo 126 122, shared 118

Scroll sideways to see the whole transition.

Beat-matching, from both sides

Rather than drag the new track onto the old one’s tempo, it picks a tempo between them and moves both. Each side moves half as far, which is half as audible — and pairs a one-sided match would reject now work.

Bar alignment

The blend starts on a downbeat of the outgoing track and the incoming one enters on a downbeat of its own, so the grids actually line up.

Bass swap

The outgoing bass rolls off before the incoming bass comes up, so two kick drums never fight.

Harmonic mixing

Keys are worked out in Camelot notation. When two clash, it filter-sweeps out of the old track instead of blending into a muddy chord.

Intro skipping

The next track comes in at its first real downbeat, not after twenty seconds of ambient pad.

Auto-continuation

When the queue runs out it keeps going, with tracks chosen by tempo, key and energy, so the set keeps flowing.

Every part degrades gracefully. No analysis yet, tempos too far apart, or no Web Audio — and it quietly becomes a good ordinary crossfade.

The DSP and the mixing rules

Get Kultr

The demo is the real app.

It runs entirely in your browser and connects to your Navidrome. It stores nothing, ships no music and has no backend. Rather not trust a page on the internet with your password? Run it yourself — it takes about a minute.

Android 8.0+

On Android

A proper Android music app with the same behaviour — crossfade, InjeKt, the library mirror — plus what only a native app can do.

  • Background playback and a media notification
  • Lock-screen, Bluetooth and Android Auto
  • “Play … on Kultr” voice search
Signing certificate fingerprint SHA-256 3C:26:16:4A:FD:6F:C1:30:F5:7D:A5:2B:4F:04:AB:2B:E8:3C:89:25:50:89:6F:C9:43:57:D2:E0:B8:51:6F:E0
Docker · Node

On your own server

Already running Navidrome in Docker? Three commands, then open localhost:4180 and leave the server field blank.

Terminal
$ git clone https://github.com/evropiani/Kultr.git
$ cd Kultr
$ docker compose up -d

A native iOS app is planned; until then Kultr installs from Safari as a web app. Settings exported from one Kultr open in the other. What’s new

Your data

It talks to one server. Yours.

No analytics, no telemetry, no third-party requests, no fonts from anyone’s CDN. This website keeps the same rule.

  • Your password stays yoursSubsonic needs it to sign each request, so it’s kept on the device and sent nowhere but your own server. On Android it’s sealed with a key in the Keystore.
  • The mirror lives with youThe library, InjeKt analysis and listening history stay on the device. Settings → Reset Kultr erases the lot.
  • Downloads go where you sayInside the browser, or a folder you picked. A page can only write where you’ve pointed it — by design.
  • Backups leave secrets outSettings export to a small JSON file. Passwords and usernames are never in it, and servers only if you ask.

Vibecoded with Claude Code

Every part of Kultr — the Subsonic client, the two-deck audio engine, the tempo and key detection, the interface, the tests and the install guides — was produced by prompting Claude Code rather than typed by hand. It’s a fair thing to disclose. So was this website.

Read the source

Put something on.

Open Kultr, point it at your Navidrome and press Sync my library. It only has to happen once.