Open-source project
cromaguy/Rhythm avatar
cromaguy/Rhythm

Rhythm is a local-first Android player with a streaming mode

Your Music, Your Rhythm. An open-source, privacy-first Android music player featuring a beautiful Material 3 Expressive UI. Built entirely in Kotlin.

1,046 stars83 forksKotlinGPL-3.0

At a glance

What is it?
Rhythm is an open source Android music player written in Kotlin, built on Material 3 Expressive and Media3 ExoPlayer, with gapless playback, a ten band equaliser, synced lyrics and hearing protection. It plays local files, and it can also play from a Subsonic, Navidrome or Jellyfin server you control.
Who is it for?
Rhythm suits a listener who keeps a local music library on an Android phone, wants a 10 band equaliser with AutoEQ device presets, and wants the app to make no network calls unless they turn on streaming.
Can I use it commercially?
Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository last received commits 6 days ago.
What is it written in?
Mainly Kotlin, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

A player that assumes your files are on the phone

Rhythm is described as an open source, privacy-first Android music player, built entirely in Kotlin, with the slogan your music, your rhythm. The privacy claim is specific in the feature table rather than a slogan: 100% FOSS with zero tracking, offline capable by design, and local first, with your data and habits staying on your device.

That baseline decides what the app is for. Someone with a folder of FLAC files and no interest in a subscription service gets a full player with a ten band equaliser, replay gain normalisation, crossfade, gapless playback, high resolution playback and a synced lyrics view, and the app works with the network switched off. The privacy posture is the reason to prefer it over a store app that phones home, and the offline posture is the reason it stays useful on a plane.

The second half of the design is a mode called Go Mode, which handles streaming: local plus server playback over Subsonic, Navidrome and Jellyfin, with nearby-server discovery, so a self hosted library on your own network appears without typing an address. There is also a companion feature for downloading streaming tracks for offline playback, which closes the loop for someone who wants a self hosted library and a phone that still works in flight.

The audience is therefore two overlapping groups: someone with a local collection who wants a capable, ad free player, and someone who already runs a self hosted music server and wants a good client for it. The project also publishes on Google Play under the package chromahub.rhythm.play, distributes builds through GitHub releases, and appears as an installable target in the Obtanium and IzzyOnDroid ecosystems.

The audio engine is Media3 ExoPlayer with a ten band equaliser

The playback layer is Media3 ExoPlayer, and the features listed on the audio side are the ones that follow from that choice plus a signal processing chain.

The project describes the engine as Pro Audio: Media3 ExoPlayer with gapless playback and a high resolution mode. Gapless playback is the feature that separates a serious player from a casual one, because it removes the silence between tracks on an album, which changes the listening experience of a record rather than just the convenience. The high resolution mode is about the same thing at the other end of the chain, letting the player pass high resolution files through instead of resampling them.

The equaliser is the other headline. It is a ten band equaliser with more than 6032 AutoEQ device presets, which is a differentiator worth pausing on: AutoEQ is a large community compiled set of parametric corrections for specific headphone models, so the practical effect is that the player can apply a correction curve matched to your exact headphones rather than a generic flat tweak. The count matters less than what it enables, which is that the app can compensate for a known pair of headphones.

Loudness is handled by replay gain, with track and album level normalisation, so a library assembled from sources with inconsistent levels plays at a consistent volume. Crossfade is there with an adjustable duration. And decoding is broader than the platform default, with EAC3-JOC and Dolby Atmos support via FFmpeg, which means the app can play multichannel Atmos tracks from files.

Two features in the list are about the listener rather than the music. Mono audio downmixes to mono for single-earpiece listening, and Rhythm Guard is an integrated hearing safety and volume protection feature, which is the sort of thing a device that plays for hours on a bus deserves to have.

Material 3 Expressive, with layouts that change shape

The interface is built with Material 3 Expressive, and the theme is dynamic: Material You with wallpaper colours on Android 12 and later. That means the app takes its palette from the system wallpaper rather than shipping a fixed colour scheme, which is the platform's own theming convention.

Beyond the palette, the design work is in the adaptive shapes and in the layouts that respond to the device. There is a tablet UI with a multi pane layout, and a foldable ready mode with posture aware player layouts that adapt to tabletop, book and separated screen postures. The foldable case is the one that has been unusual to support well, because a music player is exactly the app you want to prop open on a table, and a layout that ignores the hinge produces a player split across two awkward halves.

The library screens are where most of the navigation lives. The feature list calls out an A to Z scroll bar, multi-select batch operations, and Album Artists and Dates tabs, which are the differences between a file browser and a music library. The stats feature is versioned as Rhythm Stats 2.0 and covers overview, songs, albums, artists and history, so listening history is a first class view rather than a hidden log. Home screen widgets come in multiple layouts including a dedicated lyrics widget, which is the feature that turns the app into something you leave on the home screen.

Synced lyrics come from LRCLib integration with word by word highlighting and a full screen view, so the lyrics track the vocal rather than scrolling at a fixed rate, and the play button doubles as the entry to that view.

Where to get it, and what to check before you install

The project distributes through several channels, and the choice matters for how you receive updates. The canonical links in the project header are a website at rhythmweb.vercel.app, a Google Play listing, a direct download pointing at the latest GitHub release, a Discord, a Telegram support channel and a wiki. The repository topics include Obtanium and IzzyOnDroid, which are the two Android ecosystems that install apps straight from a release feed rather than from a store.

There is no build instruction in the project documentation, because the intent is that you install a signed build rather than compile it. If you want to build from source instead, the repository is laid out like a normal Android Studio project, with app/ as the module, build.gradle.kts and settings.gradle.kts at the root, the Gradle wrapper committed as gradlew and gradlew.bat, gradle.properties for the build configuration, and a .kotlin/ directory for Kotlin specific tooling. The .idea/ directory is committed as well, which tells you the project is developed in Android Studio.

Before installing, two requirements are stated in the feature table. The platform is Android with API level 26 and above, which is Android 8.0, and the badge confirms that floor, with a later Android version listed for the platform target. The resource requirements are 2GB of RAM and 50MB of storage, and the 50MB figure is worth noting because it suggests the app itself is small, with the bulk of your library living on the device rather than inside the application.

The one thing to decide before you install is whether you will use the local library or the Go Mode server path, because the second one needs a server address and credentials, and the discovery feature only finds servers on the same network.

GPL-3.0, and what it means for a user and for a fork

The licence is GPL version 3, with the licence file linked from the badge and a copy in the repository's docs directory. For a user who installs the app, GPL-3.0 costs nothing: the application is free and the source is available, and the copyleft obligation runs against whoever distributes a modified version, not against the person running the unmodified one.

For anyone who wants to change the app, the terms are more consequential. A derivative of Rhythm that you distribute has to be released under GPL-3.0 with its source, which is the standard bargain and is manageable, but it does mean a fork cannot be shipped as closed source. Combined with the fact that the project is maintained by one developer with sponsorship links rather than a company, a fork also means forking the codebase without a support relationship with the upstream author.

The privacy claims and the licence point in the same direction, which is a good sign about the project's coherence. The feature table states 100% FOSS with zero tracking, offline capable, local first. The reader should take those as claims about the published application and check the network permission behaviour in the source if the distinction matters to them, particularly if they enable Go Mode, which by definition talks to a server.

For the developer building on top of the project, the repository also carries a code of conduct, a contribution process in the .github/ directory, and a Weblate configuration with a translation status badge, so the string resources are translated by a community rather than by the maintainer, which is the usual sign of a project that wants outside contributors.

Stable builds every few days, with beta builds alongside

The release pattern is the clearest signal about the state of the project. The recent tags are v5.5.492.1288-beta on 2026-10-01, v5.5.498.1300-stable on 2026-10-11 and v5.5.499.1302-stable on 2026-10-13. The version string itself encodes a build number and a channel marker, so a user can tell at a glance whether a build is a beta or a stable one, and the numbering shows the project is on its fifth major line with hundreds of builds behind it.

Two stable builds in three days is a fast cadence, and it means the distribution channels are the release mechanism rather than a periodic batch. The repository contains a fastlane/ directory, which is the toolchain for that, and a scripts/ directory alongside it, and a.release_banner_url file that suggests the release process can also push a banner to a hosted endpoint so that users of the app learn about a new build.

For a user, that cadence is good news and also a question. Updates arrive quickly, which means bugs get fixed quickly, and it also means the app's behaviour can change between builds, so a pinned version is not something the project really supports. Anyone who cares about a specific behaviour should note the version string when it works.

The repository also carries a macrobenchmark/ directory, which is the AndroidX mechanism for measuring performance of the user interface on a device rather than on an emulator, so the performance claims in the feature table are at least connected to a measurement setup. The last push was on 2026-10-17, and the repository is not archived.

Editorial conclusion

Rhythm suits a listener who keeps a local music library on an Android phone, wants a 10 band equaliser with AutoEQ device presets, and wants the app to make no network calls unless they turn on streaming. It is the wrong choice if you need a store published app with a formal support commitment, since the project is maintained by one developer with sponsorship links, and a poor match if you plan to modify and ship the app, because the GPL-3.0 licence requires you to publish the source of any distributed derivative. Before adopting, check the minimum API level against your device, decide whether you will use the local library or the Go Mode servers, and read the wiki for the equaliser preset behaviour on your headset.

Frequently asked questions

What are the system requirements for the Rhythm music player?

Rhythm requires Android 8.0 or later, which is API level 26, with 2GB of RAM and 50MB of storage. The app is written entirely in Kotlin and targets a later Android version as its build target.

Can Rhythm play music from a self hosted server?

Yes. The Go Mode feature covers local and server playback over Subsonic, Navidrome and Jellyfin, with nearby-server discovery, and there is a separate feature to download streaming tracks for offline playback.

Does Rhythm collect any data about my listening?

The project describes Rhythm as 100% FOSS with zero tracking, offline capable and local first, so your data and habits stay on your device. Enabling server streaming is the feature that puts your own server on the network path.

What licence is Rhythm released under?

Rhythm is released under the GNU General Public License version 3, with the licence text in the repository's docs directory. A distributed modified version would have to be published under the same terms.

Official sources

  1. cromaguy/Rhythm on GitHub
  2. License: GPL-3.0
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/cromaguy-rhythm.svg)](https://hysenlabs.com/projects/cromaguy-rhythm)

Was this useful?