Timbra is a free lightweight music player for Android inspired by Poweramp v2. It rebuilds that look and feel as original code on a modern stack.
![]() |
![]() |
![]() |
![]() |
- Folder-first browsing — a virtual folder tree built from file paths.
- Full library — Folders, Albums, Artists, All Songs, Genres, Playlists, and the play Queue. (Genres and Playlists come from legacy MediaStore tables that Android 11+ often leaves sparse or empty — that is the OS, not a missing feature.)
- Wide format support — FFmpeg-backed decoders play far more formats than Android's native codecs.
- Gapless & background playback — keeps playing with lock-screen, notification, and Bluetooth controls, including gestures.
- Gesture-based album-art navigation — swipe the album art: left/right to change song, up/down to jump to the next/previous folder.
- 7-band equalizer — a custom DSP processor independent of the device's installed audio effects.
- Shuffle — off · shuffle current list · shuffle all songs.
- Repeat — off · repeat list · advance list · repeat song.
- Search across the library.
- Dark theme — reuses the classic matte skin visuals, with a pure-black window optimized for OLED screens.
- No ads, no telemetry, no bullshit.
- Android 7.0 (API 24) or newer.
- ABIs:
arm64-v8a,armeabi-v7a(emulator-only x86/x86_64 are excluded).
- Language / UI: Kotlin, Android XML Views (View Binding), AndroidX Navigation, RecyclerView + ViewPager2, Material 3.
- Audio: AndroidX Media3 / ExoPlayer
1.5.1with the nextlib FFmpeg extension (NextRenderersFactory). - Async: Kotlin coroutines; Guava
ListenableFuturefor theMediaControllerhandshake. - Package
com.timbra, single-module app.
build.sh builds from scratch on a bare machine — if no toolchain is found it
downloads and provisions one automatically (JDK 17, Gradle 8.13, Android cmdline-tools,
platform-tools, SDK platform 35 and build-tools 35) into ./toolchain/, then builds and
copies the APK to the repo root as timbra-<versionName>.apk. No NDK, Android Studio or
pre-installed SDK required; the FFmpeg decoders come prebuilt inside the nextlib AAR.
./build.sh # assembleRelease (default)
./build.sh --no-install # build but leave the device alone
./build.sh assembleDebug # debug variant, written as timbra-<version>-debug.apk
# To use an existing toolchain instead, point TIMBRA_ENV at an env script to source:
TIMBRA_ENV=/path/to/toolchain/env.sh ./build.shThe debug variant gets its own filename because it is signed with the default debug key: it cannot be installed over a release build (Android rejects the signature change), and sharing one filename would let it quietly replace the release APK at the repo root.
Unit tests need no device:
gradle testReleaseUnitTestToolchain resolution order: $TIMBRA_ENV → ./toolchain/env.sh → ../toolchain/env.sh
(a shared sibling toolchain) → java/gradle/$ANDROID_HOME already on PATH → self-
provision. Provisioning is guarded per component, so a partial toolchain heals itself and
re-runs are fast no-ops. Self-provisioning downloads Linux x86_64 binaries and needs
curl, unzip and tar; on other hosts supply a toolchain via TIMBRA_ENV.
The release variant is minified (R8) and signed with the bundled timbra.keystore so the
APK has a stable signing identity and installs/updates smoothly.
After building, the installation is performed automatically if an Android device is
connected. By default, the installation updates the app in place (adb install -r)
using the most recently built APK, so app data is preserved.
It's also possible to run just the install.sh script:
./install.shPass --clean for a fresh install (uninstall + install).
Not yet implemented: settings screen, home-screen widgets, lyrics, theme switching, SAF filesystem browsing.
Timbra is free software licensed under the GNU General Public License v3.0 or later
(GPLv3+). See LICENSE for the full text.
It bundles third-party components under their own licenses — Apache-2.0 for the AndroidX, Media3/ExoPlayer, Material Components, Guava and kotlinx-coroutines libraries; and FFmpeg (via nextlib) under the LGPL/GPL. GPLv3 was chosen deliberately: Apache-2.0 is one-way compatible with GPLv3 but not with GPLv2.
Please consider donating to the Timbra project:



