Mufify 1.0.0
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.0.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 0.1.0 works in place — this build's version code is higher, so
nothing needs uninstalling.
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.
Since 0.1.0
- The app has its own icon and splash screen.
- Importing a folder indexes that folder, instead of adding it and then
sweeping the entire device. - Pull-to-refresh is gone from the library. It ran a full rescan — a minute
of work started by the gesture people make to get back to the top of a list.
Scanning is the button that says what it costs. - Now Playing no longer draws through the queue. Two stacked full-screen
sheets were compositing in the wrong order, which put the spec strip and the
track duration in front of the queue's rows and turned the rows behind them
black. - Bottom sheets clear the navigation bar. The long-press actions and the
track-info sheet had their last row behind the system buttons. - Played entries in the queue are dimmed once, rather than three different
ways that read as a shadow. - The queue opens with the same tuned spring as Now Playing, and its rows are
ready before the sheet finishes arriving. - The media notification carries artist and album, and the app's own artwork
placeholder when a track has no cover. - A listen is counted against the duration the player reports, not the one the
scanner stored. A track MediaStore had not finished reading counted as no
plays at all.
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.0.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.