An offline-only music player for Android. Plays the files a streaming service
will not — FLAC, ALAC, and whatever else is already on the phone — and shows you
what they actually are.
Install
Download mufify-1.0.3.apk below and open it on the phone. Android will ask
you to allow installing from this source; that is expected for an APK that did
not come from a store.
Upgrading from any earlier build works in place — this one's version code is
higher, so nothing needs uninstalling.
Since 1.0.2
A Bluetooth remote can change tracks. Play and pause worked from a headset
or a car; next and previous did nothing at all. The cause was not in this app:
expo-audio, the playback library, removes all four track-navigation commands
from its media session before anything can connect to it. That is a fair
decision for a library whose player holds one file and has never heard of a
queue — Mufify's queue lives in its own code, which is where shuffle, repeat
and the play/skip rule are. The commands are now restored, announced to the
app, and answered there. docs/adr/017 is the whole account, including the
part where the first patched build came out byte-identical because Expo ships
that library precompiled.
A slightly shorter gap between tracks, on some devices. Worth being precise
about, because it is not fixed: end of one track to first audio of the next
measured 72–79 ms before and 46–55 ms after on an emulator, and 285–314 ms
before against 269–292 ms after on a real phone. Almost all of that is inside
the playback library's own path for swapping files — measured, including a
preloading attempt that changed nothing, which is how we know it is not the
disk. Closing it properly means the queue moving into the audio engine, and the
one API expo-audio offers for that cannot drive a lock screen, so it would
cost the notification and background playback. Not a trade worth making today.
What it does
- Playback of local files, lossless first-class, with background playback,
lock-screen and notification controls, and a persistent queue. - Five shuffle algorithms, each explained where you pick it.
- Local playlists with drag-reorder and cover mosaics, plus liked songs.
- On-device listening statistics by week, month and year — top tracks,
artists, albums and playlists, with a Wrapped summary. - The technical truth of a file on a monospaced spec strip: container,
sample rate, bit depth, bitrate, channels, size. - Turkish and English, dark and light.
- A statistics switch, if you would rather it kept no history. Turning it
off stops new writes and leaves what is already recorded alone. - An animation speed setting — Normal, Fast, or Instant.
No network, and it is enforced
There is no network layer. Not a disabled one, not one behind a setting.
This release ships without the INTERNET permission — plugins/withOfflineOnly.js
strips it from the release manifest, so a change that introduces a network call
does not fail review, it fails to work. Check it yourself:
aapt2 dump permissions mufify-1.0.3.apk | grep INTERNET # prints nothingACCESS_NETWORK_STATE does survive, pulled in by a dependency. It cannot open a
connection — that needs INTERNET, which is absent — but Android renders it as
"view network connections", so it is worth naming rather than leaving you to
find it.
Worth knowing
- Signed with a debug key. Fine for sideloading, not fine for the Play
Store. It also means a future Play-signed build cannot replace this one
without uninstalling first. - The APK is universal — every ABI in one file, which is why it is ~128 MB. What
gets installed is a fraction of that. minSdkVersion26 (Android 8.0), targets 36.- No favourite button in the media notification:
expo-audiodoes not expose
MediaSession custom actions. The reasoning and the options are in
docs/adr/015.