Repository navigation
Mufify 1.4.5
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.4.5.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.
Upgrades in place from 1.3.0 onwards. Anything older than 1.3.0 was signed
with the debug key and has to be uninstalled first.
Since 1.4.4
Your listening history survives a reinstall
The statistics were never reset by an update — installing one release over
another keeps every row. What emptied them was anything that removed the app
first: an uninstall, a "clear data", or a build signed with a different key
that has to go before the next one can be installed. The history is the one
thing in the database that cannot be rebuilt by scanning, and it lived nowhere
else.
Now it also lives as a file in a folder the app does not own:
<your music folder>/.mufify/statistics.json, in the first folder you added
to the library — or one you choose for it in Settings › Statistics. It is
written twenty seconds after the last listen, once per session, and when the
app is swiped away. After a reinstall, add the folder again — you have to, to
see your music — and the history comes back on its own, rollups and hearts
included. Tracks are matched by file first and by tags second, so a rebuilt
media index does not lose them. There are buttons for the other cases:
Write now, Read back, Choose folder.
If you only ever used the device-wide Scan and never added a folder, there is
no folder to write to until you choose one. The Settings row says so.
ADR 027
has the reasoning.
Previous and next on the notification, and buttons that reach the app
The notification showed ten-second seek buttons and no track buttons, on every
Android version. The cause was two layers down: expo-audio declares its seek
buttons to the media session, and media3 then strips the skip actions from the
playback state that Bluetooth, the lock screen and Android's own media
controls read — so the commands the app had restored in 1.3.0 were advertised
and then edited out.
The session now declares no custom buttons at all. Android 13+ draws previous,
play/pause and next by itself; Android 12 and below get them as the
notification's own three buttons. Both roads end in the same place as a
remote's buttons. Every notification button is also a foreground-service
start now, which is allowed where a plain background start is refused — the
likeliest reason pause did nothing from the notification on some phones. And
the app asks for permanent audio focus, so pausing it no longer hands the
sound back to whatever was playing before.
Verified on Android 10 and 15 emulators, with the app in front and behind the
launcher, and with media key events — what a headset or a remote sends. Not
verified on MIUI itself; that is the check that remains.
ADR 026.
A fully custom notification layout was asked for and is not offered: Android
13+ ignores one, and below that every vendor draws the media template its own
way. What the app controls, it now controls.
One record under two spellings is one record
Statistics merged the spellings of an artist since 1.4.3. Albums are keyed by
name and artist, so the same record under "Linkin Park" and "LINKIN PARK"
was two albums, ranked separately. They are folded now, with one extra
condition the artists do not need: the artist has to agree, so two bands'
"Greatest Hits" stay two records.
What counts as the same song is your call
Duplicate hiding required title, artist and length to agree. There is now a
choice in Settings › Duplicates: Title only — the same name is the same
song, whatever the tags say, which is what a file copied twice looks like —
or Title, artist and length, the original rule. Title only is the default;
the cost of each is written on the option.
What it does
- Playback of local files, lossless first-class, gapless between tracks,
with background playback, lock-screen and notification controls, and a
persistent queue. - Bluetooth transport, including next and previous from a remote.
- Lyrics from the file or from a
.lrcbeside it, following the music when
they carry timestamps. - A ten-band equaliser with seven presets, every band adjustable, and
presets you can save and share as a line of text. - Five shuffle algorithms, each explained where you pick it.
- Local playlists with drag-reorder, a cover mosaic or a picture you framed
yourself, a library picker, liking, and search. - Liking for tracks, albums and playlists, with a filter for each.
- Deleting tracks and albums, through Android's own confirmation, with a
multi-select mode for doing several at once. - On-device listening statistics by week, month and year, with a Wrapped
summary — spellings of one artist or album count together — and a copy of
the history outside the app. - Turkish and English, dark and light.
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.4.5.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
- The APK is universal — every ABI in one file, which is why it is large. What
gets installed is a fraction of that. minSdkVersion26 (Android 8.0), targets 36.- The statistics file sits in a hidden folder inside your music folder. If you
sync that folder elsewhere, the file goes with it; the switch in Settings
turns the writing off. - Playlists are not in that file yet. They still go with the app's data.
- Gapless applies to a track ending naturally. Skipping reloads, by design.
- Ten equaliser bands need Android 9; below that the device's own bands are
used, usually five. - Deleting files needs Android 10. On Android 10 the system asks once per file.
- A
.lrcbeside a track is readable where the platform still allows a raw file
path: up to Android 12. From Android 13 the media permissions cover audio and
not a text file next to it, and the embedded lyrics are used instead.