Repository navigation
Releases: x1eddy/tunebox
Release list
TuneBox 0.9.1
Two small fixes on top of 0.9.0:
- Adding a song to a playlist now says so ("Added to …") instead of closing silently.
- A video YouTube refuses for good (age-restricted, private, removed) is no longer retried and re-reported on every launch.
Downloads
| Android | android-TuneBox-0.9.1.apk — universal, same signing key as before |
| iPhone | iphone-TuneBox-0.9.1.ipa — unsigned; sign with your own Apple ID via AltStore/SideStore or Xcode (attached by CI shortly after) |
| Linux | linux-TuneBox-0.9.1.tar.gz — extract and run ./install.sh (needs libmpv) |
TuneBox 0.9.0 — the polish pass
A polish pass
The app was fast to build; this release is about making it feel finished.
States that no longer feel broken
- Home keeps its shelves while it refreshes (no skeleton flash when you like a song) and shows a calm retry card when YouTube can't be reached.
- Search shows placeholder rows while loading, keeps the clear button reachable, remembers your recent searches (with per-item remove and Clear) and offers a retry.
- Library shows a loading skeleton instead of "Nothing here yet"; the sort row only appears where sorting means something, and your choice is remembered.
Player
- Play/pause morphs, with a loading ring while a song starts (also on the mini-player).
- Seek bar: time bubble while dragging, no snap-back, steady digits.
- Title cross-fades on track change; "Playing from" shows the real source.
- Mini-player: swipe left/right for next/previous, swipe down to dismiss.
- Haptics on play/pause, skip, seek, reorder and long-press (respects the setting and Reduce motion).
Queue and playlists
- Queue: Clear (keeps the playing song), undo on remove and clear, opens on the current song, stable drag handles.
- Playlists: rename, delete with undo, swipe a song out with undo.
Everywhere
- Tooltips and screen-reader labels on controls; song-row menus are 48 dp targets.
- Bottom sheets open above the navigation bar.
- Plurals fixed ("1 song"), text-size clamp fixed.
- ~210 more strings translated (de, es, fr, it, nl, pl, pt); other languages fall back to English for them.
- Wide windows: side navigation rail, centred content, a phone-shaped player, and shortcuts (Ctrl+N/P next/previous,
/or Ctrl+K search, media keys).
Downloads
| Android | android-TuneBox-0.9.0.apk — universal, same signing key as before, installs straight over older versions (the app also offers it by itself) |
| iPhone | iphone-TuneBox-0.9.0.ipa — unsigned; sign with your own Apple ID via AltStore/SideStore or Xcode (attached by CI shortly after) |
| Linux | linux-TuneBox-0.9.0.tar.gz — extract and run ./install.sh (needs libmpv) |
TuneBox 0.7.0 — 85 languages with search, smoother feel, faster search
85 languages, with a search box
Settings → Language now lists every language Flutter ships system strings for
(77 new ones, right-to-left included) and has a search box that understands
native names, English names and codes. The first eight are carefully
translated; the rest are machine translations — corrections are welcome. Any
missing string falls back to English.
Also in this release (0.6.1 – 0.7.0)
- Smoother, iOS-style feel: rubber-band scrolling, push transitions with
edge-swipe back, springy taps. Reduce motion switches all of it off. - Faster search: instant local matches while typing, repeat searches are
cached, and the connection to YouTube Music is kept warm. - Tabs start at the top when you switch to them.
- Lighter on RAM on phones (smaller picture cache, GPU cache capped,
caches dropped in the background). - Downloads try other formats and fresh links when YouTube answers 403, and
show the reason when one fails. - Navigation labels shrink so long words fit.
Downloads
| Android | android-TuneBox-0.7.0.apk — universal, same signing key as before, installs straight over older versions |
| iPhone | iphone-TuneBox-0.7.0.ipa — unsigned; sign with your own Apple ID via AltStore/SideStore or Xcode (attached by CI shortly after) |
| Linux | linux-TuneBox-0.7.0.tar.gz — extract and run ./install.sh (needs libmpv) |
TuneBox 0.6.0 — profiles, a faster training round, taste transfer that works
Profiles
Each listener now has their own library, likes, playlists and learned taste.
Tap the avatar on Home (or the profile row at the top of Settings) to switch,
add, rename or delete a profile. Your existing library is the first profile,
so nothing moves.
Faster training round
The first cards now come straight from your library, so the round opens
immediately; the cards from YouTube are added behind them while you swipe.
Taste transfer that works
- Send uses the system's "save as" dialog, so you choose where the file
goes (Downloads, a USB stick, a chat) instead of a hidden app folder. - Load always asks which file to use. It used to quietly re-read an old
copy, and it merged one row at a time, which took minutes. - Merging is now one fast transaction and safe to repeat — importing the
same file twice no longer doubles your weights and plays.
Playback and downloads
- Skip silence now takes effect the moment you flip it (it was only read at
launch). With it on, music can jump or sound sped up — it is off by default. - Streams and downloads prefer AAC (m4a) over Opus/WebM, which glitched on
some phones. Old WebM downloads are replaced in the background on Wi-Fi. - A stream that drops half way resumes at the exact byte instead of skipping.
- Downloads are written to a temporary file first, size-checked, and a like
made off Wi-Fi is downloaded when Wi-Fi returns. Short songs go first.
The AI
- Reposts, slowed/sped-up edits and mixes no longer teach it that you like the
uploader: it credits the real artist, or no artist for a mix. - Mixes and anonymous re-uploads are never auto-downloaded by the AI.
Smaller things
- Settings is a tab next to Your taste.
- Messages close themselves after 10 seconds.
- "Not for me" → Undo puts the heart back.
- Search results show the album properly for songs with several artists.
Downloads
| Android | android-TuneBox-0.6.0.apk — universal, same signing key as 0.3.0–0.5.0, installs straight over them |
| iPhone | iphone-TuneBox-0.6.0.ipa — unsigned; sign it with your own Apple ID via AltStore/SideStore or Xcode (attached by CI shortly after) |
| Linux | linux-TuneBox-0.6.0.tar.gz — extract and run ./install.sh (needs libmpv) |
TuneBox 0.5.0 — it keeps itself up to date
Three bugs that were quietly breaking things
- "Pick up where I left off" never worked.
just_audio'splay()returns
a future that only completes when the track finishes, so awaiting it
parked everything after it — including the snapshot that resume reads — until
the song ended. Close the app mid-song and the queue is back, paused, where
you left it. - "Keep the music going" could never fire. Repeat-all was on by default, so
the queue looped forever and never ran out; the radio hand-off was
unreachable. Repeat now starts off, which is what makes the setting mean
anything. - The navigation bar clipped "Your taste" past about 130% text size. The
bar clamps its own scaling now while the rest of the app still grows to 160%.
It updates itself
Every three hours TuneBox asks this page whether there is a newer release. The
check is a couple of kilobytes and says nothing when there is nothing to say;
when there is, the download happens in the background on Wi-Fi. The only thing
you see is a row in Settings: "Update to 0.6.0 is ready — tap to install".
Installing still asks for your confirmation, on purpose — Android always does,
and an app that could replace itself without asking would be hard to tell from
malware. It can be switched off in Settings → Updates.
Files that say what they are
Assets are named android-, iphone- and linux- so it is obvious at a
glance which one you want — on every past release too, not just this one.
Downloads
| Android | android-TuneBox-0.5.0.apk — universal, signed with the same key as 0.3.0 and 0.4.0, so it installs straight over them |
| iPhone | iphone-TuneBox-0.5.0.ipa — unsigned; sign it with your own Apple ID via AltStore/SideStore or Xcode |
| Linux | linux-TuneBox-0.5.0.tar.gz — extract and run ./install.sh (needs libmpv) |
TuneBox 0.4.0 — eight languages, accessibility, and playback that keeps itself going
Languages
English, Deutsch, Español, Français, Italiano, Nederlands, Polski,
Português — around 260 strings each, picked in Settings → Language or left
to follow the system. The AI's own sentences are translated too, not just the
buttons: "Because you played X", "Liked, last played 8 months ago", and the
summary of what it thinks you like.
Accessibility
- Text size — multiplies your system setting rather than replacing it
- Reduce motion — stops the equalizer bars, the visualiser and page
transitions - High contrast — Material 3's own high-contrast palette plus visible
outlines - Bold text
Playback, all on by default
- Keep the music going — when the queue runs out, a radio built from the
last song carries on instead of silence - Smart shuffle — weighted by the taste model, so favourites drift forward
while the order still changes every time - Pick up where I left off — the queue comes back, paused, on the next
launch - Data saver off Wi-Fi — streams and downloads cap at 128 kbps on mobile
data - Haptics on like, dislike and skip; recommendation reasons can be hidden
Training round
The training card now sits under the confidence score instead of at the bottom
of the page. Verdicts are held until the round finishes, so leaving part-way
really does discard it — and leaving asks first, naming how many songs are at
stake.
TuneBox 0.3.0 — now on iPhone, and properly signed on Android
iPhone
TuneBox now builds for iOS, from the same code as Android and Linux.
TuneBox-0.3.0-unsigned.ipa (attached by CI shortly after this release is
created) is an unsigned build you sign with your own free Apple ID using
SideStore, AltStore or Xcode.
On a free Apple ID it needs re-signing every 7 days, which those tools do for
you. Requires iOS 15 or newer.
Music lands on an iPhone through the Files app: TuneBox appears under
On My iPhone, and anything you drop there can be imported.
Android: a real signature
Every previous APK was signed with the debug key every Android toolchain
generates (CN=Android Debug) and carried only a v2 signature. That is one of
the clearest hints Play Protect has that an app is a throwaway test build.
From 0.3.0 the APK is signed with a 4096-bit key with a real identity and
v1/v2/v3 signatures:
CN=x1eddy, OU=TuneBox, O=TuneBox
SHA-256 B7:DD:73:CD:77:8A:3A:38:1B:9E:2E:09:21:02:AE:AD:7E:0D:2B:FD:10:A1:9E:21:D4:CF:82:4A:36:5B:85:44
Verify any APK before installing it: apksigner verify --print-certs <file>.
Upgrading from 0.2.7 or earlier: Android refuses to replace an app when the
signing key changes, so you have to uninstall the old one first. Export your
taste from Settings before you do — it carries your likes, play counts and
everything the AI learned. Downloaded audio has to be fetched again.
Android will still ask permission to install from an unknown source, and may
note that it has not seen the app before. That is reputation, not a verdict:
no app installed outside the Play Store has any. The permission list is the
thing worth reading, and it is short — internet, playback, notifications, and
audio files only if you import your own music.
Also in this build
- iOS: background audio, Files-app import, an ATS exception for the in-app
audio proxy, opaque icons and a dark launch screen - CI builds and tests all three platforms on every push
TuneBox 0.2.7
First public build. Music from YouTube and from your own files, with a recommender that runs entirely on your device.
Download
Android 7.0+ — TuneBox-0.2.7.apk (universal: arm64, arm32, x86_64).
Open it on the phone and allow "install unknown apps" when Android asks. It is
not from the Play Store, so that warning is expected.
Linux x86_64 — TuneBox-0.2.7-linux-x64.tar.gz. Extract and run
./install.sh; it installs into $HOME only, no root. Sound needs libmpv
(sudo apt install libmpv2, sudo dnf install mpv-libs, or
sudo pacman -S mpv).
In this build
- Search goes to YouTube Music, so a music query can no longer come back with
livestreams and sports - The release year shows under every song
- Playback survives spam-tapping: the newest tap always wins
- Playlists no longer keep entries for deleted songs, and "clean up missing
files" cannot wipe an imported library when a card is unmounted - Retrain runs as one batched write instead of thousands
- Asks for the notification permission Android 13+ requires, so the playback
notification actually appears
Everything the app learns stays on the device. No account, no server.